Oracle中的数字列与ADO中的ftBCD数据类型参数发生“未指定错误” (OleDB 的 Oracle 提供程序)
我用 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这并不是真正的解决方案,但可能是一种解决方法。
尝试使用
TADOQuery
,而不是TADOCommand
;并且不要创建参数,让 ADO 使用ParseSQL
为您完成此操作。一个例子:注意:我现在没有IDE,可能有一些不正确的代码。明天早上我可以改正。
This is not really a solution, but may be a workaround.
Instead of a
TADOCommand
, try withTADOQuery
; and don't create the param, let the ADO do it for you withParseSQL
. An example:NOTE: I don't have IDE a this moment, may be there are some incorrect code. I can correct tomorrow morning.
作为这个问题的解决方案,在架构上使用了几个月的
ADO
+DataSetProvider
+ClientDataSet
.,继承了一个TADOQuery
,并重写方法PSExecuteStatement
。代码是相同的覆盖,只是在执行命令之前用 Oracle 替换生成错误的DataType
(ftBCD
等 -->ftFloat
) 。As a solution to this problem have used for months in architecture
ADO
+DataSetProvider
+ClientDataSet
., aTADOQuery
inherited, and override the methodPSExecuteStatement
. The code is same overrided, only replacing theDataType
that generate errors with Oracle before executing the command (ftBCD
, etc -->ftFloat
).