【发布时间】:2011-05-20 17:22:44
【问题描述】:
我有很多遗留数据访问代码,主要是带有存储过程调用的 SqlCommand,我们使用这些代码将大量插入语句执行到数据库中。 只要 SQL 服务器与应用程序在同一台机器上,性能就可以接受,但现在我们正试图将一些数据移动到 SQL Azure。
问题在于,我们的代码为要插入的每条记录调用一个 SP,这导致访问数据库的次数很多,并且当不在同一台服务器上时,它需要一些时间。
var conn = new SqlConnection("connString")
var cmd = new SqlCommand(conn, "spMyStoreProc");
cmd.Params.Add("@a", SqlDbType.VarChar, 10);
cmd.Params.Add("@b", SqlDbType.Int);
using(conn)
{
conn.Open();
foreach(var rec in recordsToInsert)
{
cmd.Parameters["@a"].Value = rec.A;
cmd.Parameters["@b"].Value = rec.B;
cmd.ExecuteNonQuery();
}
conn.Close();
}
我已经尝试了上面的代码有和没有事务。
我还尝试使用“批处理”SQL 语句在每次访问服务器时执行多个 SP。 像这样:
var cmd = new SqlCommand(conn);
cmd.CommandText = "EXEC spMyStoreProc @a='a' @b=2; EXEC spMyStoreProc @a='b' @b=4;"
它极大地提高了操作的性能,但是由于我有很多 SP,每个 SP 大约有 20-50 个参数,因此为该数据访问组件中的所有插入命令编写此代码非常繁琐。
这是实现这一目标的最佳方法,还是我可以以某种方式告诉 ADO.NET 我想以批处理的形式执行我的调用(没有找到任何暗示它可能但我觉得我至少应该问的东西)以避免网络延迟等每个 SP 调用?
如果没有人知道任何无需“手工”编写的好方法来实现这一点,而且由于它是一个遗留应用程序,我无法完全更改数据层。 是否有任何应用程序可以使用带参数的 SqlCommands 并生成它们将执行的 TQL?
提前致谢
【问题讨论】:
标签: sql-server tsql ado.net azure-sql-database