2

DBExpress TSQLQuery を使用して、Delphi で次のようなクエリを実行しています。

ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD=(:AMYFIELD) ');

ActiveSQL.ParamByName('AMYFIELD').AsString    := 'Some random string that is to long for the field';

ActiveSQL.Open;

それを実行すると、 open コマンドを実行すると、次の例外が発生します

クラス TDBXError でメッセージ「算術例外、数値オーバーフロー、または文字列の切り捨て」が発生しました。

これは、AMYFIELD の文字列がテーブル フィールドの長さよりも長いことが原因です。MYFIELD は Varchar(10) です。短い文字列にトリミングすると問題なく動作し、その文字列を直接 SQL に追加すると、

  ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" ');

つまり、切り捨てについて不平を言うことはありません。これが挿入/更新である場合、切り捨てについて知りたいのですが、検索に使用されたばかりなので、停止したいと思います。

文字列を切り捨ててもよいことを DBExpress に伝える方法はありますか? または、これに対して実行可能な回避策がありますか

次のようなものを追加する必要は避けたい

l_input := copy(l_input,0,fieldLength-1);

乱雑に見え、コードの保守が難しくなります。

Delphi 2007 と Firebird 2 をインターベース ドライバ経由で使用していますが、それが役に立ちますか?

アップデート:

@ Erick Sasseそれはあなたの権利のように見えます。firebird の FAQ サイトhttp://www.firebirdfaq.org/faq79/でエラー メッセージを見つけました。

@ inzKulozik ActiveSQL.ParamByName('AMYFIELD').Size を動作させることはできませんが、LeftStr は正常に動作しますが、これはまだ面倒で、維持するのが困難です。

SQL に substr を追加するメソッドも見ました。

select * from mytable where myname = substr(:MYNAME,0,10)

理想的には、この問題を修正する Firebird/DBExpress 構成設定が必要ですが、それが見つかるまで inzKulozik のソリューションを使用し、テーブル構造があまり変わらないことを願っています。

4

2 に答える 2

2
l_input := copy(l_input,**0**,fieldLength-1);

位置0から部分文字列をコピーすることはできません!

これを試して:

l_input := LeftStr(l_input, fieldLength);

また

ActiveSQL.ParamByName('AMYFIELD').AsString := LeftStr('Some random string that is to long for the field', ActiveSQL.ParamByName('AMYFIELD').Size);

また

with ActiveSQL.ParamByName('AMYFIELD') do
  AsString := LeftStr('Some random string that is to long for the field', Size);
于 2008-12-25T12:24:07.273 に答える
2

このエラーメッセージは、DBXではなくFirebirdからのものです。DBXは、入力したとおりにパラメーターをデータベースに送信すると思います。したがって、データベースを切り捨てるのはFirebirdの仕事である必要があります。

于 2008-12-26T11:24:27.503 に答える