Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数组/数据表之类的变量传递给SQL server?_C#_Sql_Sql Server - Fatal编程技术网

C# 如何将数组/数据表之类的变量传递给SQL server?

C# 如何将数组/数据表之类的变量传递给SQL server?,c#,sql,sql-server,C#,Sql,Sql Server,有时,您需要使用datatable中的许多行或一个充满数据的数组来升级数据库,而不是将所有这些数据放在一个字符串中,然后在SQL SERVER中拆分,或者不是在代码中逐行迭代datatable并更新数据库,还有其他方法吗?除了SQL SERVER 2005中的传统变量之外,还有其他类型的变量吗?有几种方法可以做到这一点 如果只是插入行,那么我将创建一个包含信息的DataTable对象,然后使用SqlBulkCopy对象: SqlBulkCopy copier = new SqlBulkCopy(

有时,您需要使用datatable中的许多行或一个充满数据的数组来升级数据库,而不是将所有这些数据放在一个字符串中,然后在SQL SERVER中拆分,或者不是在代码中逐行迭代datatable并更新数据库,还有其他方法吗?除了SQL SERVER 2005中的传统变量之外,还有其他类型的变量吗?

有几种方法可以做到这一点

如果只是插入行,那么我将创建一个包含信息的DataTable对象,然后使用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>'