我想知道(在下面的代码中),我确保dataID是下面传递的参数中的文本(或varchar或int)?
public T ExecuteQuery<T>(Func<IDataReader, T> getResult, string query, params IDataParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(this.DefaultConnectionString))
{
conn.Open();
// Declare the parameter in the query string
using (SqlCommand command = new SqlCommand(query, conn))
{
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
}
command.Prepare();
using (SqlDataReader dr = command.ExecuteReader())
{
return getResult(dr);
}
}
}
}
public string GetMySpecId(string dataId)
{
return ExecuteQuery(
dr =>
{
if (dr.Read())
{
return dr[0].ToString();
}
return string.Empty;
},
"select specId from MyTable where dataId = @dataId",
new SqlParameter("dataId", dataId));
}
我习惯于这样编码:
command.Parameters.Add(new SqlParameter("key", SqlDbType.Text));
command.Prepare();
command.Parameters[0].Value = dataId;
如何在顶部的代码中将两个或多个参数传递给ExecuteQuery?
答案 0 :(得分:2)
ExecuteQuery
已经有多个参数。它是ParamArray
,这意味着它需要任意数量的参数并将它们转换为数组。
例如,如果我有这样的函数:
public int Sum(params int[] numbersToSum) { ... }
我可以这样称呼它:
Sum(1, 2, 5, 6, 1)
在您的情况下,您可以这样称呼它:
ExecuteQuery(
dr => { //snip },
query,
new SqlParameter("dataId", dataId),
new SqlParameter("anotherParm", parm2),
new SqlParameter("anotherParm", parm3),
... );
答案 1 :(得分:1)
代码使用params
关键字,因此您似乎应该编写其他转义SQL并将参数附加到方法的末尾。以下是使用代码作为基础的示例。
该链接提供了更全面的解释,但params
使得您可以在方法签名结尾处拥有可变数量的参数(只要它们是相同的类型)。它将落在此params
变量中的所有最终参数放入数组中。
return ExecuteQuery(
dr =>
{
if (dr.Read())
{
return dr[0].ToString();
}
return string.Empty;
},
"select specId from MyTable where dataId = @dataId and somethingelse = @else",
new SqlParameter("dataId", dataId),
new SqlParameter("else", elseVar);