2

私はDelphi XEアプリケーションを持っています.Delphi XEアプリケーションは、その後ろにTClientDataSetaとTDataSetProviderプラスaを使用してOracle XEデータベースにアクセスします。TADOQuery書き込みたいテーブルにはNUMBER(19)フィールドがあります。

次のように値を書き込んでいます。

myDataModule.myClientDataSet.FieldByName('ID').AsLargeInt := ID;

1234567890123456789に丸められるような ID があるとし1234567890123460000ます。

どうすればそれを回避できますか?

4

3 に答える 3

3

TClientDataSetフィールドが明示的に作成されていることを確認してくださいftLargeint。そうしないと、このような丸めの問題が発生する可能性があります。

OracleにアクセスするためにADOを使用することを忘れてください。ADOによってインターフェイスされるすべてのOleDBプロバイダーはBLOBの処理にバグがあることに注意してください。MicrosoftのバージョンはBLOBを処理せず、Oracleのバージョンは行の1/4に対してランダムにnullを返します...同様の問題がケース、数値フィールドについて。

DBExpresssドライバーやBDEなど、Oracleにアクセスするための他の手段を検討することもできます。一部のサードパーティコンポーネントも利用できます。

Oracleへの無料の直接アクセスクラスは、このような数値フィールドをネイティブに処理し、TDataSet変換なしでInt64値を直接処理します(これも問題の原因である可能性があります)。たとえば、「OCIバインドおよび定義呼び出し用の64ビット整数ホストデータ型」という名前の最新の11g機能を実装している唯一のDelphiユニットだと思います。クライアントドライバ(BDE、プロバイダー、ローカル構成)は必要ありません。DelphiexeでOracle Instance Client dllをコピーするだけで、Oracleに直接接続できます。結果として得られる速度は驚くべきものです。

于 2012-08-18T05:47:33.140 に答える
1

Delphi プロジェクト オプションを設定use debug .dcusし、最初の変数割り当てからデータを Oracle トランスポート ドライバに渡すまでのすべてのコードを実行しましたか? 値が 15 桁に丸められていることを確認しましたか?

Delphi 以外のユーザーが同じ問題を抱えていた他のフォーラムの投稿がいくつかありますが、これはto_char()関数の使用が原因でした。値を設定してからデータベースに投稿するまでの間のどこかで (または ) の値が文字列に変換されているのではないでしょうかnumber(19)BigInt

  • dbaforums.org (動作するインスタンスと動作しないインスタンスの 2 つのインスタンスについて説明)
  • forums.devshed.com (あまり参考にはなりませんが、問題の例です)
于 2012-08-18T00:31:43.693 に答える
0

TClientDataSetandを捨てて、を直接TDataSetProvider使用して値を挿入することにしました。TADOQuery

つまり、私は今このようなものを持っています:

myDataModule.myQuery.SQL.Clear;
myDataModule.myQuery.SQL.Add('INSERT INTO mytable (ID) VALUES(:ID)');
myDataModule.myQuery.Prepared := True;
myDataModule.myQuery.Parameters.ParamByName('ID').Value := 1234567890123456789;
myDataModule.myQuery.ExecSQL;

完璧な解決策ではありませんが、うまくいきます。

于 2012-08-27T06:37:29.497 に答える