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

时间:2010-10-07 07:53:35

标签: c# sql-server ado.net

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

3 个答案:

答案 0 :(得分:4)

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

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

要注意的关键部分是bulkcopy.WriteToServer( SourceTable ); SourceTable是您传递给它的DataSet的一部分

//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();
   }
}

答案 1 :(得分:3)

虽然SqlBulkCopy适用于批量插入,但您无法进行批量更新。这可能是也可能不是您的问题,但无论如何您可以使用利用OPENXML的存储过程来允许批量插入和更新。您还需要sp_xml_preparedocumentsp_xml_removedocument

此方法的另一个巨大优势是,您可以使用OUTPUT子句获取批量插入的实体的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

答案 2 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/bb510489.aspx