Обращаюсь за помощью.
Пишу на C++ Builder 6.0, через ADOTable/ODBC имею доступ к таблице на Oracle.
Добавляю запись (TDataSet::Append(), TDataSet::Post()).
Потом пытаюсь редактировать (TDataSet::Edit()). TDataSet::Post() вызывает исключение EOleException "Не удаётся найти строку для обновления. Некоторые значения могли быть изменены со времени её последнего чтения." Пробовал играть со свойствами (типа CursorLocation, IsolationLevel...). Пробовал завершать транзакцию руками (TCustomADODataSet::UpdateBatch()). Ничего не помогает. После добавления записи она уже есть в базе данных, однако из программы с ней ничего нельзя сделать. Если перелогиниться (или сделать TCustomADODataSet::ReQuery()), то всё нормально.
Если кто сталкивался, подскажите, как сделать, чтобы всё работало цивильно (то есть, после добавления записи её можно было редактировать и удалять, как любую другую).
Здравствуйте, excell, Вы писали:
E>Обращаюсь за помощью. E>Пишу на C++ Builder 6.0, через ADOTable/ODBC имею доступ к таблице на Oracle. E>Добавляю запись (TDataSet::Append(), TDataSet::Post()). E>Потом пытаюсь редактировать (TDataSet::Edit()). TDataSet::Post() вызывает исключение EOleException "Не удаётся найти строку для обновления. Некоторые значения могли быть изменены со времени её последнего чтения." Пробовал играть со свойствами (типа CursorLocation, IsolationLevel...). Пробовал завершать транзакцию руками (TCustomADODataSet::UpdateBatch()). Ничего не помогает. После добавления записи она уже есть в базе данных, однако из программы с ней ничего нельзя сделать. Если перелогиниться (или сделать TCustomADODataSet::ReQuery()), то всё нормально.
E>Если кто сталкивался, подскажите, как сделать, чтобы всё работало цивильно (то есть, после добавления записи её можно было редактировать и удалять, как любую другую).
Я бы в первую очередь посмотрел, какую инструкцию отправляет на сервер ADO и почему этот UPDATE не обрабатиывает ни одной записи.
Здравствуйте, pkarklin, Вы писали:
P>Я бы в первую очередь посмотрел, какую инструкцию отправляет на сервер ADO и почему этот UPDATE не обрабатиывает ни одной записи.
Проблема отпала, когда я поставил свойство позиции курсора на сервер. Однако, остаётся вопрос: чем это чревато в плане производительности, и почему всё-таки с курсором на стороне клиента не работало?
Здравствуйте, excell, Вы писали:
E>Здравствуйте, pkarklin, Вы писали:
P>>Я бы в первую очередь посмотрел, какую инструкцию отправляет на сервер ADO и почему этот UPDATE не обрабатиывает ни одной записи.
E>Проблема отпала, когда я поставил свойство позиции курсора на сервер. Однако, остаётся вопрос: чем это чревато в плане производительности, и почему всё-таки с курсором на стороне клиента не работало?
Ну так Вы посмотрели, какая инструкция генериться ADO и отправляется на сервер. Кстати, работа c SQL серверами через Table комопненты порочный путь.
Здравствуйте, pkarklin, Вы писали:
P>Здравствуйте, excell, Вы писали:
E>>Здравствуйте, pkarklin, Вы писали:
P>>>Я бы в первую очередь посмотрел, какую инструкцию отправляет на сервер ADO и почему этот UPDATE не обрабатиывает ни одной записи.
E>>Проблема отпала, когда я поставил свойство позиции курсора на сервер. Однако, остаётся вопрос: чем это чревато в плане производительности, и почему всё-таки с курсором на стороне клиента не работало?
P>Ну так Вы посмотрели, какая инструкция генериться ADO и отправляется на сервер. Кстати, работа c SQL серверами через Table комопненты порочный путь.
Я не смог посмотреть, чего она там посылает. Я увидел другие SQL-запросы, которые я посылаю, и селект для моей таблицы, а потом — ничего. Как будто TADOTable не через SQL правит табличку. Смотрел через события в TADOTable и в VS Analyzer
Здравствуйте, excell, Вы писали:
E>Обращаюсь за помощью. E>Пишу на C++ Builder 6.0, через ADOTable/ODBC имею доступ к таблице на Oracle. E>Добавляю запись (TDataSet::Append(), TDataSet::Post()). E>Потом пытаюсь редактировать (TDataSet::Edit()). TDataSet::Post() вызывает исключение EOleException "Не удаётся найти >....................
E>Если кто сталкивался, подскажите, как сделать, чтобы всё работало цивильно (то есть, после добавления записи её можно было редактировать и удалять, как любую другую).
Такая проблема встречается, если в таблице есть автоинкрементируемые или вычисляемые колонки. В этом случае изменение записи или создание новой, требует не выполнение перезапроса к серверу. Чтобы этого избежать, необходимо построить запрос так, чтобы в DataSet эти колонки не возвращались и тогда можно работать с полученным набором записей без описанной проблемы.