Oracle中的数字列与ADO中的ftBCD数据类型参数发生“未指定错误” (OleDB 的 Oracle 提供程序)

发布于 2024-11-26 10:01:14 字数 1115 浏览 11 评论 0原文

我用 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。

德尔福就是德尔福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);

I have programing a delphi with ADO + DataSetProvider + ClientDataSet. In ApplyUpdates of the ClientDataSet, this generate the ADOcommand with parameters based in fields datatypes.

When a parameter is ftBCD, occurs "Unspecified error". If you change datatype for ftFloat, ftExtended or ftCurrency, the command is executed successfully. But the datatype of parameter cannot change using ADO+ClientDataSet. The provider used is "Oracle Provider for OleDB".

The "Microsoft provider OleDB for oracle" execute without problems, but is very slow and I have problems with CLOB column. The oracle is 11g and the client is 11.2.0.2.

The Delphi is Delphi XE. Sample code for error:

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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呆头 2024-12-03 10:01:14

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

尝试使用 TADOQuery,而不是 TADOCommand;并且不要创建参数,让 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,可能有一些不正确的代码。明天早上我可以改正。

This is not really a solution, but may be a workaround.

Instead of a TADOCommand, try with TADOQuery; and don't create the param, let the ADO do it for you with ParseSQL. An example:

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;

NOTE: I don't have IDE a this moment, may be there are some incorrect code. I can correct tomorrow morning.

梦巷 2024-12-03 10:01:14

作为这个问题的解决方案,在架构上使用了几个月的ADO + DataSetProvider + ClientDataSet.,继承了一个TADOQuery ,并重写方法 PSExecuteStatement。代码是相同的覆盖,只是在执行命令之前用 Oracle 替换生成错误的 DataTypeftBCD 等 --> ftFloat) 。

As a solution to this problem have used for months in architecture ADO + DataSetProvider + ClientDataSet., a TADOQuery inherited, and override the method PSExecuteStatement. The code is same overrided, only replacing the DataType that generate errors with Oracle before executing the command (ftBCD, etc --> ftFloat).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文