【问题标题】:C# database updateC# 数据库更新
【发布时间】:2011-04-12 08:35:01
【问题描述】:

我遇到了一个关于数据库的小问题。

我每月收到一个包含客户信息(姓名、地址、城市等)的 XML 文件。我的主键是 XML 文件中提供的客户编号。

我在数据库中插入信息没有问题;

var cmd = new SqlCommand("insert into [customer_info] 
   (customer_nr, firstname, lastname, address_1, address_2, address_3.......)");
//some code
cmd.ExecuteNonQuery();

现在,我想更新我的表格,或者只是用新信息填充它。我怎样才能做到这一点?

我尝试过使用TableAdapter,但它不起作用。

我只能添加一个 XML,因为我只能有一个 customer_nr 作为主键。

那么基本上我该如何更新或用新信息填充我的表格?

谢谢。

【问题讨论】:

    标签: c# sql sql-update sql-insert


    【解决方案1】:

    一种方法是将数据批量插入到数据库中的新临时表中(您可以使用SqlBulkCopy 以获得最佳插入速度)。一旦它在那里,您就可以索引 customer_nr 字段,然后运行 ​​2 条语句:

    -- UPDATE existing customers
    UPDATE ci
    SET ci.firstname = s.firstname,
        ci.lastname = s.lastname, 
        ... etc
    FROM StagingTable s
        INNER JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr
    
    -- INSERT new customers
    INSERT Customer_Info (customer_nr, firstname, lastname, ....)
    SELECT s.customer_nr, s.firstname, s.lastname, ....
    FROM StagingTable s
        LEFT JOIN Customer_Info ci ON s.customer_nr = ci.customer_nr
    WHERE ci.customer_nr IS NULL
    

    最后,删除临时表。

    或者,如果您使用的是 SQL Server 2008 或更高版本,则可以只使用 MERGE 语句而不是 2 条语句,这允许您通过单个语句执行 INSERT 和 UPDATE。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题 - 如果客户已经存在,您想更新他们的信息,如果他们不存在,您想插入一个新行。

      我在你的代码中使用硬编码的 SQL 命令有很多问题,所以我首先很想重构你所做的事情。但是,要实现您想要的,您需要在主键上执行SELECT,如果它返回任何结果,您应该执行UPDATE,否则您应该执行INSERT

      最好以Stored Procedure 之类的方式执行此操作 - 您可以将信息传递给存储过程,然后它可以决定是 UPDATE 还是 INSERT - 这也将减少多次调用数据库代码的开销(存储过程会快得多)

      【讨论】:

        【解决方案3】:

        AdaTheDev 确实给出了很好的建议。

        但如果您必须从 .NET 代码插入/更新,那么您可以

        1. 创建一个将处理插入/更新的存储过程,即,您可以调用存储过程,而不是使用直接插入查询作为命令文本。 SP 将检查行是否存在,然后更新(或插入)。
        2. User TableAdapter - 但这会很乏味。首先,您必须设置插入和更新命令。然后您必须查询数据库以获取现有客户编号,然后更新数据表中的相应行,使 Rowstate 为已更新。我宁愿不走这条路。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-15
          • 2021-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多