就像这些链接一样
我也无法在informix数据库上只插入与byte []相关的操作。我尝试了很多方法并通过了IBM网站。但没有解释“如何使用c#”将byte []插入到blob列中。
“LINK 4”非常有帮助。但我遇到这个代码的问题。
Error: The %0 enumeration value, %1, is invalid.
At line: blob.Open(IfxSmartLOBOpenMode.ReadWrite);
if i use cmd.Parameters.Add(new IfxParameter()).Value = byteuploaded`;
这是我的代码段。
protected void uploadfile_Click(object sender, EventArgs e)
{
string extension;
// checks if file exists
if (!_imageUpload.HasFile)
{
_resultLbl.Text = "Please, Select a File!";
return;
}
// checks file extension
extension = System.IO.Path.GetExtension(_imageUpload.FileName).ToLower();
if (!extension.Equals(".jpg") && !extension.Equals(".jpeg") && !extension.Equals(".png"))
{
_resultLbl.Text = "Only image files (.JPGs and .PNGs) are allowed.";
return;
}
try
{
// ========= This is not working ==============
string sqlQuery = "insert into db95:TestBlobUpload (id ,fileblob) values('2', 'two');";
// ========= This is working properly ==============
//string sqlQuery = "insert into db95:TestBlobUpload (id ,filetext) values('4',?);";
string connString = "Database=db95;Host=172.16.XX.XX;Server=vsXXXX;Service=88;Protocol=onsoctcp;UID=ed;Password=ca94;";
using (this.connection = new IfxConnection(connString))
{
this.connection.Open();
using (this.cmd = new IfxCommand(sqlQuery, this.connection))
{
// Start a local transaction
this.trans = this.connection.BeginTransaction(IsolationLevel.Unspecified);
// Assign transaction object for a pending local transaction
this.cmd.Transaction = trans;
try
{
IfxBlob byteuploaded = new IfxBlob(this.connection);
byteuploaded.Read(_imageUpload.FileBytes);
// ========= BOTH OF THESE are not working ==============
//cmd.Parameters.Add(new IfxParameter()).Value = data;// System.Text.Encoding.UTF8.GetString(data);
cmd.Parameters.Add(new IfxParameter()).Value = byteuploaded;// _imageUpload.FileBytes;
int res = cmd.ExecuteNonQuery();
// commiting the transaction
this.cmd.Transaction.Commit();
}
catch
{
//this.cmd.Transaction.Rollback();
}
}
this.connection.Close();
}
}
catch (Exception)
{
}
}
使用此dll作为参考并使用IBM.Data.Informix;
特别是我无法将byte []添加到blob列。我可以做的所有其他插入/更新/删除操作。
任何帮助?
我甚至升级到了ibm_data_server_driver_package_win64_v10.1.exe& clientsdk.4.10.FC1DE.WIN.exe
但是我遇到了dll兼容性方面的问题。无法加载'XXX.XX.dll“异常是comin。
我甚至尝试使用
执行插入查询INSERT INTO db95@vsXXXX:testblobupload (fileblob)
VALUES (db95@vsXXXX:FILETOBLOB('C:\tmp\Untitled.png', 'client'));
并面临错误
ERROR: Smart-large-object error.
Error Code: -9810.
Smart Large Objects: No sbspace number specified.
答案 0 :(得分:1)
这不是你的c#app。需要为大型智能对象设置Informix环境。我认为它基本上指定了在服务器上使用的空间。我什么都不知道。如果你返回isam错误代码,那就是这个
-12053智能大对象:未指定智能大对象空间编号。
没有默认的sbspace,并且调用者没有指定sbspace 使用。
在。中指定智能大对象空间名称 smart-large-object函数调用或设置SBSPACENAME onconfig file参数指向有效的智能大对象空间的名称。
答案 1 :(得分:1)
我们可以使用PUT IN
子句在特定智能大对象空间中包含blob字段。
如果我们在没有指定表名和列名的情况下使用connection.GetIfxBlob()
,则blob字段将包含在onconfig SBSPACENAME
中的默认sbspace集中,如果未设置,则会给出错误{{ 1}}。
答案 2 :(得分:0)
我想,保存Informix Blob的最佳方法是使用此功能:
string insertSql = string.Format("insert into \"{0}\" (sbfotoint,NmArqBlob) values (?,?);", this.table);
using (var command = new IfxCommand(insertSql, this.connection))
{
this.connection.Open();
SetRole();
command.CommandType = System.Data.CommandType.Text;
command.Parameters.Add(new IfxParameter()).Value = CreateIfxBlob(entidade.SBlob);
command.Parameters.Add(new IfxParameter()).Value = entidade.NomeArquivo;
command.ExecuteNonQuery();
this.connection.Close();
}
private IfxBlob CreateIfxBlob(byte[] data)
{
IfxBlob blob = connection.GetIfxBlob(this.table, "sbfotoint");
blob.Open(IfxSmartLOBOpenMode.ReadWrite);
blob.Write(data);
blob.Close();
return blob;
}