繁体   English   中英

带有ADO中ftBCD数据类型参数的oracle中的Number列出现“未指定的错误”(Oracle Provider for OleDB)

[英]Number column in oracle with ftBCD datatype parameter in ADO occurs “Unspecified error” (Oracle Provider for OleDB)

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

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

“ Microsoft提供程序oracle的OleDB”执行没有问题,但是非常慢,并且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);

这并不是真正的解决方案,但可以解决。

尝试使用TADOQuery代替TADOCommand 并且不创建参数,让ADO使用ParseSQL为您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,可能是一些错误的代码。 我明天早上可以纠正。

作为此问题的解决方案,在ADO + DataSetProvider + ClientDataSet 。体系结构中使用了数月之PSExecuteStatement ,继承了TADOQuery并重写了PSExecuteStatement方法。 代码被相同的覆盖,仅在执行命令( ftBCD等-> ftFloat )之前用Oracle替换会产生错误的DataType

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM