2

我用 ADO + DataSetProvider + ClientDataSet 编写了一个 delphi。在 ClientDataSet 的 ApplyUpdates 中,这会生成带有基于字段数据类型的参数的 ADO 命令。

当参数为 ftBCD 时,发生“未指定错误”。如果您更改 ftFloat、ftExtended 或 ftCurrency 的数据类型,则该命令将成功执行。但是使用 ADO+ClientDataSet 不能改变参数的数据类型。使用的提供程序是“Oracle Provider for OleDB”。

“Microsoft provider OleDB for oracle”执行没有问题,但速度很慢,而且我的 CLOB 列有问题。oracle是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);
4

2 回答 2

0

作为这个问题的解决方案已经在架构ADO++中使用了DataSetProvider几个月ClientDataSet。,一个TADOQuery继承的,并覆盖的方法PSExecuteStatement。代码同样被覆盖,仅在执行命令(等 --> )DataType之前用 Oracle 替换生成错误的代码。ftBCDftFloat

于 2012-02-01T19:30:00.197 回答
0

这不是真正的解决方案,但可能是一种解决方法。

代替 a 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,可能有一些不正确的代码。明天早上我可以更正。

于 2011-10-10T19:12:03.347 回答