【问题标题】:How can I use single query to insert multiple records from Dataset into SQL Server 2005?如何使用单个查询将数据集中的多条记录插入 SQL Server 2005?
【发布时间】:2010-10-07 07:53:35
【问题描述】:

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

【问题讨论】:

    标签: c# sql-server ado.net


    【解决方案1】:

    也许像批量复制这样的东西会是一个答案。下面代码项目中的示例展示了如何使用 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();
       }
    }
    

    【讨论】:

    【解决方案2】:

    虽然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
    

    【讨论】:

    • 我的回答不错的扩展 + 1
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多