Я использовал эту команду для вставки нескольких записей в несколько строк, как я могу заблокировать свою команду и откатить изменения, если вставка была неудачной?
SqlCommand cmd = new SqlCommand();
string s = @"
declare @one_id int;
INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);
set @one_id=SCOPE_IDENTITY();
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
";
cmd.CommandText =s;
3 ответа
Наверняка вы знакомы с операторами try catch, поэтому используйте их.
Оберните свои утверждения в BEGIN TRANSACTION и COMMIT, например:
string s = @"
BEGIN TRY
BEGIN TRANSACTION
declare @one_id int;
INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);
set @one_id=SCOPE_IDENTITY();
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
";
Если одно из ваших операторов завершится неудачно, запустится блок CATCH.
Удачи.
Ссылки ниже помогут вам:
http://www.codeproject.com/Articles/522039/A-Beginners-Tutorial-for-Understanding-Transaction https://msdn.microsoft.com/en-us/library/2k2hy99x(v=vs.110).aspx
Вы можете запустить транзакцию и управлять ошибками в коде SQL, как предлагает Рой, или сделать это на стороне клиента:
using (SqlConnection cn = CreateConnection())
using (SqlCommand cmd = CreateMyCommand(cn))
{
cn.Open();
using (SqlTransaction tx = cn.BeginTransaction())
{
cmd.Transaction = tx;
cmd.ExecuteNonQuery();
tx.Commit();
}
}
Обратите внимание, что блок catch здесь не нужен, потому что, если что-то не удается, транзакция откатывается на tx.Dispose (). Если что-то не удается, tx.commit не вызывается, но всегда вызывается tx.Dispose из-за блока using. Tx.Dispose откатывает транзакцию, если она не была ранее зафиксирована.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.