如何通过ADO.NET/C#将Array/Table参数用于Oracle(ODP.NET10g)?这个问题的答案很好,但我正在寻找可以将数组或表发送到Oracle过程然后在该过程中使用该表的ADO.NET代码。在SQLServer表值参数中,它非常简单:CREATETYPE[dbo].[IntTable]ASTABLE([intvalue][int]NOTNULL,PRIMARYKEYCLUSTERED([intvalue]ASC)WITH(IGNORE_DUP_KEY=OFF))GOCREATEPROCEDUREdbo.UseTable@SomeIntINT,@IntTabledbo.IntTableREADONLYASBEGIN--使用@SomeInt和@IntTable做任何事情,比如:INSERTINTOAssignments(masterid,childid)SELECT@SomeInt,intvalueFROM@IntTableENDGO然后在客户端:varparam=newList();参数.Add(1);参数.Add(2);Cm.Parameters.AddWithValue("@IntTable",param/*IEnumerable*/).SqlDbType=SqlDbType.Structured这就是我目前所拥有的:CREATEORREPLACETYPETRAIT_ID_TABLEASTABLEOFNUMBER;程序SET_TRAITS(P_CUST_TANK_PROD_IDINCUST_TANK_PROD.CUST_TANK_PROD_ID%TYPE,P_TRAIT_IDSINTRAIT_ID_TABLE)ASBEGINDELETEFROMTANK_TRAITWHERECUST_TANK_PROD_ID=P_CUST_TANK_PROD_ID;插入TANK_TRAIT(CUST_TANK_PROD_ID,TRAIT_ID)从表中选择P_CUST_TANK_PROD_ID,COLUMN_VALUE(P_TRAIT_IDS);犯罪;例外情况其他人然后回滚;结尾;varparam=newOracleParameter();param.ParameterName="P_TRAIT_IDS";param.OracleDbType=OracleDbType.Decimal;param.CollectionType=OracleCollectionType.PLSQLAssociativeArray;param.Direction=ParameterDirection.Input;param.Value=traitIdList.ToArray();param.Size=traitIdList.Count;cmd.Parameters.Add(参数);我在ExecuteNonQuery上得到了这个:System.AccessViolationExceptionwascaughtMessage=Attemptedtoreadorwriteprotectedmemory。这通常表明其他内存已损坏。Source=Oracle.DataAccessStackTrace:atOracle.DataAccess.Client.OpsSql.ExecuteNonQuery(IntPtropsConCtx,IntPtr&opsErrCtx,IntPtr&opsSqlCtx,IntPtr&opsDacCtx,IntPtropsSubscrCtx,Int32&isSubscrRegistered,OpoSqlValCtx*&pOpoSqlValCtx,OpoSqlRefCtx&pOpoSqlRefCtx,IntPtr[]pOpoPrmValCtx,OpoPrmRefCtx[]pOpoPrmRefCtx,OpoMetValCtx*&pOpoMetValCtx,Int32prmCnt)在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()atEDC2.Domain.TraitList.SaveTraits(StringconnectionString)inC:codeEDC2trunkappEDC2.DomainTrait.cs:line195InnerException:ThisisforODP.NET(odac):YourOraclepackagewillbesetasfollows:创建或者将包SOME_PACKAGE替换为...类型t_number_tab是pls_integer的数字索引表;...过程ins_test(i_id_tabint_number_tab,o_insertedoutnumber);结束SOME_PACKAGE;tCREATEORREPLACEpackagebodySOME_PACKAGEidinsasnumber_b_test(o_insertedoutnumber)isbegin--根据i_id_tab.first..i_id_tab.last中所有i的传入表的ids插入所有记录到测试表插入到TEST_TAB(id,val1,val2)从main_tab中选择id,val1,val2whereid=i_id_tab(i);o_inserted:=SQL%ROWCOUNT;犯罪;其他人随后回滚时出现异常;增加;结束ins_test;...结束SOME_PACKAGE;那么您的C#代码如下所示:UsingArray/TableparametersviaADO.NET/C#toOracle(ODP.NET10g)?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注注意——stringconnStr="UserId=xxx;Password=xxxx;DataSource=xxxxx;";OracleConnection_conn=newOracleConnection(connStr);_conn.Open();OracleCommandcmd=_conn.CreateCommand();cmd.CommandText="some_package.ins_test";cmd.CommandType=CommandType.StoredProcedure;OracleParameterp1=newOracleParameter();OracleParameterp2=newOracleParameter();p1.OracleDbType=OracleDbType.Decimal;p1.Direction=ParameterDirection.Input;OracleDbType.Decimal;p2.Direction=ParameterDirection.Output;p1.CollectionType=OracleCollectionType.PLSQLAssociativeArray;p1.Value=newint[3]{1,2,3};p1.Size=3;cmd.Parameters.Add(p1);cmd.Parameters.Add(p2);cmd.ExecuteNonQuery();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
