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

Posted

技术标签:

【中文标题】如何使用 ODP.Net 传递字节数组?【英文标题】:How to pass an array of byte arrays using ODP.Net? 【发布时间】:2011-12-02 23:59:59 【问题描述】:

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

Oracle.DataAccess.Client.OracleException 未被用户代码处理 消息 = ORA-06550:第 1 行,第 52 列: PLS-00418:数组绑定类型必须匹配 PL/SQL 表行类型 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略 来源=适用于 .NET 的 Oracle 数据提供程序 错误码=-2147467259

我将字符串数组传递给 Oracle 过程没有任何问题,但字节数组数组是个问题。这是我将 byte[][] 传递给过程的 c# 代码:

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。类型已更改为 Raw 和 BINGO!!!!通话成功了。

【讨论】:

以上是关于如何使用 ODP.Net 传递字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

ODP.Net 数组绑定异常处理

使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解转

如何通过 oracleBulkCopy (ODP.NET) 检查插入的行数

部署和配置 ODP.NET 以在不安装实体框架的情况下工作

使用带有 MSGID 的 ODP.NET 使 Oracle AQ 出队

如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表