0

我被困在一个关于数据库的小问题上。

每月一次,我会收到一个包含客户信息(姓名、地址、城市等)的 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作为主键。

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

谢谢。

4

3 回答 3

3

一种方法是将数据批量插入到数据库中的新临时表中(您可以为此使用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。

于 2011-04-12T08:40:49.733 回答
2

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

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

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

于 2011-04-12T08:43:11.687 回答
0

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

但万一,您必须从 .NET 代码插入/更新,然后您可以

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