使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表

Posted

技术标签:

【中文标题】使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表【英文标题】:Inserting data into one table then multiple rows into another using data from the first using stored procedures (SQL + C#) 【发布时间】:2012-03-23 18:41:24 【问题描述】:

好的,所以我是新来的 :) 我对 SQL 比较陌生,我正在尝试将数据插入到多个表中。我有两个插入工作,但是我想要它,所以如果一个失败,两个都不会提交。 表格如下所示:

学生 - StudentID - 整数 PK, 学生姓名 - Varchar, 等等……

类 - ClassID - int PK, 类名 - varchar, 等等……

学生班 - 学生卡, 类 ID,

我要做的是创建一个可以属于多个班级的新学生。所以我创建了 Student 类表来打破多对多的关系。我有一个存储过程来插入一个新学生并返回最新的 StudentID,然后我在一个新的存储过程中使用这个 StudentID,并使用一个表值参数将多行插入到 StudentClass 表中。这些是存储过程:

创建学生:

@FirstName varchar(20) = '', 
@LastName varchar(20) = '',
@PredictedGrade char(1) = '',
@ActionPlan bit = 0,
@StudentActive bit = 1,
@StudentID int out

INSERT INTO Student (FirstName, LastName, PredictedGrade, ActionPlan, StudentActive)
VALUES (@FirstName, @LastName, @PredictedGrade, @ActionPlan, @StudentActive)
SET @StudentID = SCOPE_IDENTITY()

向 StudentClass 表添加多行:

(@StudentClassCollection As InsertStudentClass READONLY)

INSERT INTO StudentClass(StudentID, ClassID)
SELECT StudentID, ClassID FROM @StudentClassCollection

所以这两项工作,但是我不知道如何做到这一点,所以如果一个失败,另一个将不会执行并且不会提交更改?如此有效地我需要在同一个存储过程中一个接一个地执行这两个操作?我想!正如我所说,我是新人,所以如果我做错了什么,请告诉我,我会纠正它:)

【问题讨论】:

【参考方案1】:

In case of an error, rollback will be issued automatically

SET XACT_ABORT ON

begin transaction

-- YOUR WORK HERE

commit transaction

【讨论】:

谢谢,不知道 XACT_ABORT 相信以后会有用!【参考方案2】:

像下面这样尝试

using (SqlConnection  connection= new SqlConnection(connectionstring))
   
     connection.Open();
     SqlTransaction transaction = connection.BeginTransaction();
     try
     
        SqlCommand command = new SqlCommand("proc1",connection);
        //execute the above command
        command.CommandText="proc2";
        //execute command again for proc2
        transaction.Commit();                   
     
     catch
     
       //Roll back the transaction.
       transaction.Rollback();
       
   

【讨论】:

非常感谢,这看起来是我可以继续使用现有存储过程的最佳方式 :) 我会投票,但我还不能! 你可以接受答案meta.stackexchange.com/questions/5234/…【参考方案3】:
begin tran

// all insert , update script here    


IF @@ERROR <> 0
BEGIN
    ROLLBACK tran
END
ELSE
    commit tran

【讨论】:

非常感谢您的帮助!

以上是关于使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程将数据从 SQL 表插入 Excel

使用存储过程将数据插入从其他表派生的表中

在 Oracle SQL 中使用存储过程将数据插入表中

从xml获取数据并使用存储过程和c#插入现有表

SQL插入,使用合并存储过程更新

将本地数据插入 SQL Server 临时表