Пара заметок:
1) Вы должны использовать параметризованные запросы
//Assuming you already have a connection somewhere that is opened.
var sql = "INSERT INTO mytable (name, theblob) VALUES (?, ?);";
using (var command = new IfxCommand(sql, connection))
{
command.Parameters.Add(new IfxParameter()).Value = "foo";
command.Parameters.Add(new IfxParameter()).Value = ifxBlob;
}
Несколько вещей, на которые следует обратить внимание: Informix имеет ошибку, когда дело доходит до Client SDK 3.5.xC7 (пока). Вы можете легко передать байтовый массив во время вставок, но при обновлении у вас будет ошибка 609, если вы передадите массив byte []. Вместо этого вы должны использовать объект
IfxBlob
.
public IfxBlob CreateIfxBlob(byte[] data)
{
//Get the connection however you like and make sure it's open...
//Obviously you should make this method handle exceptions and the such.
IfxBlob blob = connection.GetIfxBlob();
blob.Open(IfxSmartLOBOpenMode.ReadWrite);
blob.Write(data);
blob.Close();
return blob;
}
Вы должны передать IfxBlob вместо этого во время обновления, так что вы могли бы также сделать это во время вставок.
Также имейте в виду, что если вы попытаетесь установить null
, вы получите ошибку. Вместо этого, если значение равно нулю, передайте DBNull.Value.
public Object AsDBValue(Object value) //Or this Object value if you want it as an extension
{
if (value == null)
return DBNull.Value;
//Other checks
if (value is Enum)
return Convert.ChangeType(value, value.GetType().GetEnumUnderlyingType());
//Is Blob?
if (value is byte[])
return GetIfxBlob(value as byte[]);
return value;
}
НЕ УКАЗАТЬ ТИП ПАРАМЕТРА
//These will lead to errors unless you typecast the parameters in the query.
new IfxParameter { IfxType = IfxType.Blob };
new IfxParameter { DbType = DbType.Binary };
Если вы выполните одно из этих действий, вам нужно будет сделать следующее:
- Когда значение Blob не равно нулю :
"INSERT INTO mytable (name, theblob) VALUES (?, ?::blob);";
- Когда значение BLOB-объекта равно нулю :
"INSERT INTO mytable (name, theblob) VALUES (?, ?::byte);";
Вы можете видеть, что в заднице будет сложно иметь разные запросы из-за типа и значения. Просто не указывайте DbType или IfxType и позволяйте провайдеру Informix .NET отображать правильные типы для вас (даже если он не может правильно отобразить массив byte [] при обновлении).
Надеюсь, у вас это получится, потому что я прошел через те же усилия, пытаясь выяснить это и обнаружив, как мне кажется, ошибку в поставщике Informix .NET (версия: 3.5.xC7).