如何使用ODP.Net传递一个字节数组?

时间:2011-12-03 00:00:00

标签: c# oracle byte

我正在尝试使用ODP.Net将一个字节数组(byte [] [])传递给Oracle过程,这个过程来自Oracle,它是一个Raw数组。我得到以下异常:

Oracle.DataAccess.Client.OracleException未被用户代码处理  消息= ORA-06550:第1行,第52列:  PLS-00418:数组绑定类型必须与PL / SQL表行类型匹配  ORA-06550:第1行第7列:  PL / SQL:语句被忽略  Source = Oracle Data Provider for .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 个答案:

答案 0 :(得分:1)

上面的代码都很好,可以按原样用于将字节数组传递给Oracle SP。 这里是一个小问题...在布什周围殴打了很长时间后,处理类型“g_param_raw_tab_type”的DB程序员发现该类型无意中被变成了varchar而不是Raw的数组。类型改为Raw和BINGO !!!!电话通过了。