2

iSeries データベースに依存する VB.Net で作成されたアプリで問題が発生しています。ユーザーはメモを保存できます。これは (非常に) 頻繁にメールボックスからコピー/貼り付けされます。

しかし、多くのメールには、データがデータベースに保存されるときに iDb2ConversionException をトリガーする無効な文字が含まれています。

とりあえず、データをスクラブして、無効な文字を一致する html エンティティに置き換えますが、そのアプローチは本当に嫌いです。

  • 変換リストを維持する必要があり、無効な文字のほとんどをカバーできたにもかかわらず、新しい文字が常に出てきます。
  • Client Access で STRSQL を使用して同じコマンドを実行すると、これらの無効な文字を実際に挿入できます。
  • 多くの固定長フィールドがあり、文字を HTML エンティティに置き換えると、UI レベルで文字列の最大長を強制することがはるかに難しくなります

パラメーターを使用しない場合、同じコマンドが ADO​​.NET で機能します (ただし、ユーザー入力をもう一度スクラブする必要があるため、全体として、問題を別の場所に移動するだけです)。

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = '€€€€€]]]]]]]]]]]°°°°°°§§§§§' where ...."
command.ExecuteNonQuery() ' Executes successfully '

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = @value where ...."
command.DeriveParameters()
command.Parameters("@value").Value = "'€€€€€]]]]]]]]]]]°°°°°°§§§§§'"
command.ExecuteNonQuery() ' Throws iDb2ConversionException '

私の接続文字列は次のとおりです。

Datasource=server;DataBase=DBNAME;DefaultCollection=DBCOLLECTION;HexParserOption=Binary;LibraryList=LIBRARIES;Naming=SQL;DataCompression=True;AllowUnsupportedChar=true;

その例外を取得せずにこれらの文字をDBに正常に書き込むためのオプションはありますか?

4

1 に答える 1

1

さて、やっと手に入れました。必要なのは、物理ファイルの CCSSID を変更することだけです (CCSID 297 でしばらくコンパイルされています)。

CHGPF FILE(MYLIB/MYFILE) CCSID(xxxx)

私の場合、CCSID 65535 を使用しています。ただし、これを使用すると、文字列の格納はそれほど簡単ではなく、文字列のバイト配列を抽出する必要があります。

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = @value where ...."
command.DeriveParameters()
command.Parameters("@value").Value = Encoding.Unicode.GetBytes("'€€€€€]]]]]]]]]]]°°°°°°§§§§§'")
command.ExecuteNonQuery() ' Works... '

しかし、良いことは、事実上すべての文字を保存できることです:)

于 2012-11-28T15:59:55.140 に答える