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 [] для ОБНОВЛЕНИЙ.