Informix (C #): Как правильно установить / снять поле BLOB-объектов? - PullRequest
2 голосов
/ 12 июня 2011

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-объектов с помощью параметризованного обновления?


Обновление:

Хорошо, я провел некоторые исследования и сократил количествоbit.

Во-первых, я обнаружил, что, если я явно объявляю IfxType при генерации параметра, у драйвера .NET возникают проблемы при преобразовании DBNull.Value или даже массива Byte [] при переключении назад и вперед изнулевое значение в базе данных и наличие фактического IfxBlob в базе данных.В основном:

  • Если столбец содержит значение, и я хочу вместо него сохранить значение NULL, тогда я должен ввести свой параметр следующим образом: UPDATE mytable SET myblobcolumn = ?::byte WHERE myid = 1;.Это позволяет мне хранить значение DBNull.Value без каких-либо ошибок.
  • Если столбец содержит нулевое значение и я хочу сохранить в нем фактическое значение, тогда я должен ввести свой параметр следующим образом: UPDATE mytable SET myblobcolumn = ?::blob WHERE myid = 1;.Это позволяет мне сохранить значение IfxBlob.

Теперь, чтобы избежать всего того, что я уменьшил, инициализация параметра сводилась только к установке свойства 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 [] для создания большого двоичного объекта при выполнении вставки.Это было исправлено в том, что я могу буквально сделать cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 }; при выполнении оператора INSERT .Однако драйвер по-прежнему выдает исключение при использовании массива byte [] для оператора UPDATE .Следовательно, мне пришлось фактически создавать экземпляры IfxBlob и использовать их вместо фактического массива byte [].

Если это не ошибка в драйвере, тогда этот вопрос должен оставаться открытым, чтобы увидеть, как правильноДля установки / сброса поля BLOB-объекта используется массив byte [] для ОБНОВЛЕНИЙ.

1 Ответ

1 голос
/ 21 июня 2011

Я полагал, что, поскольку никто не заявил, что то, что я испытал, не является ошибкой, я опубликую свои выводы как ответ:

  1. Для поставщика Informix .NET (версия: 3.5.xC7), НЕ устанавливайте явно IfxType или DbType при генерации IfxParameter (или DbParameter).Вместо этого просто сгенерируйте параметр и позвольте провайдеру Informix .NET отобразить правильные типы для вас.Это позволяет вам не беспокоиться о типизации ваших параметров (то есть избегать "? :: blob" и "? :: byte").

  2. Из-за ошибки (ver:3.5.xC7), вставка массива byte [] в поле Blob работает нормально, но обновление этого поля Blob с использованием массива byte [] приведет к ошибке 609.Вместо этого IfxBlob необходимо будет создать и установить в качестве значения.Это также работает при выполнении вставок.

...