2011-04-12 141 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的決定 - 這也將降低使得一些調用的開銷爲您的代碼到數據庫(存儲過程會更快)