我正在尝试在我创建的包中使用带有引用游标的Oracle数据读取器。
使用Visual Studio和C#。
虽然我的读者遇到两个构建错误:
以下是我的代码:
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();
}
}
}
如果有人能够理解为什么我会收到这些构建错误,或者知道如何正确显示数据,这将是非常好的。
答案 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)
您应该使用[]
代替()
。
声明数组时,必须使用方括号([]) 类型,而不是标识符。放置后的括号 标识符在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++;
}