c# - 在 SQL Server 2008 中处理来自 c# 的多个数据库更新

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

我想找到一种方法来处理对 sql 数据库的多次更新(一次数据库往返)。我在 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 发送多个更新(和插入)?

最佳答案

是的,您需要创建类型。

备选方案是发送一个大字符串 sql 批处理或将 XML 传递给存储过程。

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

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

TVP 似乎是执行此操作的方法。我们的项目刚刚转换为使用 TVP。

希望对您有所帮助。

关于c# - 在 SQL Server 2008 中处理来自 c# 的多个数据库更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545998/

相关文章:

java - 如何使用 Java(和 SQL Server)中的 Statement.execute() 更改数据库架构?

MYSQL 查询转换为 SQL SERVER

c# - 是否有 C# 不区分大小写的等于运算符?

c# - 将 LINQ 查询转换为列表

c# - 如何在 C# 中获取两个字节并将它们组合成一个 UInt16?

.net - 将多个参数传递给多个线程

c# - 尝试 Response.Redirect 的正确方法是什么?

c# - 如何查看 winform 在运行时的样子?

c# - 互操作后 Excel 进程保持打开状态;传统方法行不通

mysql - 如果我们通过代码管理唯一性和自动增量,为什么要使用主键?