Ошибка Multiple-step OLE DB operation generates error...
Добавлено: Пн 24 сен 2012 15:49
Здравствуйте.
Использую Delphi 7 и SDAC 6.1.3.
Есть представление, собранное из двух таблиц и имеющее триггеры INSTEAD OF INSERT, UPDATE и DELETE. Таблицы связаны 1 к 1 по автоинкрементному полю. При работе с этим представлением через TMSQuery возникло две проблемы:
1. Компонент TMSQuery не получал новое значение ключа при добавлении записи, так как scope_identity() возвращала в этом случае пустое значение.
2. При удалении записи получаю сообщение о неверном типе автоматически сгенерированного компонентом параметра, через который передаётся значение ключа удаляемой записи.
Первую проблему удалось решить, передав новое значение ключа из триггера через контекст. При этом пришлось явно указать запрос на вставку записи в свойстве SQLInsert, заменив select :id = scope_identity() на select :id = cast(context_info() as int). Работает нормально, но очень жаль отказываться от автоматической генерации запроса на вставку. Хотелось бы иметь возможность скорректировать такой запрос непосредственно перед его выполнением. Или такая возможность существует? Тогда подскажите, пожалуйста, как это можно сделать.
Во втором случае также выполняется автоматически сгенерированный запрос на удаление записи, который в dbMonitor'е выглядит так:
Выполнение этого запроса приводит к ошибке:
Список параметров в dbMonitor'е почему-то содержит два одинаковых:
Прописывание SQLDelete выражением
приводит к возникновению той же ошибки, только со ссылкой на параметр из ручного запроса:
При этом список параметров снова содержит два параметра, но теперь уже разных:
Что можно сделать в этом случае?
Использую Delphi 7 и SDAC 6.1.3.
Есть представление, собранное из двух таблиц и имеющее триггеры INSTEAD OF INSERT, UPDATE и DELETE. Таблицы связаны 1 к 1 по автоинкрементному полю. При работе с этим представлением через TMSQuery возникло две проблемы:
1. Компонент TMSQuery не получал новое значение ключа при добавлении записи, так как scope_identity() возвращала в этом случае пустое значение.
2. При удалении записи получаю сообщение о неверном типе автоматически сгенерированного компонентом параметра, через который передаётся значение ключа удаляемой записи.
Первую проблему удалось решить, передав новое значение ключа из триггера через контекст. При этом пришлось явно указать запрос на вставку записи в свойстве SQLInsert, заменив select :id = scope_identity() на select :id = cast(context_info() as int). Работает нормально, но очень жаль отказываться от автоматической генерации запроса на вставку. Хотелось бы иметь возможность скорректировать такой запрос непосредственно перед его выполнением. Или такая возможность существует? Тогда подскажите, пожалуйста, как это можно сделать.
Во втором случае также выполняется автоматически сгенерированный запрос на удаление записи, который в dbMonitor'е выглядит так:
Код: Выделить всё
DELETE FROM vwTask
WHERE
idMain = ?;
Код: Выделить всё
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
Parameter[1] :P_0_Old_idMain - invalid ParamType (Status = 1h).
Код: Выделить всё
Name Type Data Type In Value Out Value
P_0_Old_idMain IN AutoInc 123870
P_0_Old_idMain IN AutoInc 123870
Код: Выделить всё
delete from vwTask where idMain = :idMain
Код: Выделить всё
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
Parameter[1] :P_0_idMain - invalid ParamType (Status = 1h).
Код: Выделить всё
Name Type Data Type In Value Out Value
P_0_Old_idMain IN AutoInc 123870
P_0_idMain IN AutoInc 123870