【问题标题】:Number column in oracle with ftBCD datatype parameter in ADO occurs "Unspecified error" (Oracle Provider for OleDB)在 ADO 中具有 ftBCD 数据类型参数的 oracle 中的数字列发生“未指定错误”(Oracle Provider for OleDB)
【发布时间】:2011-07-25 20:08:17
【问题描述】:

我用 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,client是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);

【问题讨论】:

    标签: oracle delphi oledb ado tclientdataset


    【解决方案1】:

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

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

    【讨论】:

    • 对于直接执行的命令,不要使用与 Oracle 不兼容(或产生错误)的 DataTypes。问题是架构使用“ADO + DataSetProvider + ClientDataSet”,自动生成一个ADOCommand。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 2011-06-05
      • 2016-08-20
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多