C# 如何使用来自其他源(DataTable)的数据更新SQL Server表

C# 如何使用来自其他源(DataTable)的数据更新SQL Server表,c#,asp.net,sql-server-2005,datatable,sqlbulkcopy,C#,Asp.net,Sql Server 2005,Datatable,Sqlbulkcopy,我有一个从.xls表生成的数据表 我想将此DataTable存储到SQL Server数据库中的现有表中 我使用SqlBulkCopy存储具有唯一PK的行 问题是,我还有其他行,它们的主键和SQLServer表相同,但和SQLServer表相比,它们包含的单元格的值不同 简言之: 假设在我的数据表中有这样一行: idPK |名称|编号 005 | abc | 123 006 | lge | 122 对于我的SQL server,我有这样的东西 idPK |名称|编号 004 |哥伦比亚广播公司|

我有一个从.xls表生成的数据表

我想将此DataTable存储到SQL Server数据库中的现有表中

我使用SqlBulkCopy存储具有唯一PK的行

问题是,我还有其他行,它们的主键和SQLServer表相同,但和SQLServer表相比,它们包含的单元格的值不同

简言之:

假设在我的数据表中有这样一行:

idPK |名称|编号

005 | abc | 123

006 | lge | 122

对于我的SQL server,我有这样的东西

idPK |名称|编号

004 |哥伦比亚广播公司| 345

005 | lks | 122

现在您可以看到,可以使用SqlBulkCopy直接将第006行上载到SQL Server。另一方面,无法使用它插入行005,因为SQL server表包含具有相同主键的行

现在我尝试手动提取行。将每个单元格提取到ArrayList中,然后生成UPDATE Table语句。然而,这种方法似乎不可行,因为我有太多的行要处理

我正在寻找一种更好的方法来实现这一目标

感谢您的帮助

感谢使用以下代码:

用于从DataTable读取数据并准备XML数据的C端代码:

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

有人能帮我把表格格式化吗?我希望它看起来不要太混乱。你说你想要一个成功的实现,但是你没有解释你想要在id为005时发生什么。是否覆盖数据库表中的数据?或者直接从数据表中忽略它?为什么不使用XML格式和存储过程呢。流程是。。从DataTable准备XML数据,然后传递到存储过程。在SP中,您可以将XML读取为表。然后,您可以检查哪些ID已经在表中或不在表中。插入新数据、更新或忽略现有ID。到目前为止,我尝试的是生成一个动态更新表命令。更新名称=某物编号=某物,其中id=某物。但正如我在问题中所说,我发现这种方法不可行,因此我正在寻找一种更好的方法。@这是一个有趣的建议。我想这是值得一试的。如果你对一个答案很有把握,那就简单地说出来。干杯,谢谢!