Числовой столбец в Oracle с параметром типа данных ftBCD в ADO происходит «Неопределенная ошибка» (поставщик Oracle для OleDB) - PullRequest
2 голосов
/ 26 июля 2011

Я программирую delphi с помощью ADO + DataSetProvider + ClientDataSet. В ApplyUpdates ClientDataSet это создает команду ADO с параметрами, основанными на типах полей.

Когда параметром является ftBCD, возникает «Неуказанная ошибка». Если вы измените тип данных для ftFloat, ftExtended или ftCurrency, команда будет выполнена успешно. Но тип данных параметра не может быть изменен с помощью ADO + ClientDataSet. Используется поставщик «Oracle Provider for OleDB».

«Поставщик Microsoft OleDB для оракула» выполняется без проблем, но очень медленно, и у меня проблемы со столбцом CLOB. Оракул - 11g, а клиент - 11.2.0.2.

Delphi - это Delphi XE. Пример кода для ошибки:

vAdo := TADOConnection.Create(nil);
vAdo.LoginPrompt := false;
vAdo.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Password=;Persist Security Info=True;User ID=HR;Data Source=server/orcl;Extended Properties=""';
vAdo.Connected := True;

vAdoCommando := TADOCommand.Create(nil);
vAdoCommando.Connection := vAdo;
vAdoCommando.CommandText := 'UPDATE HD_PRIORIDADE SET TEMPORESPOSTA = ? WHERE HANDLE = ? ';

vParametro := vAdoCommando.Parameters.AddParameter;
vParametro.DataType := ftBCD;
vParametro.Value     := 12.3;
vParametro := vAdoCommando.Parameters.AddParameter;
vParametro.Value := 1;

vAdoCommando.ExecuteOptions := [eoExecuteNoRecords];
vAdoCommando.Execute(vResult, EmptyParam);

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

В качестве решения этой проблемы уже месяцами используются в архитектуре ADO + DataSetProvider + ClientDataSet., TADOQuery наследуются и переопределяют метод PSExecuteStatement. Код переопределяется так же, заменяя только DataType, который генерирует ошибки в Oracle перед выполнением команды (ftBCD и т. Д. -> ftFloat).

0 голосов
/ 10 октября 2011

Это не совсем решение, но может быть обходным путем.

Вместо TADOCommand, попробуйте с TADOQuery; и не создавайте параметр, пусть ADO сделает это за вас с ParseSQL. Пример:

qryUpdPrioridade:= TADOQuery.Create(nil)
try
  qryUpdPrioridade.Connection:= vAdo;
  qryUpdPrioridade.SQL.Add('UPDATE HD_PRIORIDADE SET');
  qryUpdPrioridade.SQL.Add('  TEMPORESPOSTA = :TEMPORESPOSTA');
  qryUpdPrioridade.SQL.Add('WHERE HANDLE = :HANDLE');
  qryUpdPrioridade.Parameters.ParseSQL(qryUpdPrioridade.SQL.Text, True);

  qryUpdPrioridade.Parameters.ParamByName('TEMPORESPOSTA').Value:= 12.3;
  qryUpdPrioridade.Parameters.ParamByName('HANDLE').Value:= 1;

  try
    qryUpdPrioridade.ExecSQL;
  except
    On E: Exception do
      raise Exception.CreateFmt('Falha na atualização:'#13#10'%s: %s', [E.ClassName, E.Message]);
  end;
finally
  qryUpdPrioridade.Free;
end;

ПРИМЕЧАНИЕ. В данный момент у меня нет среды IDE, возможно, имеется неправильный код. Я могу исправить завтра утром.

...