2016-01-11 79 views
2

我無法更新BLOB字段,但插入工作,請參閱下面的代碼。如何更新BLOB列,錯誤ORA-00932,而插入工作

我的猜測是,它是與存儲大量記錄一個BLOB值,涉及複製大數據的問題。

在我的情況,我知道只有一條記錄將被更新,但甲骨文可能是潛在的一些記錄可能需要更新的意見。使用插入,保證只涉及1條記錄,但並不總是更新。現在我該如何解決這個問題?

NB:在WHERE子句在artnr物品字段是具有一個唯一索引的主鍵。

順便說一句,我覺得worrysome,現在有很多的用於插入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; 
} 
+0

任何要傳遞'ArtNr'as BLOB機會呢? [This](http://stackoverflow.com/questions/12980038/ora-00932-inconsistent-datatypes-expected-got-clob)將解釋ORA-00932。 –

+0

@MarmiteBomber感謝您的評論,但插入工程,具有相同的參數。 – Roland

+0

好吧,對不起,我只能跟JDBC比較(沒有ODP技能)。希望你可以用下面的答案來解決它。它是有道理的一個長BLOB覆蓋所有以下參數:) –

回答

1

我真的雖然你在想我的東西,當我讀你的文章。出於好奇,我試了一下,很驚訝這個錯誤確實發生。

有好消息。我戳了一圈,發現這樣的:

How can I update data in CLOB fields using a >> prepared query << with 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; 
} 

只需切換參數即可。

我給工藤的問題和原來的問題的答案(同一個人,在這種情況下)。

你是對的,有在對甲骨文的BLOB更新幫助的方式在網絡上寶貴的小。

偉大的問題。我覺得今天我學到了一些東西。

- 編輯 -

每個操作的建議,還有另外一個補丁,每個上面提到的同一個線程,可以防止重新排列參數的必要性。我的猜測是,如果你正在更新多個LOB,這也可能會派上用場。

切換BindByName物業似乎也解決此問題:

cmd.BindByName = true; 
+0

感謝您解決我的問題。鏈接對我也有幫助,並且設置BindByName = true已經工作。我更喜歡通過改變綁定順序。如果您想提出設置BindByName的替代方法,我會接受您的答案作爲完整的解決方案。 – Roland

+0

我很高興工作。這是一個很奇怪的問題。 – Hambone