簡體   English   中英

如何使用.Net DataTable更新數據庫表並忽略現有記錄?

[英]How can I update a database table with a .Net DataTable and ignore existing records?

我有一個包含記錄的.Net DataTable,所有記錄都是“添加”記錄。 數據庫中的相應表可能包含數百萬行。 如果我嘗試簡單地在SqlDataAdapter上調用“ Update”方法,則任何現有記錄都會由於違反主鍵約束而引發異常。 我考慮過將所有物理表的記錄加載到第二個DataTable實例中,將兩者合並,然后在第二個DataTable上調用Update方法。 這實際上就像我想要的那樣工作。 但是,我擔心的是,如果物理表中有300億條記錄,那么將所有這些數據加載到內存中的DataTable中可能是一個問題。

我考慮過從物理表中選擇數據的子集並按如上所述進行操作,但是事實證明,子查詢的構造非常復雜且繁瑣。 您知道,我不使用單個已知表。 我正在使用包含數百個數據表的數據集。 每個數據表都映射到其自己的物理表。 表的名稱和架構在編譯時未知。 這必須在運行時完成。

我玩過SqlBulkCopy類,但有相同的問題-重復記錄引發異常。

我不想在運行時為每個表動態構造查詢。 如果那是唯一的方法,那就好了,但是我不禁認為,必須使用Ado.Net提供的解決方案更簡單。

您可以這樣創建insertcommand:

declare @pk int = 1
declare @txt nvarchar(100) = 'nothing'
insert into #temp (id, txt)
    select distinct @pk, @txt 
        where not exists (select id from #temp x where x.id = @pk)

假設您的表#temp(此示例中使用的臨時表)是這樣創建的(主鍵位於id上)

create table #temp (id int not null, txt nvarchar(100))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM