2010-07-27 48 views
0

數據庫包含兩個表如何在一個命令中插入/更新到兩個相關的表中?

  • 存在Data_t:數據ID的主鍵是 身份1,1。還有另一個字段 'LEFT'TINYINT
  • Data_Link_t:DataID PK和FK其中 DataID必須存在於Data_t中。還有另一個字段'右'微型

來自微軟訪問環境到C#和sql服務器我正在尋找一種導入記錄到這種關係的好方法。

該記錄包含屬於該連接兩側的信息(可能會一次插入/更新5000條以上的記錄)。在某種類型的LINQ列表類型命令中處理整個批處理的獎勵,但即使按照記錄進行記錄,關鍵目標是應該在同一步驟中處理此記錄的兩邊。

有無數的方法,我看着太多,以確定我應該走哪條路,所以我更快地向公衆詢問。 LINQ是用LINQ to SQL插入/更新這樣一個大列表的選項嗎?我應該按照記錄進行記錄嗎?我應該使用什麼方法將記錄添加到標準化表格中,以便在創建完整記錄時進行連接?

回答

2

聽起來就像我寫一個小的存儲過程並從C#調用它的情況 - 例如,作爲我的Linq-to-SQL數據上下文對象的一個​​函數。

喜歡的東西:

CREATE PROCEDURE dbo.InsertData(@Left TINYINT, @Right SMALLINT) 
AS BEGIN 
    DECLARE @DataID INT 

    INSERT INTO dbo.Data_t(Left) VALUES(@Left) 

    SELECT @DataID = SCOPE_IDENTITY(); 

    INSERT INTO dbo.Data_Link_T(DataID, Right) VALUES(@DataID, @Right) 
END 

如果導入到你的數據上下文,你可以調用這個類似:

using(YourDataContext ctx = new YourDataContext) 
{ 
    foreach(YourObjectType obj in YourListOfObjects) 
    { 
     ctx.InsertData(obj.Left, obj.Right) 
    } 
} 

,讓存儲過程處理所有的休息(所有細節,就像確定並使用第二個表中的第一個表中的IDENTITY)。

0

我從來沒有嘗試過,但你可以通過創建一個可更新的視圖然後將記錄插入到視圖中來完成你所要求的。

UPDATE

我只是嘗試它,它看起來並不像它會工作。

消息4405,級別16,狀態1, 視圖或函數「Data_t_and_Data_Link_t」行是不可更新,因爲修改會影響多個基表。

我想這僅僅是所有關係數據庫理論純粹主義者討厭SQL Server的一件事。

另一個更新

進一步的研究發現了一種方法來做到這一點。它可以通過一個視圖和一個「而不是」觸發器來完成。

create table Data_t 
(
    DataID int not null identity primary key, 
    [LEFT] tinyint, 
) 
GO 

create table Data_Link_t 
(
    DataID int not null primary key foreign key references Data_T (DataID), 
    [RIGHT] smallint, 
) 
GO 

create view Data_t_and_Data_Link_t 
as 
select 
    d.DataID, 
    d.[LEFT], 
    dl.[RIGHT] 
from 
    Data_t d 
    inner join Data_Link_t dl on dl.DataID = d.DataID 
GO 

create trigger trgInsData_t_and_Data_Link_t on Data_t_and_Data_Link_T 
instead of insert 
as 
insert into Data_t ([LEFT]) select [LEFT] from inserted 
insert into Data_Link_t (DataID, [RIGHT]) select @@IDENTITY, [RIGHT] from inserted 
go 

insert into Data_t_and_Data_Link_t ([LEFT],[RIGHT]) values (1, 2) 
相關問題