2

Firebird 2.1、DevArtおよびDelphi 2010のDBExpressドライバーを使用しています。Delphi2006で動作していたレポートの一部が動作を停止し、「算術例外、数値オーバーフロー、または文字列の切り捨て」が発生したことを示すエラーメッセージが表示されました。私のコードのこの時点でエラーが発生しました:

cds.Data := dsProvider.Data;

エラーの原因となった場所をSQLステートメントで見つけました。

iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType

T.sCodeはVarchar(10)フィールドです。私の結論は、クエリがdsProviderにデータを返し、dsProvider.Dataがcds.Dataに渡されると、cdsコンポーネントが最初に受け取った値に基づいてフィールド幅を設定するということです。「iif」をCASEステートメントに変更すると、同じエラーメッセージが表示されます。私はこれを行うことで問題を回避することができました:

 CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType

これはCASTなしのDelphi2006で機能していたため、新しい動作はTClientDatasetの更新によるものと思われます。古い、より寛容な行動をとることは素晴らしいことです。苦情なしにこれを受け入れるようにClientDatasetを構成する方法はありますか、それともiifおよびCASEステートメントに基づく文字列の結果をCASTするようにユーザーに指示する必要がありますか?

4

2 に答える 2

0

私は前回の仕事でfirebirdをよく使用していましたが、このエラーは、データベースに大きな(長さの)varcharフィールド値が既に格納されていて、delphiで文字列を「取得」しようとしているときに発生し、値を更新してみてください。 dbをより小さな(長さの)varcharに変換します。うまくいくかどうかはわかりませんが、試してみてください。

于 2010-07-29T16:35:51.390 に答える
0

さて、もう少し経験を積むと、この切り捨てエラーがDelphi2010バージョンのClientDatasetsと一貫して表示されているように見えます。クエリでCASTを使用する必要のない解決策を見つけた場合は、ここに投稿します。しかし、今のところ、私はこの投稿を閉じるつもりです。

于 2010-08-20T20:59:20.200 に答える