Вставка данных в одну таблицу, затем несколько строк в другую, используя данные из первой, используя хранимые процедуры (SQL + C #) - PullRequest
0 голосов
/ 06 марта 2012

Хорошо, я новичок здесь :) Я относительно новичок в SQL и пытаюсь вставить данные в несколько таблиц. У меня есть обе вставки для работы, но я хочу, чтобы, если одна из них не удалась, ни одна из них не была зафиксирована. Таблицы выглядят так:

студент - StudentID - внутренний ПК, StudentName - Varchar, и т.д ...

Класс - ClassID - int PK, ClassName - varchar, и т.д ...

StudentClass - Студенческий билет, ClassID,

Я пытаюсь создать нового ученика, который может принадлежать к нескольким классам. Итак, я создал таблицу учеников, чтобы разорвать отношения многие-многие. У меня есть хранимая процедура для вставки нового студента и возврата новейшего 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

Итак, оба эти варианта работают, но я не знаю, как это сделать, чтобы в случае сбоя одного из них выполнение не выполнялось и изменения не фиксировались? Так эффективно ли мне нужно выполнять оба действия одно за другим в одной и той же хранимой процедуре? Я думаю! Как я уже сказал, я новичок, поэтому, если я сделал что-то не так, пожалуйста, дайте мне знать, я исправлю это:)

Ответы [ 3 ]

1 голос
/ 06 марта 2012

В случае ошибки откат будет выполнен автоматически

SET XACT_ABORT ON

begin transaction

-- YOUR WORK HERE

commit transaction
0 голосов
/ 06 марта 2012

попробуйте как показано ниже

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();
     }  
   }
0 голосов
/ 06 марта 2012
begin tran

// all insert , update script here    


IF @@ERROR <> 0
BEGIN
    ROLLBACK tran
END
ELSE
    commit tran
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...