2

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[]配列を使用していることを確認する必要があります。

4

1 に答える 1

1

私が経験したことはバグではないと誰も述べていないので、私は自分の発見を答えとして投稿すると思いました。

  1. Informix .NETプロバイダー(バージョン:3.5.xC7)の場合、 (または)を生成するときに、IfxTypeまたはを明示的に設定しないでください。代わりに、パラメーターを生成し、Informix.NETプロバイダーが正しいタイプをマップできるようにします。これにより、パラメーターの型キャストについて心配する必要がなくなります(つまり、「?::blob」と「?:: byte」は避けてください)。DbTypeIfxParameterDbParameter

  2. バグ(ver:3.5.xC7)により、byte []配列をBlobフィールドに挿入することは正常に機能しますが、byte[]配列を使用してそのBlobフィールドを更新すると609エラーが発生します。代わりに、IfxBlobを作成して値として設定する必要があります。これは、挿入を行うときにも機能します。

于 2011-06-20T20:13:30.733 に答える