【问题标题】:Handle multiple db updates from c# in SQL Server 2008在 SQL Server 2008 中处理来自 c# 的多个数据库更新
【发布时间】:2011-09-25 14:04:15
【问题描述】:

我喜欢找到一种方法来处理对 sql db 的多次更新(一次 db 往返)。我阅读了 SQL Server 2008 http://www.codeproject.com/KB/database/TableValueParameters.aspx 中的表值参数,这似乎非常有用。但似乎我需要创建一个存储过程和一个表类型来使用它。真的吗?也许是因为安全?我想像这样运行文本查询:

var sql = "INSERT INTO Note (UserId, note) SELECT * FROM @myDataTable";
var myDataTable = ... some System.Data.DataTable ...
var cmd = new System.Data.SqlClient.SqlCommand(sql, conn);
var param = cmd.Parameters.Add("@myDataTable", System.Data.SqlDbType.Structured);
param.Value=myDataTable;
cmd.ExecuteNonQuery();

所以

A) 我是否必须同时创建存储过程和表类型才能使用 TVP?和
B) 推荐什么替代方法向 SQL Server 发送多个更新(和插入)?

【问题讨论】:

  • A) 是的。 B) 替代方案:XML、[n]varchar(size) 字符串 + 解析。我的选择是 TVP。
  • 好的,也谢谢你:)
  • 这在什么时候不值得为避免几次访问数据库而付出努力?
  • Jeff - 我想知道它的成本是多少(另一个问题?)。目前,这是一种预感 + 更重要的是一种似乎已被普遍接受的做法,来自 MS P&P “往返会显着影响性能。它们受网络延迟和下游服务器延迟的影响。许多数据驱动的网站大量访问数据库“ msdn.microsoft.com/en-us/library/ff647768.aspx

标签: c# .net sql-server sql-server-2008 table-valued-parameters


【解决方案1】:

是的,您需要创建类型。

替代方案正在发送大字符串 sql 批处理或将 XML 传递给 sprocs。

大 sql 字符串批处理的缺点是它可能会破坏 sql proc 缓存并可能导致 sql 重新编译 - 特别是如果批处理是唯一的,因为输入数据是该大字符串的一部分。根据定义,每个批次都是唯一的。

XML 是 TVP 之前的主要替代方案。 XML 的一个缺点,至少在一段时间内,sql azure 不支持它(可能会改变?)所以它限制了你的选择。

TVP 似乎是做到这一点的方法。我们的项目刚刚转换为使用 TVP。

希望对您有所帮助。

【讨论】:

  • 好的,非常感谢。这就是我喜欢SO的原因。在我提出问题后的 1 小时内给出真实世界的体验答案。我制作了表格类型和存储过程,现在可以轻松进行多次更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2013-06-09
  • 2011-10-08
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多