2012-02-10 57 views
1

我有一個DataTable,它是從.xls表生成的。如何使用來自其他源的數據(DataTable)更新SQL Server表

我想將此DataTable存儲到SQL Server數據庫中的現有表中。

我使用SqlBulkCopy來存儲具有獨特PK的行。

問題是,我也有具有相同PK如SQL Server表但包含細胞與不同值相比SQL Server表的其他行。

簡而言之:

讓我DataTable說我有一排這樣的:

ID(PK)|名稱|號碼

005 | abc | 123

006 | lge | 122

對於我的SQL服務器我有這樣的;

id(PK)|名稱|號碼

004 | cbs | 345

005 | lks | 122

現在你看到行可以使用SqlBulkCopy直接上傳到SQL Server中。另一方面,行不能使用它插入,因爲SQL服務器表包含具有相同PK的行。

現在我試着手動提取該行。將每個單元格提取到一個ArrayList中,然後生成一個UPDATE Table語句。然而這種方法似乎不可行,因爲我有很多行要處理。

我正在尋找更好的方法來實現此目標。

任何幫助表示讚賞。

感謝的

+0

有人可以幫我格式化表嗎?我希望它看起來不太混亂。 – rofans91 2012-02-10 03:21:12

+0

你說你想要一個成功的實現,但是你不能解釋*'005'的'id'究竟會發生什麼。你想覆蓋數據庫表中的數據嗎?或者只是從'DataTable'忽略它? – 2012-02-10 03:21:40

+0

我想覆蓋它。 – rofans91 2012-02-10 03:24:40

回答

2

使用下面的代碼:

C#端代碼從數據表中讀取數據,並準備XML數據:

DataTable dt = new DataTable(); 
StringBuilder sb = new StringBuilder(); 

sb.Append("<R>"); 
for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    sb.Append("<C><ID>" + dt.Rows[0].ToString() + "</ID>"); 
    sb.Append("<N>" + dt.Rows[1].ToString() + "</N>"); 
    sb.Append("<I>" + dt.Rows[2].ToString() + "</I></C>"); 
} 

sb.Append("</R>"); 

///pass XML string to DB side 
/// 
//sb.ToString(); //here u get all data from data table as xml format 

數據庫端存儲過程(你將需要更新表名):

CREATE PROCEDURE dbo.UpdateData 
    -- Add the parameters for the stored procedure here 
    @data  XML 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- keep data into temp table 
    create table #tmp_data (id nchar(2),name varchar(20), number int) 

    DECLARE @XMLDocPointer INT 
    EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @DATA 

    INSERT INTO #tmp_data(id,name,number) 
    SELECT ID,N,I 
    FROM OPENXML(@XMLDocPointer,'/R/C',2) 
    WITH(
      ID nchar(30), 
      N VARCHAR(20), 
      I int 
     ) 

    EXEC sp_xml_removedocument @XMLDocPointer 

    begin tran 
     -------------------INSERT not existing ones 
     INSERT INTO TABLE (id,name,number) 
     SELECT id,name,number 
     FROM #tmp_data 
     WHERE NOT EXISTS 
     (
      SELECT 1 
      FROM TABLE 
      WHERE ID = #tmp_data.ID 
     ) 

     --- update existing ones 
     UPDATE TABLE 
     SET name = #tmp_data.name, number = #tmp_data.number 
     FROM #tmp_data 
     WHERE #tmp_data.id = TABLE.id 

     commit tran 

    if(@@error <> 0) 
     rollback tran 

END 
+0

很棒的答案!做得好! – rofans91 2012-02-10 08:26:40

相關問題