|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
Всем привет. Использую FirebirdSql.Data.FirebirdClient; На внесение изменений в БД через FBDataAdapter у меня следующий код: Код: c# 1. 2. 3. 4. 5. 6. 7.
Ну в книжке так и написано, что для оборачивания в транзакцию обновления записей в таблице, в случае, если мы генерируем обновляющие запросы автоматом через CommandBuilder, надо перед update() присвоить транзакцию в select адаптера, т.к. он запрашивает метаданные таблицы. Но у меня выскакивает null reference exception на строке da.UpdateCommand.Transaction = txn, как будто UpdateCommand пустая... Тогда где и как запускать транзакцию? Я пока учусь, не ругайте) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 14:42 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
aford, Адаптерами уже никто не пользуется, смотри в сторону орм а null reference exception, у тебя потому что ты не указал команду ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 18:14 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
pation, спасибо за совет про орм, обязательно обращу внимание, но сейчас главное в текущем разобраться) Команду не указывал, она должна была сгенерироваться автоматом при инициализации Код: c# 1. 2.
Это все используется при открытии таблицы, а код в первом посте отрабатывает по нажатию на кн. сохранить. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 08:47 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
Пардон, вот так надо: Код: c# 1.
Как я понял, NullReferenceException было из-за того, что FbCommandBuilder был объявлен локально. Теперь ошибка "транзакция команды не была инициализирована" System.InvalidOperationException: 'Execute requires the Command object to have a Transaction object when the Connection object assigned to the command is in a pending local transaction. The Transaction property of the Command has not been initialized.' Хотя задаю вроде правильно Код: c# 1. 2. 3. 4. 5. 6. 7.
Если полностью убираю транзакцию Код: c# 1. 2.
то все работает и запрос обновления показывает без ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 11:30 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
aford, эм... и что в мессадж боксе? Есть небольшое ограничение, т.е. вариант когда упдейт команд не будет создан автоматически (не задан "первичный ключ" для дататейбл)... Возьмите командбилдер - введите свой селект и посмотрите какие команды он вам нагенерит... P.S.: вы сделайте сперва всё как написано в книжке... P.P.S.: есть еще вариант c TransactionScope ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 11:36 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
buser, первичный ключ задан в ст. USER (есть еще 2 ограничения: запрос возвращает данные только из 1 таблицы и первичный ключ есть в резульатах запроса). В мессейджбоксе что-то вроде авторUPDATE "TABLE" SET "USER" = @p1, "USER_NAME" = @p2 .. WHERE (("USER" = @p16)) Как раз по первичному ключу USER и строится логика обновления. buser вы сделайте сперва всё как написано в книжке... Я так и делаю :) Пока не совсем понятно, как мне поможет здесь TransactionScope ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 11:54 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
aford, а если показать весь код... от создания конекшна и дата адаптера? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 12:52 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
buser, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 13:27 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
pationaford, Адаптерами уже никто не пользуется, смотри в сторону орм а null reference exception, у тебя потому что ты не указал команду Пользуются. ОРМ пользуются те, кто плохо знают возможности баз данных. aford, открытие транзакций на клиенте - зло. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 15:04 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
afordbuser, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
Все неправильно. Если используется подход через DataSet, то надо использовать типизированный DataSet ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 15:22 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
Cat2, я ж DataSet-ом не пользуюсь, у меня одна таблица. Да и типизированный не за чем, если я обращаюсь к разным таблицам. Знаю, что датасеты со строгим контролем типов это хорошо в плане разработки, скорости и т.д., но сейчас меня интересует только почему не цепляется транзакция и вываливается исключение... автороткрытие транзакций на клиенте - зло Почему? Где их еще открывать? Если только писать сервер для клиента, который будет работать с БД и управлять с транзакциями? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 16:38 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
afordCat2, я ж DataSet-ом не пользуюсь, у меня одна таблица. Да и типизированный не за чем, если я обращаюсь к разным таблицам. Знаю, что датасеты со строгим контролем типов это хорошо в плане разработки, скорости и т.д., но сейчас меня интересует только почему не цепляется транзакция и вываливается исключение... автороткрытие транзакций на клиенте - зло Почему? Где их еще открывать? Если только писать сервер для клиента, который будет работать с БД и управлять с транзакциями? Если у Вас одна таблица, то Вы не умеете проектировать базы и понятия не имеете о нормализации. Типизированный Dataset - модель базы данных, удобная для обращения к базе. Да нафига Вам это цепляние ? Единственный запрос и так выполняется в отдельной транзакции. Когда нужно в единой транзакции выполнить несколько запросов - используются хранимые процедуры. Зло в том, что если на клиенте открывается транзакция, то она должна быть и закрыта там же. Пример. В транзакции два запроса на изменение. Во время выполнения первого запроса клиент отвалился - террористы взорвали компьютер клиента. СУБД будет ждать "некоторое разумное время", что бы откатить эту операцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 21:49 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
aford, В коде не видно где создаются InsertrCommand, UpdateCommand, DeleteCommand. Вот для примера мой код (правда это VB.NET + MS SQL, но это не принципиально, главное смотри на транзакцию и команды): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 05:34 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
Cat2Если у Вас одна таблица, то Вы не умеете проектировать базы и понятия не имеете о нормализации. Вопрос изначально стоял так "Почему не работает транзакция, почему выскакивает ошибка" То, что я использую одну таблицу не значит, что я ничего не понимаю в проектировании и т.п., это все сугубо для примера и чтобы разобраться в текущем вопросе. Вот зачем делать такие выводы? Не понимаю. Cat2Да нафига Вам это цепляние? Я ж и говорю, разобраться, никакой цели кроме "Почему так не работает и как надо" я не преследую. Почему в книжке работает, а у меня нет? Компоненты доступа Firebird не работают или я делаю что-то не так? Книга Д. Сеппа, Microsoft ADO.NET. Только что там не firebird, а ole. Стр. 390 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
При вызове метода DataAdapterL'pdate объект CommandBuilder выбирает из БД нужные метаданные, используя свойство SelectCommand объекта DataAdapter. Мы не сопоставили объект Command в свойстве SelectCommand с только что созданной транзакцией. Следовательно, объекту CommandBuilder не удастся воспользоваться этим свойством, и он генерирует исключение. Если добавить перед вызовом метода Update объекта DataAdapter такую строку, код успешно выполнится: da.SelectCommand.Transaction = txn; Cat2Единственный запрос и так выполняется в отдельной транзакции. Транзакция в любом случае есть, хоть и не в явном виде. Cat2Когда нужно в единой транзакции выполнить несколько запросов - используются хранимые процедуры. Или пакетные запросы, но вопрос вначале все же был не об этом :) Cat2Зло в том, что если на клиенте открывается транзакция, то она должна быть и закрыта там же. Пример. В транзакции два запроса на изменение. Во время выполнения первого запроса клиент отвалился - террористы взорвали компьютер клиента. СУБД будет ждать "некоторое разумное время", что бы откатить эту операцию. Ну так транзакции все равно открываются неявно на клиенте, для этого придумали короткие пишущие и длинные читающие, но лучший способ таки да, делать сервер для клиента, который будет управлять транзакциями, а общение клиент-сервер через сокеты, поправьте, если я не прав. Но, это опять же - другая история. Barkan, методы обновления создаются при инициализации коммандбилдера, а если еще точнее (по книжке), то в момент обновления он делает селект запрос в таблицу БД и на основании этого запроса генерирует логику обновления. Без транзакции же все работает и я не прописываю все логику сам. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 09:05 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
Разобрался. Все, что нужно было сделать, это инициализировать новую команду на выборку данных, но уже с транзакцией (ну или сразу задавать транзакцию ей). То есть вместо Код: c# 1. 2. 3. 4. 5. 6. 7.
Надо было сделать так Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2019, 10:39 |
|
c#, транзакция в FBDataAdapter.Update()
|
|||
---|---|---|---|
#18+
aford, Попробовал, как написали, запись не добавляется, ни ошибки, ничего. Что я сделал не так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2021, 09:17 |
|
|
start [/forum/topic.php?fid=20&tid=1398329]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 434ms |
0 / 0 |