要构建动态查询,我正在编写一些像这样的代码
StringBuilder sql = new StringBuilder();
sql.Append("SELECT ... all your columns ... FROM yourTable");
List<SqlParameter> parameters = new List<SqlParameter>();
if (!string.IsNullOrEmpty(paraCategory))
{
sql.Append("[Category]=@Category,");
parameters.AddWithvalue("@Category", paraCategory);
}
sql.Length -= 1;
sql.Append("ORDER BY CreatedDate");
ds = SqlHelper.ExecuteDataset(GlobalSettings.DbDSN, CommandType.Text, sql.ToString(), parameters);
现在它会抛出这样的错误
Error 1 'System.Collections.Generic.List<System.Data.SqlClient.SqlParameter>' does not contain a definition for 'AddWithvalue' and no extension method 'AddWithvalue' accepting a first argument of type 'System.Collections.Generic.List<System.Data.SqlClient.SqlParameter>' could be found (are you missing a using directive or an assembly reference?)
Error 2 The best overloaded method match for 'Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteDataset(string, System.Data.CommandType, string, params System.Data.SqlClient.SqlParameter[])' has some invalid arguments
Error 3 Argument 4: cannot convert from 'System.Collections.Generic.List<System.Data.SqlClient.SqlParameter>' to 'System.Data.SqlClient.SqlParameter[]'
我不确定我现在需要做什么..请伸出援助之手/
答案 0 :(得分:2)
错误1:
您需要在列表中添加参数,如:
parameters.Add(new SqlParameter("@Category", paraCategory));
错误2和3
您的方法SqlHelper.ExecuteDataset
似乎将数组作为SqlParameters的输入,目前您将其作为List
传递,最后只添加.ToArray()
。
ds = SqlHelper.ExecuteDataset(
GlobalSettings.DbDSN,
CommandType.Text,
sql.ToString(),
parameters.ToArray()); //right here
答案 1 :(得分:1)
更改行
parameters.AddWithvalue("@Category", paraCategory);
类似
parameters.Add( new SqlParameter("@Category", paraCategory));
答案 2 :(得分:1)
AddWithValue
是SqlParameterCollection
的一种方法。难怪编译器抱怨在List<SqlParameter>
上使用它。
话虽如此,请注意使用开箱即用的AddWithValue
是一个巨大的反模式。它会导致SQL Server引擎中出现非常严重的性能问题。有关详细信息,请参阅How Data Access Code Affects Database Performance。对于记录,使用new SqlParameter("@name", value)
会遇到完全相同的问题。阅读文章。