使用带有引用游标的Oracle数据读取器

时间:2013-12-11 15:04:06

标签: c# visual-studio-2010 oracle

我正在尝试在我创建的包中使用带有引用游标的Oracle数据读取器。

使用Visual Studio和C#。

虽然我的读者遇到两个构建错误:

  1. 。参数不能像方法一样使用
  2. MyReader是一个变量,但用作方法。
  3. 以下是我的代码:

    protected void Page_Load(object sender, EventArgs e)
            {
                string oradb = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=*****)(PORT=***))(CONNECT_DATA=(SERVICE_NAME=***)));User Id=APPS;Password=****;";
                OracleConnection conn = new OracleConnection(oradb);  // C#
                conn.Open();
    
    
                OracleCommand myCMD = new OracleCommand();
                myCMD.Connection = conn;
                myCMD.CommandText = "apps.cie_install_base_data.get_serial_trx_hist";
                myCMD.CommandType = CommandType.StoredProcedure;
                myCMD.Parameters.Add(new OracleParameter("p_cursor", OracleDbType.RefCursor)).Direction = ParameterDirection.Output;
                myCMD.Parameters.Add("p_serial_number", OracleDbType.Varchar2, 30).Value = "M5605946";
                OracleDataReader myReader = default(OracleDataReader);
                try
                {
                    myCMD.ExecuteNonQuery();
                }
                catch (Exception myex)
                {
                    Label1.Text = " " + myex.Message;
                }
    
                myReader = myCMD.Parameters("p_cursor"); 
    
                int x = 0;
                int count = 0;
    
                count = 0;
    
                //myReader = myCMD.ExecuteReader();
                while (myReader.Read()) {
                for (x = 0; x <= myReader.FieldCount - 1; x++) {
                Label3.Text = myReader(x) + " ";
                }
                Label4.Text = " ";
                count += 1;
                }
    
    
                Label5.Text = (count + " Rows Returned.");
    
                myReader.Close();
                conn.Close();
            }
        }
     }
    

    如果有人能够理解为什么我会收到这些构建错误,或者知道如何正确显示数据,这将是非常好的。

4 个答案:

答案 0 :(得分:1)

与VB不同,C#使用括号来索引集合。

使用[],而不是()

答案 1 :(得分:1)

myReader = ((OracleRefCursor)myCMD.Parameters["p_cursor"].Value)).GetDataReader(); 

来自https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleRefCursorClass.htm

答案 2 :(得分:0)

您应该使用[]代替()

来自Arrays Tutorial

  

声明数组时,必须使用方括号([])   类型,而不是标识符。放置后的括号   标识符在C#中不是合法语法。

同样OracleCommand.Parameters属性返回OracleParameterCollection而不是OracleDataReader

答案 3 :(得分:0)

您必须使用ExecuteReader()...

//(Your code...)
  OracleDataReader myReader = default(OracleDataReader);
  try
  {   //Here the magic
      myReader = myCMD.ExecuteReader();
  }
  catch (Exception myex)
  {
      Label1.Text = " " + myex.Message;
  }

 int x = 0;
 int count = 0;

 string actualValue = string.Empty;
 /*This data type is from .Net. Like: "System.DateTime" - "System.String" - etc*/
 string actualDataType = string.Empty; 

 while(myReader.Read())
 {
  //Here you can use GetValue and GetType
     actualValue = myReader.GetValue(count).ToString();
     actualDataType = myReader.GetType(count).ToString();
     count++;
 }