他のソース(DataTable)からのデータでSQL Serverテーブルを更新する方法

asp.net c# datatable sqlbulkcopy sql-server-2005

質問

私は.xlsテーブルから生成されたDataTableを持っていDataTable

このDataTableをSQL Serverデータベースの既存のテーブルに格納したいと思います。

SqlBulkCopyを使用して一意のPKを持つ行を格納します。

問題は、私もSQL Serverのテーブルと同じPKを持っているが、SQL Serverのテーブルに比べて異なる値を持つセルを含む他の行があります。

要するに:

DataTableに次のような行があるとしましょう:

ID(PK)|名前|数

005 | abc | 123

006 | lge | 122

私のSQLサーバーのために私はこのようなsthがあります。

ID(PK)|名前|数

004 | cbs | 345

005 | lks | 122

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

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

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

どんな助けもありがとうございます。

ありがとう

受け入れられた回答

次のコードを使用します。

C#DataTableからデータを読み取り、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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