1

Delphi 6 + Oracle 10gR2 + ADO + ClientDataSet に問題があります。

フィールド NUMBER(19,9) で集計関数を実行すると、結果の列は Delphi に NUMBER データ型を返し、一部のマシンでは精度 38 の TBCDField としてロードされ、すべてがうまくいきますが、一部のマシンでは精度 255 の TBCDField としてロードされ、フィールドで BCD オーバーフローが発生します。

問題を再現するには、列 NUMBER (19,9) を持つテーブルを作成し、SELECT SUM( column_name ) column_name FROM table_name GROUP BY column_nameを実行します。

列が NUMBER(19,9) であるにもかかわらず、結果の列は精度が定義されていない NUMBER になります。

Delphi で、DataSetProvider がリンクされ、ClientDataSet が DataSetProvider にリンクされた状態で、クエリを ADOQuery にロードします。ClientDataSet.Open を呼び出した後、一部のマシンでは NUMBER フィールドに BCD オーバーフロー メッセージが表示されますが、多くのマシンでは問題なく動作します。

midas.dll、ADO、サーバー、ユーザー、Oracle クライアントが両方のマシンですべて同じであるのに、一部のマシンでこの 255 の精度が得られるのはなぜですか? 何か案は?

4

2 に答える 2

1

型キャストを試す

Select **CAST(NUMBER_FLD as VARCHAR2(15))** as NUMBER_FLD from DUAL;

Delphi ではStringField(ClientDataset) コンポーネントですが、エイリアスで取得すると、CdsOracleSQL.FieldByname('NUMBER_FLD').AsFloatまたはCdsOracleSQLNUMBER_FLD.AsFloat動作します。

BCDField小数点記号を失い、整数のように機能する理由がわかりません...

于 2014-05-15T18:45:03.793 に答える
0

あなたの決定的な答えはありませんが、両方のマシンに同じバージョンのクライアント dll があると確信していますか? 干渉している他のソフトウェアがインストールされている可能性があります。クライアント マシンでWindows Process Explorerを実行してみて、使用していると思われる dll が実際にクライアント アプリケーションで使用されているものであることを確認します。

于 2009-07-17T22:54:33.663 に答える