ExecuteScalar () с SqlTransaction

Я пытаюсь сделать две вставки в базу данных, используя sqltransaction и exectescalar, чтобы вернуть идентификатор вывода первой вставки.

Это код:

try { using (SqlConnection conn = new SqlConnection("ConnectionString")) { conn.Open(); SqlTransaction safetransaction = conn.BeginTransaction(); foreach (var dado in NFSe) { SqlCommand cmd_NFSe = new SqlCommand("SqlCommand", conn, safetransaction); var newID = cmd_NFSe.ExecuteScalar(); foreach (var serv in Servico) { string ID = newID.Tostring(); SqlCommand cmd_NFSeServ = new SqlCommand("SqlCommand", conn, safetransaction); cmd_NFSeServ.ExecuteNonQuery(); } } } } catch (SqlException ex) { MessageBox.Show(ex.ToString()); } 

Но это не работает. В базу данных ничего не добавляется, и я не получаю никаких ошибок или исключений, просто ничего не происходит.

Если я использую тот же код, но без sqltransaction, все отлично работает.

Есть идеи?

Вам нужно позвонить safetransaction.Commit();

Я бы хотел, чтобы вы показали некоторые из ваших SQL, чтобы мы могли видеть, что вы делаете, но я должен предположить, что у вас есть столбец идентификатора, из которого вы возвращаете новый идентификатор. Мне нравится избегать нескольких поездок на сервер, чтобы вы могли хорошо знать, что вы можете объединить несколько операторов SQL в один вызов, разделив их на «;». Все заявления в рамках этого единственного вызова также являются транзакционными, поэтому ваш общий код будет меньше и с меньшим количеством поездок на сервер, быстрее. IE:

 INSERT INTO MyTable (MyField) VALUES ('Test1'); Select SCOPE_IDENTITY(); INSERT INTO MyTable (MyField) VALUES ('Test2'); Select SCOPE_IDENTITY() 

Теперь используйте это с DataAdapter.Fill, и вы получите DataSet с двумя таблицами, каждый из которых имеет новый идентификатор для вставок.

О, на ваш первоначальный вопрос, вам необходимо зафиксировать транзакцию: safetransaction.Commit();

Вы пропустили так много вещей

  1. Согласование trasaction
  2. Откат транзакции

Сделка откатывается при любой ошибке или если она удалена без предварительного совершения

просто попробуйте это:

 try { using (SqlConnection conn = new SqlConnection("ConnectionString")) { conn.Open(); SqlTransaction safetransaction = conn.BeginTransaction(); foreach (var dado in NFSe) { SqlCommand cmd_NFSe = new SqlCommand("SqlCommand", conn, safetransaction); cmd_NFSe.Connection = connection; cmd_NFSe.Transaction = transaction; var newID = cmd_NFSe.ExecuteScalar(); foreach (var serv in Servico) { string ID = newID.Tostring(); SqlCommand cmd_NFSeServ = new SqlCommand("SqlCommand", conn, safetransaction); cmd_NFSeServ.ExecuteNonQuery(); cmd_NFSe.Commit(); } } } } catch (SqlException ex) { cmd_NFSe.Rollback(); MessageBox.Show(ex.ToString()); } 
Interesting Posts

Параметр отчета SSRS

Использование скомпилированной модели для подключения DbContext – Bad Sql

Запросить словарь данных SQL Server для поиска всех баз данных, содержащих таблицу 'x'

Добавьте столбец нулей в таблицу sql server

SQL group by day, с подсчетом

Как рассчитать возраст с использованием столбца за месяц?

Строки PIVOT для столбцов с более чем 1 значением возвращены

Обрезка значений базы данных SQL из моего приложения c #

Мне нужно настроить теги xml в некотором порядке

Как SQL-процедуры из базы данных Master помогают разработчикам db?

Строка подключения для экземпляра по умолчанию, например, для именованного экземпляра

Рекомендации по непрерывной интеграции с проектом SQL Server или локальным файлом mdf в проекте

SQL Server: неверный индекс используется, когда значение фильтра превышает диапазон гистограмм индекса

SSDT / SSIS Выполнение SQL-задачи, не заполняющей переменную с выводом запроса

SQL найти запись с нулевой и предыдущей записью не null

Давайте будем гением компьютера.