@ Micha-kun向我指出了一个很好的例子,说明如何使用没有参数或直接的SQL查询来执行存储过程。但是,如果我需要做3个没有参数的存储过程2和1个带参数的存储过程怎么办?
private Task LoadDataAsync()
{
var t1 = ExecuteQueryAsync(databaseConnection, "exec FirstGraders ");
var t2 = ExecuteQueryAsync(databaseConnection, "exec SecondGraders ");
var t3 = ExecuteQueryAsync(databaseConnection, "exec ThirdGraders ");
return Task.Factory.ContinueWhenAll(new[] { t1, t2, t3 }, _ => {
gv1.DataSource = t1.Result;
gv1.DataBind();
gv2.DataSource = t2.Result;
gv2.DataBind();
gv3.DataSource = t3.Result;
gv3.DataBind();
});
}
所以在上面的示例中,假设存储的proc exec ThirdGraders
接受@teacher
的字符串(sql server中的varchar)参数 - 我是否仍然可以使用{{1}给出的工作示例3}}只将参数添加到1个存储过程?
答案 0 :(得分:0)
你尝试过这样的事吗?
private Task<DataSet> ExecuteSqlQueryAsync(string connectionString, string sqlQuery, Dictionary<string, object> parameters = null)
{
return Task.Factory.StartNew(
() =>
{
try
{
connstring = System.Configuration.ConfigurationManager.AppSettings[connectionString].ToString();
dbconn = new SqlConnection(connstring);
cm = new SqlCommand(sqlQuery, dbconn);
dbconn.Open();
cm.CommandTimeout = 0;
if (params != null) {
foreach(var pair in parameters)
{
cm.Parameters.AddWithValue(pair.Key, pair.Value);
}
}
datasetttt = new DataSet();
da = new SqlDataAdapter(cm);
da.Fill(datasetttt, "Data");
return datasetttt;
}
catch (Exception exception) { throw exception; }
finally
{
dbconn.Close();
cm.Dispose();
da.Dispose();
}
});
}
我还没试过这段代码。如果失败,修复滋扰。然后在你的代码中你可以使用这样的东西:
var t1 = ExecuteSqlQueryAsync(cnx, "SELECT * FROM SomeTable"); // Without params
var t2 = ExecuteSqlQueryAsync(
cnx,
"SELECT * FROM SomeTable WHERE Property1 = @Value",
new Dictionary<string, object>
{
{"@Value", 12}
}); // With params