我遇到了一个关于数据库的小问题。
每月一次,我会收到一份包含客户信息(姓名,地址,城市等)的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
作为主键。
所以基本上如何用新信息更新或填充我的表格?
感谢。
答案 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代码插入/更新,那么你可以