2011-07-25 18 views
2

ADO + DataSetProvider + ClientDataSetでプログラムしています。 ClientDataSetのApplyUpdateでは、これはフィールド・データ型に基づくパラメータを使用してADOコマンドを生成します。ADOのftBCDデータ型パラメータを持つoracleの数値列が "未指定エラー"(Oracle Provider for OleDB)

パラメータがftBCDの場合は、「不特定のエラー」が発生します。 ftFloat、ftExtended、ftCurrencyのデータ型を変更すると、コマンドは正常に実行されます。ただし、ADO + ClientDataSetを使用してパラメータのデータ型を変更することはできません。使用されるプロバイダは「Oracle Provider for OleDB」です。

"MicrosoftプロバイダOleDB for oracle"は問題なく実行されますが、非常に遅くCLOB列に問題があります。オラクルは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); 

答えて

0

これは実際の解決策ではありませんが、回避策になる可能性があります。

TADOCommandの代わりにTADOQueryを試してください。パラメータを作成しない場合は、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; 

注:私はこの瞬間を持っていない、いくつかの間違ったコードがあるかもしれない。私は明日の朝に訂正することができます。この問題の解決策として

+0

直接実行されるコマンドの場合、Oracleと互換性のない(またはエラーを生成する)データ型は使用しないでください。問題は、アーキテクチャがADOCommandを自動的に生成する "ADO + DataSetProvider + ClientDataSet"を使用することです。 – cralu

0

アーキテクチャADO + DataSetProvider + ClientDataSetにヶ月間使用している。、TADOQueryは、継承、及び方法PSExecuteStatementをオーバーライドします。コードは同じオーバーライドされ、コマンドを実行する前にエラーが発生したDataTypeftBCD、> - ftFloat)のみを置き換えます。

関連する問題