2010-10-07 49 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

相關問題