2010-07-27 46 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) 
相关问题