IBM Informix SDK:
声明:Update mytable set myblobcolumn = ? where myid = 1;
using (IfxConnection conn = GetIfxConnection())
using (IfxCommand cmd = new IfxCommand(updateSql, conn))
{
var param = new IfxParameter("myblobcolumn", IfxType.Blob) { IsNullable = true };
cmd.Parameters.Add(param).Value = DBNull.Value
cmd.ExecuteNonQuery(); //ERROR [HY000] [Informix .NET provider][Informix]Illegal attempt to use Text/Byte host variable.
}
別のIfxBlob
オブジェクトで更新すると正常に動作しますが、更新するとDBNull.Value
エラーが発生します。パラメータ化された更新を使用してblob列を「設定解除」する方法を知っている人はいますか?
アップデート:
わかりました、私はいくつかの調査を行い、物事を少し減らしました。
まず、IfxType
パラメーターを生成するときに明示的に宣言すると、データベース内のnull値から切り替えて実際のIfxBlobを使用するときに、.NETドライバーがDBNull.ValueまたはByte[]配列を変換する際に問題が発生することがわかりました。データベース。基本的に:
- 列に値が含まれていて、代わりにnullを格納したい場合は、次のようにパラメーターを型キャストする必要があります
UPDATE mytable SET myblobcolumn = ?::byte WHERE myid = 1;
。DBNull.Value
これにより、の値をエラーなしで保存できます。 - 列にnull値が含まれていて、代わりに実際の値を格納したい場合は、次のようにパラメーターを型キャストする必要があります
UPDATE mytable SET myblobcolumn = ?::blob WHERE myid = 1;
。これにより、IfxBlob値を保存できます。
さて、これをすべて回避するために、Parameterの初期化をParameterNameプロパティの設定のみに減らしましたvar param = new IfxParameter { ParameterName = "myblobcolumn" }
(それでも、コレクションから参照できるようにするだけで、それ以上は何もしません)。これにより、パラメーターを型キャストしなくてもステートメントを保持できます。
だから...私は次のように残されています:
声明:UPDATE mytable SET myblobcolumn = ? where myid = 1;
using (IfxConnection conn = GetIfxConnection())
using (IfxCommand cmd = new IfxCommand(updateSql, conn))
{
var param = new IfxParameter { ParameterName = "myblob" }
cmd.Parameters.Add(param);
var value = GetSomeValue();
if (value is Byte[])
cmd.Paremeters["myblob"].Value = GetIfxBlob(value);
else
cmd.Parameters["myblob"].Value = DBNull.Value;
//...
}
これは問題なく動作しますが、これに似たInformix .NETドライバー(3.50.xC7)のバグを発見したと思います。基本的に、提供されたリンクは、挿入を行うときに.NETドライバーがbyte[]配列を適切に使用してblobを作成できないバグが発見されたことを示しています。これは、 INSERTステートメントを実行cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 };
するときに文字通り実行できるという点で修正されています。ただし、UPDATEステートメントにbyte []配列を使用すると、ドライバーは例外を出します。したがって、実際にIfxBlobインスタンスを作成し、実際のbyte[]配列の代わりにそれらを使用する必要がありました。
これがドライバーのバグではない場合、この質問を開いたままにして、ブロブフィールドを設定/設定解除する適切な方法がUPDATESにbyte[]配列を使用していることを確認する必要があります。