我在一个没有编写参数化 Sql 查询的应用程序中。下面是代码块
public List<MyClass> GetData(int Id, IEnumerable<string> state)
{
using (var dataContext = new DataContext(_connectionString))
{
var query = new StringBuilder("SELECT * FROM table");
query.Append(" Id = ");
query.Append(Id);
query.Append(" AND state IN ('");
query.Append(string.Join("','", state));
query.Append("')");
return dataContext.ExecuteQuery<MyClass>(query.ToString()).ToList();
}
我正在使用参数化查询重构代码,如下所示:
public List<MyClass> GetData(int Id, IEnumerable<string> state)
{
using (var dataContext = new DataContext(_connectionString))
{
var statestring = new StringBuilder("'");
statestring.Append(string.Join("','", state));
statestring.Append("'");
string myStates= statestring.ToString();
string query = "SELECT * FROM table WHERE Id ={0} AND state IN ({1})";
return dataContext.ExecuteQuery<MyClass>(query, new object[] {Id, myStates}).ToList();
}
}
我没有得到有关运行此查询的数据。在调试时,我发现我的查询是这样形成的
SELECT * FROM table WHERE Id ={0} AND state IN ({1}) where in ({1})
对于状态,我将数据视为“'错误'、'警告'”。在 sql server 中,我像这样运行查询
SELECT * FROM table WHERE Id =34 AND state IN ('error','warning').
我需要删除 mystate 周围的“”吗?我尝试使用修剪方法删除 " 并将其分配回字符串,但它没有用。我仍然可以看到双引号。
myStates = myStates.trim('"');
如何在不使用任何字符串生成器的情况下更好地参数化我的查询
要参数化 in 子句,每个 case 都必须是一个单独的参数。所以 in 子句必须反映这一点。
看到这个类似的问题:How to pass sqlparameter to IN()?
public List<MyClass> GetData(int Id, IEnumerable<string> state)
{
using (var dataContext = new DataContext(_connectionString))
{
var stateParameterNumbers = Enumerable.Range(1, state.Count())
.Select(i => string.Format("{{{0}}}", i));
var stateParameterString = string.Join(",", stateParameterNumbers);
string query = "SELECT * FROM table WHERE Id ={0} AND state IN (" + stateParameterString + ")";
return dataContext.ExecuteQuery<MyClass>(query, new object[] { Id }.Concat(state).ToArray()).ToList();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句