2011-12-02 40 views
2

我正在嘗試使用ODP.Net向Oracle過程傳遞一個字節數組(byte [] [])的數組,這是Oracle原始數組。出現以下情況例外:如何使用ODP.Net傳遞字節數組的數組?

Oracle.DataAccess.Client.OracleException是由用戶代碼 消息= ORA-06550未處理的:行1,列52: PLS-00418:陣列綁定類型必須匹配PL/SQL錶行鍵入 ORA-06550:第1行,第7列: PL/SQL:語句忽略 源= Oracle數據提供程序的.NET 錯誤碼= -2147467259

我傳遞的字符串數組到Oracle程序沒有任何問題,但字節數組的數組是一個問題。這裏是我的C#代碼傳遞的byte [] []的程序:

conn = new OracleConnection(tm_connectStr); 

saveAnswers = new OracleCommand(commandName, conn); 
saveAnswers.CommandType = CommandType.StoredProcedure; 

// Input params 
//byte array of hashed answers. 
byte[][] answers = userAnswers.Select(a => a.Answer).ToArray<byte[]>(); //a.Answer is already a byte array. 
OracleParameter pAnswers = saveAnswers.Parameters.Add("p_answers_tab", OracleDbType.Raw,  ParameterDirection.Input); 
pAnswers.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
pAnswers.Value = answers; 
pAnswers.Size = answers.Length; 

if (conn.State != ConnectionState.Open) conn.Open(); 

saveAnswers.ExecuteNonQuery(); //This line throws exception. 

Oracle過程是:

PROCEDURE create_answers(
p_answers_tab IN g_param_raw_tab_type 
) IS 
BEGIN 
FOR i IN p_answers_tab.FIRST .. p_answers_tab.LAST LOOP 
INSERT INTO answers 
(
answer, 
created_ts 
) 
VALUES (
p_answers_tab(i), 
SYSTIMESTAMP 
); 
END LOOP; 
END create_answers; 

而且表結構是:

Table name: Anwers 

1) Coulmn name: anwer, Data type: Raw 
2) Coulmn name: created_ts, Data type: Timestamp(6) 

任何見解是不勝感激。

回答

1

上面的代碼都很好,可以用來將字節數組的數組傳遞給Oracle SP。 這裏是毛病......經過了很長一段時間,圍繞着灌木叢,處理類型「g_param_raw_tab_type」的數據庫程序員發現該類型被無意地變成了varchar而不是Raw數組。該類型已更改爲原始和BINGO !!!!通話已經完成。