2012-02-10 9 views
1

DataTableは.xlsテーブルから生成されています。他のソース(データテーブル)のデータでSQL Serverテーブルを更新する方法

このDataTableをSQL Serverデータベースの既存のテーブルに保存します。

私はユニークなPKを持つ行を格納するためにSqlBulkCopyを使用します。

問題は、私はまた、SQL Serverテーブルとして同じPKを持っていますが、SQL Serverのテーブルに比べて異なる値で細胞を含む他の行を持っている、です。要するに

はのは、私はこのような行を持って私のDataTableに言ってみましょう:

ID(PK)|名前|番号

005 | abc | 123

006 | lge | 122

私のSQLサーバーでは、このようなsthがあります。

id(PK)|名前|番号

004 | cbs | 345

005 | lks | 122

はすぐにSqlBulkCopyを使用してSQL Serverにアップロードできます。一方、行は、SQLサーバーテーブルに同じPKの行が含まれているため、挿入することはできません。

今、手動で行を抽出しようとしました。各単一セルをArrayListに抽出し、その後にUPDATE Tableステートメントを生成します。しかし、私は非常に多くの行を処理するので、このメソッドは実行できないようです。

私はこの目標を達成するためのより良い方法を探しています。

何か助けていただければ幸いです。 (あなたはを更新する必要がありますストアドプロシージャ

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 

データベース側:データテーブルからデータを読み込み、XMLデータを作成する

C#側のコード:

感謝の

+0

誰かがテーブルのフォーマットを助けることができますか?私はそれがあまりにも混乱しないように見えることを望む。 – rofans91

+0

あなたは成功した実装をしたいと言っていますが、 "005"のidのために何をしたいのかは説明していません。データベーステーブルのデータを上書きしますか?それとも、 'DataTable'から無視しますか? –

+0

私はそれを上書きしたい。 – rofans91

答えて

2

は、以下のコードを使用しますテーブル名):

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

関連する問題