2010-10-07 54 views

回答

4

也许像大容量副本这样的答案会是一个答案。以下代码项目中的示例显示了如何使用DataTable执行此操作,但您应该可以更改该示例以使用DataSet。

以下是涵盖在SQL Server中的注释和执行的代码的一小部分(取自CodeProject)。

要注意的关键部分是bulkcopy.WriteToServer(Source Table);是的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

设置合适的BATCHSIZE和使用SqlBulkCopyOptions.TableLock可能会导致更好的性能。测试你的场景。有关详细分析,请参阅http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx。 – 2010-10-07 08:17:22

+0

@Winston - 感谢您的有用链接 – kevchadders 2010-10-07 08:33:13

3

虽然SqlBulkCopy作品对于批量插入,你不能做批量更新。这对您来说可能会也可能不是问题,但无论如何您都可以使用存储过程,该存储过程利用OPENXML来允许批量插入和更新。您还需要sp_xml_preparedocumentsp_xml_removedocument

此方法的另一个重大优势是您可以使用OUTPUT子句获得您刚刚批量插入的实体的ID。

散装插页的示例。

假设您已定义要存储的proc参数@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 
+0

我的回答很好的扩展+ 1 – kevchadders 2010-10-07 08:34:50

相关问题