我的情景
我正在使用带有c#3.5的ODP.NET oracle提供程序,我正在尝试将一个数组作为参数传递给一个程序......就像这样:
var paramNames = new OracleParameter();
paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
paramNames.ParameterName = "P_JOB_TITLE";
paramNames.Size = 2;
paramNames.Value = new string[2]{ "name1", "name1" };
cmd.Parameters.Add(paramNames);
当运行时代码转到paramNames.Value = new string [2] {“name1”,“name1”};它抓住了这个错误
“价值不在预期范围内”
任何人都可以解决它吗?
附加信息
指定OracleDbType错误已修复,但执行时给出了一些错误
paramNames.OracleDbType = OracleDbType.Varchar2;
“无法将'System.String []'类型的对象强制转换为'System.IConvertible'。”
我的目标是做这样的事情
http://aspalliance.com/621_Using_ODPNET_to_Insert_Multiple_Rows_within_a_Single_Round_Trip.3
有参数的另一个问题
插入像这样的输出参数
paramNames = new OracleParameter();
paramNames.ParameterName = "O_JOB_ID";
paramNames.Size = 3;
paramNames.Direction = ParameterDirection.Output;
paramNames.OracleDbType = OracleDbType.Int32;
paramNames.Value = new int[3] { 0, 0, 0 }; ;
cmd.Parameters.Add(paramNames);
在ExecuteNonQuery完成时正确填充它。例如,pls-sql过程执行3次插入,并返回每个数组记录的row-id。
但是我出了点问题,例如在第二行有效,整个OUT参数(数组)总是设置为0.我预计至少params [0] .value被增强了
由于
答案 0 :(得分:5)
我认为你正在尝试合并一个数组绑定 {简单地将一个数组绑定到一个参数,让它多次执行 - 这就是你提供的链接中的示例所做的那样}一个关联数组 {re:PLSQLAssociativeArray,带有一个TABLE OF的INPUT参数}。
由于你没有发布你正在运行的包/ proc,我假设你正在做这样的事情(只是把它放下来验证假设)
procedure insertdata(P_JOB_TITLE IN VARCHAR2) as
begin
insert into myTable(x) value (P_JOB_TITLE);
end insertdata;
要像文章作者那样执行此操作,您需要使用ArrayBindCount (check out this link, it also has an example)。 这也表明,如果你有多个参数,那么每个参数都会有一个ARRAY。
现在为你传入的所有P_JOB_TITLE()执行此操作
//this was missing in your example and MUST be there to tell ODP how many array elements to expect
cmd.ArrayBindCount = 2;
string[] jobTitleArray = {"name1", "name1"};
OracleParameter paramNames= new OracleParameter("P_JOB_TITLE", OracleDbType.Varchar2);
//paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;/*once again, you are passing in an array of values to be executed and not a pl-sql table*/
//paramNames.Size = 2; /* this is unnecessary since it is for a plsql-associative array*/
paramNames.Value = jobTitleArray ;
cmd.Parameters.Add(paramNames);
对于plSQLAssociativeArray示例,请查看安装ODP时提供的示例@%ORA_HOME%\ odp.net \ samples \ 2.x \ AssocArray
和数组绑定示例(来自您提供的链接) @%ORA_HOME%\ odp.net \ samples \ 2.x \ ArrayBind