[英]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.