2011-04-12 84 views
0

我被困在有关数据库的小问题上。C#数据库更新

每月一次,我得到一个包含客户信息(姓名,地址,城市等)的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

AdaTheDev确实给出了很好的建议。从.NET代码

但在情况下,你必须插入/更新,那么你可以

  1. 创建一个存储过程,将即处理插入/更新,而不是使用直接插入查询的命令文本,你做对存储过程的调用。 SP将检查是否存在行,然后更新(或插入)。
  2. 用户表适配器 - 但这将是单调乏味的。首先,您必须设置插入&更新命令。然后,您必须查询数据库以获取现有客户编号,然后更新数据表中的相应行,使Rowstate更新。我宁愿不这样去。
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。

2

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

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

这将是最好做到这一点的东西就像一个Stored Procedure - 你可以在随后将信息传递到存储过程可以做出是否UPDATEINSERT的决定 - 这也将降低使得一些调用的开销为您的代码到数据库(存储过程会更快)