当我读到你的帖子时,我真的以为你在想象事情。出于好奇,我尝试了一下,惊讶地发现这个错误确实发生了。
有好消息。我四处搜寻,发现了这个:
如何使用 ODP (Oracle.DataAccess) 使用 >> 准备好的查询
事实证明,当使用带有 LOB 的更新语句时,必须首先在参数中声明 LOB。考虑到这一点,我得到了与您的代码相同的错误,但这完美地工作了:
public static bool StoreBlobImage(OracleConnection conn, string ArtNr, byte[] bImageJpg)
{
bool Ok = false;
string Sql = "update MyTable set Image = :Image where ArtNr = :ArtNr";
using (OracleCommand cmd = new OracleCommand(Sql, conn))
{
cmd.Parameters.Add("Image", OracleDbType.Blob).Value = bImageJpg;
cmd.Parameters.Add("ArtNr", OracleDbType.Varchar2, 8).Value = ArtNr;
try
{
cmd.ExecuteNonQuery();
}
catch (Exception TheException)
{
}
}
return Ok;
}
只需切换参数即可。
我对原始问题的问题和答案给予了荣誉(在本例中是同一个人)。
您是对的,网络上几乎没有关于 Oracle 中 BLOB 更新的帮助。
很好的问题。我感觉我今天学到了一些东西。
- 编辑 -
根据OP的建议,根据上面引用的同一线程,还有另一个修复程序,可以防止重新排列参数的必要性。我的猜测是,如果您要更新多个 LOB,这也可能会派上用场。
切换BindByName
财产似乎也解决了这个问题:
cmd.BindByName = true;