C#数据库更新

时间:2011-04-12 08:35:02

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

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

我的代码中的硬编码SQL命令存在很多问题,所以我首先想要重构你所做的事情。但是,为了达到你想要的效果,你需要在主键上执行SELECT,如果它返回任何结果你应该执行UPDATE,否则你应该执行INSERT。< / p>

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

答案 2 :(得分:0)

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

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

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