C# 如何将数组/数据表之类的变量传递给SQL server?
有时,您需要使用datatable中的许多行或一个充满数据的数组来升级数据库,而不是将所有这些数据放在一个字符串中,然后在SQL SERVER中拆分,或者不是在代码中逐行迭代datatable并更新数据库,还有其他方法吗?除了SQL SERVER 2005中的传统变量之外,还有其他类型的变量吗?有几种方法可以做到这一点 如果只是插入行,那么我将创建一个包含信息的DataTable对象,然后使用SqlBulkCopy对象:C# 如何将数组/数据表之类的变量传递给SQL server?,c#,sql,sql-server,C#,Sql,Sql Server,有时,您需要使用datatable中的许多行或一个充满数据的数组来升级数据库,而不是将所有这些数据放在一个字符串中,然后在SQL SERVER中拆分,或者不是在代码中逐行迭代datatable并更新数据库,还有其他方法吗?除了SQL SERVER 2005中的传统变量之外,还有其他类型的变量吗?有几种方法可以做到这一点 如果只是插入行,那么我将创建一个包含信息的DataTable对象,然后使用SqlBulkCopy对象: SqlBulkCopy copier = new SqlBulkCopy(
SqlBulkCopy copier = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default);
copier.BatchSize = 500; //# of rows to insert at a time
copier.DestinationTableName = "dbo.MyTable";
copier.WriteToServer(myDataTable);
另一种选择是将数据包装为xml(不管您想怎么做),并使用sql 2005“xml”数据类型将其发送到存储过程(它可以执行您需要它执行的任何操作)我同意John的观点,即
SqlBulkCopy
或sqlxml是sql Server 2005中的最佳选择;请注意,在SQLServer2008中也有,这是值得考虑的;尤其是和新的混合时
请注意,如果您使用SqlBulkCopy
,我强烈建议只批量插入到暂存表,即仅用于导入的单独表;然后运行存储过程将数据移动到活动表。通过这种方式,您可以获得正确的日志记录,并且在运行SP时,您可以在数据库中有一个范围严格的事务(即,您不需要跨所有网络IO的事务)
另一点;如果您正在处理大量数据,您可能不希望必须加载
数据表
(因为这迫使您首先缓冲内存中的所有数据);作为替代方案,也可以编写自己的IDataReader
,从流(如文件等)中提取数据;请参见SimpleDataReader
SqlBulkCopy
将非常高兴地接受来自IDataReader的数据。John提到使用XML。。。这就是我在您的情况下使用的方法(SQLServer2005,并为您创建一个处理SQL的存储过程)
下面是一个如何开始的示例(这只是一个select语句,但如果需要,可以将其作为更新):
创建过程MySproc(@Accounts XML)
作为
挑选
Accounts.AccountID.query('.'))
从…起
@Accounts.nodes('//ID/text()')作为Accounts(AccountID)
去
执行MySproc“123456”
CREATE PROCEDURE MySproc ( @Accounts XML )
AS
SELECT
Accounts.AccountID.query('.')
FROM
@Accounts.nodes('//ID/text()') AS Accounts(AccountID)
GO
EXEC MySproc '<Accounts><ID>123</ID><ID>456</ID></Accounts>'