Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最后一行覆盖结果c#oracle中的所有记录_C#_Oracle - Fatal编程技术网

最后一行覆盖结果c#oracle中的所有记录

最后一行覆盖结果c#oracle中的所有记录,c#,oracle,C#,Oracle,我们有一个Oracle存储过程,它接受表值参数 在包说明中: create or replace PACKAGE CRUD_FIELDS IS TYPE tableParam IS TABLE OF "owner".tablename.columnname%TYPE index by pls_integer; TYPE Param_Array is table OF VARCHAR2(400) index by binary_integer; PROCEDURE USP_G

我们有一个Oracle存储过程,它接受表值参数

在包说明中:

create or replace
  PACKAGE CRUD_FIELDS IS   
  TYPE tableParam IS TABLE OF "owner".tablename.columnname%TYPE index by pls_integer;  
  TYPE Param_Array is table OF VARCHAR2(400) index by binary_integer;
PROCEDURE USP_GET_BULK_FIELDS  ( pi_table_param tableParam, po_out_param out sys_refcursor);
包体:

 PROCEDURE USP_GET_BULK_FIELDS  ( pi_table_param tableParam, po_out_param 
    out sys_refcursor ) AS
  Fields_Arr Param_Array; 
  trRec recFieldType;
  trRecTable  FieldRecTable := FieldRecTable();
  n integer := 1;
  arrIdx integer := 1;
  BEGIN
  for rul in 1..pi_table_param.count loop    
  for fld in (select ruleid, addlid, code from  "owner"."T_FIELDS" where ruleid = pi_table_param(rul))
  loop
     trRecTable.extend; 
     trRec := recFieldType(fld.rule_id, fld.ADDL_ID, fld.field_code);          
     trRecTable(n):=trRec;
     Fields_Arr(arrIdx):=fld.rule_id || ',' || fld.ADDL_ID|| ',' ||fld.field_code;
       arrIdx := arrIdx + 1;
       n := n + 1;
       DBMS_OUTPUT.put_line (fld.rule_id || ',' || fld.ADDL_ID|| ',' ||fld.field_code );
   end loop;
  end loop;
  FOR i IN trRecTable.FIRST .. trRecTable.LAST 
   LOOP 
    open po_out_param for
   SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM   Table (Cast(trRecTable As FieldRecTable));
   END LOOP; 
   DECLARE
  CURSOR c1 IS select * from Table (Cast(trRecTable As FieldRecTable));
  begin
  FOR item IN c1
  LOOP
  DBMS_OUTPUT.PUT_LINE
   ('rule_id = ' || item.rule_id || ', ADDL_ID = ' || item.ADDL_ID || ', field_code = ' || item.field_code);
  END LOOP;
  end;
 END USP_GET_BULK_FIELDS;
在Sql developer中执行此操作时,我得到了一个正确的结果: 我是这样执行的

      DECLARE
     pi_table_param owner.CRUD_FIELDS.tableParam;
     po_out_param sys_refcursor;
      BEGIN
    pi_table_param(1) := 154;
    pi_table_param(2) := 153;

   CRUD_FIELDS.USP_GET_BULK_FIELDS(
    pi_table_param => pi_table_param,
    po_out_param => po_out_param
     );  
   END; 
我得到的结果如下:
154,3,ABCD
154,4,TRS
154,5,EDR
155,34,TRE
155,5,EW
155,34,红色
规则id=154,地址id=3,字段代码=ABCD
规则id=154,地址id=4,字段代码=TRS
规则id=154,地址id=5,字段代码=EDR
规则id=155,地址id=34,字段代码=TRE
规则id=155,地址id=5,字段代码=EW
规则id=155,地址id=34,字段代码=红色

我已经用C语言编写了一个程序来获取值,但是我在那里得到了一个奇怪的输出

C#获取值的代码:

     public void GetFieldsfoRules()
      {
        string connSt = ConfigurationManager.ConnectionStrings["QuickStarts Instance"].ConnectionString;
        Oracle.DataAccess.Client.OracleConnection oraconnection = new Oracle.DataAccess.Client.OracleConnection(connSt);
        oraconnection.Open();
        Oracle.DataAccess.Client.OracleCommand cmd = oraconnection.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "CRUD_FIELDS.USP_GET_BULK_FIELDS";
        Oracle.DataAccess.Client.OracleParameter oraparam = new Oracle.DataAccess.Client.OracleParameter();
        Oracle.DataAccess.Client.OracleParameter oraParamOut = new Oracle.DataAccess.Client.OracleParameter();
        oraparam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
        oraparam.Size = 35;
        oraparam.ParameterName = "pi_table_param";
        oraparam.OracleDbType = OracleDbType.Int32;
        oraparam.Value = new int[2] { 154, 155 };
        oraparam.Direction = ParameterDirection.Input;
        oraParamOut.ParameterName = "po_out_param";
        oraParamOut.OracleDbType = OracleDbType.RefCursor;
        oraParamOut.Value = 0;
        oraParamOut.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(oraparam);
        cmd.Parameters.Add(oraParamOut);
        Oracle.DataAccess.Client.OracleDataAdapter oraadap = new Oracle.DataAccess.Client.OracleDataAdapter(cmd);
        DataTable dt_getRules = new DataTable();
        oraadap.Fill(dt_getRules);
        dt_getRules.Load(dr);
        cmd.Dispose();
       oraconnection.Close();
    }
数据表中充满了值:
155,34,红色
155,34,红色
155,34,红色
155,34,红色
155,34,红色
155,34,红色


最后一行正在覆盖其他值。这里出了什么问题?

修复了它,实际上循环中的Select语句正在创建问题,因此修改了SP

  open po_out_paramfor select * from Table (Cast(trRecTable As FieldRecTable));
注释掉该部分并添加了上述行:

    FOR i IN trRecTable.FIRST .. trRecTable.LAST 
    LOOP 
    open po_out_param for
    SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM   Table (Cast(trRecTable As FieldRecTable));
    END LOOP; 

修复了它,实际上循环中的Select语句正在创建问题,因此修改了SP

  open po_out_paramfor select * from Table (Cast(trRecTable As FieldRecTable));
注释掉该部分并添加了上述行:

    FOR i IN trRecTable.FIRST .. trRecTable.LAST 
    LOOP 
    open po_out_param for
    SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM   Table (Cast(trRecTable As FieldRecTable));
    END LOOP; 

陛下只是一个一般性问题:
oraadap.Fill
是否返回数据集而不是表?我想你应该使用类似于
oraadap.Fill(ds)
,然后使用
dt_getRules=ds[0]
?这也会给出同样的结果:(嗯……只是一个一般性的问题:
oraadap.Fill
不是返回一个数据集而不是一个表吗?我想你应该使用类似于
oraadap.Fill(ds)
,然后使用
dt_getRules=ds[0]
?这也给出了相同的结果:(