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 のソリューションを使用し、テーブル構造があまり変わらないことを願っています。