Использование TSQLTransaction

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Использование TSQLTransaction

Сообщение jsa » 29.11.2017 12:21:18

Здравствуйте.
Пытаюсь перевести проект с Delphi7 на Lazarus 1.6.4
В программе ведется работа с базой на MS SQL

Есть вопрос про компонент TSQLTransaction
Он обязательно должен быть указан в TMSSQLConnection иначе ошибка.
А дальше возникает проблема.
Например используется две компоненты SQLQuery1 и SQLQuery2
в одной сделана выборка select компонент открыт SQLQuery1.Open
Пользователь работает с данными и вставляет на форме данные, которые должны вставляться по ID из текущей строки с помощью запроса во втором компоненте SQLQuery2.ExecSQL
В Delphi через ADO компоненты это работает без проблем.
Но почему-то в Lazarus Транзакция привязывается к соединению, и если выполнить Commit после SQLQuery2.ExecSQL то и выборка SQLQuery1.open закрывается.
Получается что есть два варианта
1. Копить данные на открытой транзакции и закрывать когда будут введены все. Но это глупо.
2. Пускать выборку и вставку данных через разные TMSSQLConnection. Это как-то странно.
Может не понимаю чего-то? Может есть нормальный способ работы с базой, а не эта чудесатая ерунда?

Добавлено спустя 16 часов 54 минуты 13 секунд:
Попробовал
1. Создал два SQLTransaction1 и SQLTransaction2
2. Указал каждому SQLQuery свой SQLTransaction
3. и указал в во всех четырех компонентах MSSQLConnection
4. В MSSQLConnection оставил ссылку на Transaction2

На первый взгляд , все заработало и в Profiler отлавливается ожидаемая картина действий.
НО в итоге данных в базе нет. Как будто Commit не делается.
Вот это колдунство я решительно не понимаю.
Как так, если в профайлере видно Commit то почему данные не вставляются и не апдейтятся?

P.S. Как временную меру сделал два MSSQLConnection один для select , другой для insert, update, delete.
С двумя коннекторами все работает как ожидаемо.
Сюр какой-то

Добавлено спустя 14 часов 59 минут 42 секунды:
Я так понимаю идей нет.
Это видимо идеологическая ошибка в реализации компонент.
Как передать баг разработчикам?
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Использование TSQLTransaction

Сообщение jsa » 02.12.2017 21:19:59

Кто-нибудь! 8) можете поделиться, как вы решаете вопрос работы когда нужно часть данных держать в визуальных компонентах, и одновременно вставлять данные через другие.
Тоже создаете два подключения, или есть нормальный метод?

P.S.
Не ужели никто не сталкивался, или этот вопрос чуть сложнее чем установка кодировки и потому двигать поучения о "стрельбе в ногу" и "изобретении велосипеда" тут уже не получается?
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Использование TSQLTransaction

Сообщение vitaly_l » 02.12.2017 21:40:00

jsa писал(а):двигать поучения о "стрельбе в ногу" и "изобретении велосипеда" тут уже не получается?

Сделайте тестовый пример, т.к. тут не все телепаты. И возможно, кто нить откликнется, т.к. выуживать из Вас информацию по задаче и растягивать этим топик на 20-ть записей, не всем интересно.

С другой стороны, раз уж Вы телепат, то: сделайте одно подключение вместо двух + правильное обращение к базе и проблема 100% исчезнет.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Использование TSQLTransaction

Сообщение alexs » 04.12.2017 09:26:13

jsa писал(а):Но почему-то в Lazarus Транзакция привязывается к соединению, и если выполнить Commit после SQLQuery2.ExecSQL то и выборка SQLQuery1.open закрывается.

Вообщето COMMIT закрывает все открытые запросы. Учим стандарты.
А если поделки в виде ADO и прочего подменяют COMMIT на COMMIT RETAINING - то согласитесь - это не проблемы стандарта.
В вашей ситуации есть3 метода:
1. И дальше использовать не явные транзакции - т.е. руками не трогать COMMIT
2. Вручную переоткрывать транзакцию
3. Использовать .CommitRetaining

PS
И совет - не используйте MS SQL - будет меньше гемороя...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Использование TSQLTransaction

Сообщение jsa » 07.12.2017 16:30:18

Код: Выделить всё
Вообщето COMMIT закрывает все открытые запросы. Учим стандарты.
А если поделки в виде ADO и прочего подменяют COMMIT на COMMIT RETAINING - то согласитесь - это не проблемы стандарта.

