Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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 2005?_C#_Sql Server_Ado.net - Fatal编程技术网

C# 如何使用单个查询将数据集中的多条记录插入SQL Server 2005?

C# 如何使用单个查询将数据集中的多条记录插入SQL Server 2005?,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我在ADO.NET中有一个数据集,其中包含来自用户端的多条记录。我需要在单个查询中将所有这些行插入到数据库中,以避免多个查询也许像大容量拷贝这样的东西就是答案。下面的代码项目中的示例演示了如何使用DataTable进行此操作,但您应该能够更改示例以使用DataSet 下面是代码的一小部分,涵盖了SQL Server中的连接和执行(摘自) 需要注意的关键部分是bulkcopy.WriteToServer(SourceTable);如果SourceTable是要传递给它的数据集的一部分 //Firs

我在ADO.NET中有一个数据集,其中包含来自用户端的多条记录。我需要在单个查询中将所有这些行插入到数据库中,以避免多个查询

也许像大容量拷贝这样的东西就是答案。下面的代码项目中的示例演示了如何使用DataTable进行此操作,但您应该能够更改示例以使用DataSet

下面是代码的一小部分,涵盖了SQL Server中的连接和执行(摘自)

需要注意的关键部分是bulkcopy.WriteToServer(SourceTable);如果SourceTable是要传递给它的数据集的一部分

//First create a connection string to destination database
string connectionString;
connectionString = <EM>YourConnectionString</EM>and
    Initial Catalog=TestSMODatabase";

//Open a connection with destination database;
using (SqlConnection connection = 
       new SqlConnection(connectionString))
{
   connection.Open();

   //Open bulkcopy connection.
   using (SqlBulkCopy bulkcopy = new SqlBulkCopy(connection))
   {
    //Set destination table name
    //to table previously created.
    bulkcopy.DestinationTableName = "dbo.TestTable";

    try
    {
       bulkcopy.WriteToServer(SourceTable); // SourceTable would come from your DataSet
    }
    catch (Exception ex)
    {
       Console.WriteLine(ex.Message);
    }

    connection.Close();
   }
}
//首先创建到目标数据库的连接字符串
字符串连接字符串;
connectionString=您的connectionString和
初始目录=TestSMODatabase”;
//打开与目标数据库的连接;
使用(SqlConnection连接=
新的SqlConnection(connectionString))
{
connection.Open();
//打开批量复制连接。
使用(SqlBulkCopy-bulkcopy=newsqlbulkcopy(连接))
{
//设置目标表名称
//到以前创建的表。
bulkcopy.DestinationTableName=“dbo.TestTable”;
尝试
{
bulkcopy.WriteToServer(SourceTable);//SourceTable将来自您的数据集
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
connection.Close();
}
}

虽然
SqlBulkCopy
适用于批量插入,但您不能执行批量更新。这可能是您的问题,也可能不是您的问题,但在任何情况下,您都可以使用存储过程来允许批量插入和更新。您还需要和

此方法的另一个巨大优点是,可以使用子句获取刚刚批量插入的实体的ID

批量插入的示例。

假设您在定义要插入或更新的数据的存储过程上定义了参数
@p_XmlData VARCHAR(MAX)
。对于需要传入的XML示例,您可以执行以下操作:

SELECT TOP 1 *, 0 AS __ORDERBY FROM dbo.YourEntity AS YourEntity FOR XML AUTO, ROOT('ROOT')
然后存储过程将如下所示

DECLARE @hDoc INT
EXEC sp_xml_preparedocument @hDoc OUTPUT, @p_XmlData

INSERT INTO dbo.YourEntity
(
        [Field1],
        [Field2]
)
SELECT
        XMLData.Field1,
        XMLData.Field2
FROM OPENXML (@hdoc, 'ROOT/YourEntity', 1)
WITH
(
        [Field1] int,
        [Field2] varchar(50),
        [__ORDERBY] int
) AS XMLData

EXEC sp_xml_removedocument @hDoc

我建议您使用表值参数将数据表从数据集发送到存储过程。然后,您可以执行一条insert语句,用数据集记录填充数据库


设置适当的BatchSize并使用SqlBulkCopyOptions.TableLock可能会产生更好的性能。请针对您的场景进行测试。有关详细分析,请参阅。@Winston-感谢我的答案+1上有用的linkNice扩展