你应该进行多次插入调用还是传递XML?

Jac*_*ack 4 .net c# sql-server sql-server-2008

我有一个帐户创建过程,基本上当用户注册时,我必须在多个表格中输入用户,个人资料,地址.User表中有1个条目,Profile中有1个条目,Address表中有2-3个条目.所以,最多会有5个条目.我的问题是我应该将这个XML传递给我的存储过程并在那里解析它,还是应该在我的C#代码中创建一个事务对象,保持连接打开并逐个插入地址?

你如何处理这种情况?即使连接打开,是否可以进行多次调用会降低性能?

Bin*_*ier 6

没有冒犯,但你在想这个.

收集您的信息,当您将它们放在一起时,创建一个事务并一次插入一个新行.这里没有任何表现,因为交易将是短暂的.

问题是如果你在连接上创建事务,插入用户行,然后等待用户输入更多的配置文件信息,插入,然后等待它们添加地址信息,然后插入,不要这样做,这是一个不必要的长时间运行的事务,并将产生问题.

但是,您的方案(您拥有所有数据)是正确使用事务,它可以确保您的数据完整性,并且不会对您的数据库造成任何压力,也不会 - 在它自己 - 上创建死锁.

希望这可以帮助.

PS Xml方法的缺点是增加了复杂性,您的代码需要知道xml的模式,您的存储过程也需要知道Xml模式.存储过程增加了解析xml,然后插入行的复杂性.我真的没有看到简单的短期运行事务的额外复杂性的优势.


Rom*_*ain 5

如果要在多个表中插入记录,则使用XML参数是一种复杂的方法.在.net服务器中,在.net中创建Xml并从xml中为三个不同的表提取记录是很复杂的.

在事务中执行查询是一种简单的方法,但是在.net代码和sql server之间切换会降低某些性能.

最好的方法是在storedprocedure中使用table参数.在.net代码中创建三个数据表,并在存储过程中传递它们.

- 为每种类型的表创建类型TargetUDT1,TargetUDT2和TargetUDT3,其中包含需要插入的所有字段

CREATE TYPE [TargetUDT1] AS TABLE
             (
             [FirstName] [varchar](100)NOT NULL,
             [LastName] [varchar](100)NOT NULL,
             [Email] [varchar](200) NOT NULL
             )
Run Code Online (Sandbox Code Playgroud)

- 现在按照以下方式写下sp.

 CREATE PROCEDURE AddToTarget(
     @TargetUDT1 TargetUDT1 READONLY,
     @TargetUDT2 TargetUDT2 READONLY,
     @TargetUDT3 TargetUDT3 READONLY)
     AS
 BEGIN
       INSERT INTO [Target1]
       SELECT * FROM @TargetUDT1

       INSERT INTO [Target2]
       SELECT * FROM @TargetUDT2

       INSERT INTO [Target3]
       SELECT * FROM @TargetUDT3
 END
Run Code Online (Sandbox Code Playgroud)

在.Net中,创建三个数据表并填充该值,并正常调用sp.