Вообще то, вы отвечаете на незаданный вопрос. Я не спрашивал, все или не все открытые запросы закрывает Commit, я описал проблему работы с данными на одном соединении и спросил какие есть методы решить ее.
А вы опять в своей менторской манере поучаете не вникнув в вопрос.
Я вам советую если вы большой специалист и в теме, поучать по сути вопроса, а не доказывать то что никто не оспаривает.

Вообще то программист сам должен решать в каком случае нужно делать BEGIN TRAN и когда делать COMMIT TRAN
И ADO компоненты презрительно названные вами "поделками" оставляют это разработчику, а не решают за него, пуляя BEGIN TRAN и COMMIT TRAN там где это совершенно не нужно.
1. И дальше использовать не явные транзакции - т.е. руками не трогать COMMIT
- вы все таки совершенно не вникаете в вопрос, сразу пишете. Данные сразу должны быть видны в базе, значит с используемыми в данном случае компонентам нужно делать Commit (в отличии от ADO сомпонент в Delphi7), а это закрывает открытые выборки.
2. Вручную переоткрывать транзакцию
- Чтобы это значило? после каждой вставки данных, делать снова все select-ы ? Если я правильно понял, то возникает вопрос, - это нормально вообще такое советовать?
3. Использовать .CommitRetaining
- спасибо попробую, нагуглить в контексте использования с MS SQL не нашел. Придется пробовать самому.

PS
И совет - не используйте MS SQL - будет меньше гемороя...

Мой вам совет, НИКОГДА не советуйте такие советы, они очень сильно раздражают.
Ситуации разные бывают, я вообще пишу маленькие утилитки мордашки для ввода/обработки данных к УЖЕ существующей большой системе.
В таком контексте, такие советы выглядят просто ОЧЕНЬ глупо.
Так же как и дурацкий совет "Учить стандарты", глупее только совет "читайте историю".
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Использование TSQLTransaction

Сообщение Vadim » 08.12.2017 09:49:04

jsa
Вставку данных спокойно можно поручить компоненту MSSQLConnection, ведь это не требует визуализации данных. У него специально для такого дела есть ExecuteDirect(), а SQLQuery оставить только для выборки данных и последующего предъявления на форме.
У SQLTransaction можно самому поставить режим работы - она может самостоятельно ничего не делать (тогда всё в Ваших руках), может сама делать Commit, а может CommitRetaining.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Использование TSQLTransaction

Сообщение alexs » 08.12.2017 10:18:21

jsa
Вас понял :-) Умолкаю :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Использование TSQLTransaction

Сообщение jsa » 08.12.2017 10:22:11

Vadim писал(а):jsa
Вставку данных спокойно можно поручить компоненту MSSQLConnection, ведь это не требует визуализации данных. У него специально для такого дела есть ExecuteDirect(), а SQLQuery оставить только для выборки данных и последующего предъявления на форме.

Если я делаю вставки и выборки через один и тот же MSSQLConnection, то используется один и тот же SQLTransaction, и получается не важно через какой именно SQLкомпонент я произвожу действие.
Изменение данных по прежнему требует фиксации, т.к. вначале SQLTransaction послал sql команду Begin Tran (ADO компоненты этого не делают)
А при фиксации через Commit закрываются все выборки.

У SQLTransaction можно самому поставить режим работы - она может самостоятельно ничего не делать (тогда всё в Ваших руках), может сама делать Commit, а может CommitRetaining.

Так я фактически и спрашиваю в этой теме. Т.к. не нашел как отключить засыл команды Begin Tran
Подскажите пожалуйста как "в SQLTransaction можно самому поставить режим работы" ?
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Использование TSQLTransaction

Сообщение Vadim » 08.12.2017 10:40:59

jsa писал(а):Подскажите пожалуйста как "в SQLTransaction можно самому поставить режим работы" ?

SQLTransaction.Action =
>> caNone - сама ничего не делает. Ручное управление: SQLTransaction.StartTransaction - начинается транзакция, SQLTransaction.Commit - подтверждение транзакции;
>> caCommit - автоматическое подтверждение транзакции при каждом переходе с записи на запись в наборе данных SQLQuery;
>> caCommitRetaining - автоматическое подтверждение транзакции без закрытия текущего канала;
>> caRollback - автоматическая отмена транзакции при каждом переходе с записи на запись в наборе данных SQLQuery;
caRollbackRetaining - то же, но без закрытия текущего канала.

Могу где-то ошибиться, т.к. давно этой фигнёй уже не занимался... :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Sharfik и гости: 31

Рейтинг@Mail.ru