当Insert工作时,如何更新BLOB列,错误ORA-00932

我无法更新BLOB字段,但Insert工作,请参阅下面的代码。

我的猜测是,它与在大量记录中存储一个BLOB值的问题有关,涉及复制大数据。

就我而言,我知道只会更新一条记录,但Oracle可能认为可能需要更新几条记录。 使用Insert时,只保证涉及1条记录,但并不总是使用Update。 现在我该如何解决这个问题?

注意:Where子句中的ArtNr字段是具有唯一索引的主键。

顺便说一下,我发现在互联网上插入BLOB有很多代码示例,但我找不到更新BLOB的代码示例。

using Oracle.DataAccess.Client;//needs reference to Oracle.DataAccess.dll using Oracle.DataAccess.Types; //OracleBlob public static bool StoreBlobImage(OracleConnection conn, string ArtNr, byte[] bImageJpg) { bool Ok = false; #if true // this is what I need, but does not work string Sql = "update MyTable set Image = :Image where ArtNr = :ArtNr"; #else // this works string Sql = "insert into MyTable (ArtNr, Image) values (:ArtNr, :Image)"; #endif using (OracleCommand cmd = new OracleCommand(Sql, conn)) { //cmd.Connection = conn; //cmd.CommandType = CommandType.Text; cmd.Parameters.Add("ArtNr", OracleDbType.Varchar2, 8).Value = ArtNr; #if false // tried method 1 cmd.Parameters.Add("Image", OracleDbType.Blob).Value = bImageJpg; #else // now trying method 2 OracleParameter blobParameter = new OracleParameter(); blobParameter.OracleDbType = OracleDbType.Blob; blobParameter.ParameterName = "Image"; blobParameter.Value = bImageJpg; blobParameter.Direction = ParameterDirection.Input; blobParameter.IsNullable = true; cmd.Parameters.Add(blobParameter); #endif try { conn.Open(); cmd.ExecuteNonQuery(); // ORA-00932: inconsistent datatypes: expected - got BLOB } catch (Exception TheException) { }// debug breakpoint } return Ok; } 

我在阅读你的post时,我确实想到了一些东西。 出于好奇,我尝试了它并且惊讶于这个错误确实发生了。

有好消息。 我戳了一下,发现了这个:

如何使用带有ODP(Oracle.DataAccess)的>> prepared query <<更新CLOB字段中的数据?

当使用带有LOB的update语句时,必须首先在参数中声明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;