Vb.net 如何使用Ref游标调用Oracle函数并在Visual Basic上返回值
我试图调用Oracle函数,该函数从VB返回SYS\u REFCURSOR。我能够使用存储过程检索数据。和我试图调用oracle函数的方式相同,但它给出了一个错误 如果有人能帮忙,请通知我?谢谢如果需要,我会提供屏幕截图 数据库端的函数 我的代码=========================================================================Vb.net 如何使用Ref游标调用Oracle函数并在Visual Basic上返回值,vb.net,oracle,sys-refcursor,ref-cursor,Vb.net,Oracle,Sys Refcursor,Ref Cursor,我试图调用Oracle函数,该函数从VB返回SYS\u REFCURSOR。我能够使用存储过程检索数据。和我试图调用oracle函数的方式相同,但它给出了一个错误 如果有人能帮忙,请通知我?谢谢如果需要,我会提供屏幕截图 数据库端的函数 我的代码========================================================================= Private Sub Button1_Click_1(sender As Object, e As E
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Dim rvConn As Oracle.DataAccess.Client.OracleConnection
rvConn = CreateConnection()
Dim rvCmd As New Oracle.DataAccess.Client.OracleCommand
' Dim OracleRefCursor As New Oracle.DataAccess.Client.OracleDbType.RefCursor
Dim ds As DataSet
Dim oraDataAdapter As New Oracle.DataAccess.Client.OracleDataAdapter()
Try
rvCmd.Connection = rvConn
rvConn.Open()
Dim strSQL As String
strSQL = "getallprodpckg.get_allcust"
rvCmd.CommandType = CommandType.StoredProcedure
rvCmd.CommandText = strSQL
MsgBox("")
Dim qrySerial3 As New Oracle.DataAccess.Client.OracleParameter("getallpcursor", OracleDbType.RefCursor) With {
.Direction = ParameterDirection.ReturnValue}
rvCmd.Parameters.Add(qrySerial3)
Dim vStr As String
Dim reader As OracleDataReader = rvCmd.ExecuteReader
While reader.Read()
Console.WriteLine("{0}", reader(0) & reader(1) & reader(2))
MsgBox(vStr)
End While
Catch ex As Exception
MessageBox.Show("ERROR OCCURRED" & ex.Message)
Finally
rvConn.Close()
End Try
End Sub
当我用游标对象调用存储过程时,上面的代码确实返回了一个值。
光标基本上返回表中的所有数据。
但是当我在一个函数上尝试它时,它会抛出一个异常,下面是我尝试的代码。
**错误**
System.NullReferenceException:'对象引用未设置为对象的实例
**数据库连接类**
Public Class Form1 Private Sub TestOracleButton_Click(sender As Object, e As EventArgs) Handles TestOracleButton.Click TestOracleConnection() End Sub
Dim custID As Integer
Dim custID2 As Integer
Dim custName As String
Dim prodID As Integer
Dim prodName As String
Dim prodPrice As Integer
Dim prodAmount As Integer
Dim custAmount As Integer
Dim custStatus As String
Dim prodQuant As Integer
Public Sub TestOracleConnection()
Dim rvConn As Oracle.DataAccess.Client.OracleConnection
rvConn = CreateConnection()
Try
rvConn.Open()
MessageBox.Show("Oracle Connection OK")
Catch ex As Exception
MessageBox.Show(ex.Message)
MessageBox.Show("No Oracle Connection established")
Finally
rvConn.Close()
End Try
End Sub
Public Function CreateConnection() As Oracle.DataAccess.Client.OracleConnection
Dim rvConn As New Oracle.DataAccess.Client.OracleConnection With {
.ConnectionString = GetConnectionString()
}
Return rvConn
End Function
Public Function GetConnectionString() As String
Dim vConnStr As String
vConnStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)"
vConnStr = vConnStr & "(HOST=feenix-oracle.swin.edu.au)(PORT=1521))"
vConnStr = vConnStr & "(CONNECT_DATA=(SERVICE_NAME=dms)));"
vConnStr = vConnStr & "User Id=S1234564;"
vConnStr = vConnStr & "Password=******;"
Return vConnStr
End Function
您需要从参数而不是命令获取读取器 所以不是
Dim reader As OracleDataReader = rvCmd.ExecuteReader()
你需要:
rvCmd.CommandType = CommandType.StoredProcedure
rvCmd.CommandText = "getallprodpckg.get_allcust"
Dim qrySerial3 As New Oracle.DataAccess.Client.OracleParameter(
None, OracleDbType.RefCursor, ParameterDirection.ReturnValue)
rvCmd.Parameters.Add(qrySerial3)
rvCmd.ExecuteNonQuery()
Dim cursor as OracleRefCursor = DirectCast(qrySerial3.Value, OracleRefCursor)
Dim reader As OracleDataReader = cursor.GetDataReader()
事实上,我的朋友正试图通过为我提出这个问题来帮助我。然后我试着对他的问题发表评论,但我不能,因为我没有50个信誉点,所以我不得不从我的帐户中创建相同的问题。感谢您的快速回复,我在“TryCast(qrySerial2.Value,OracleDataReader)”上收到错误,说-“BC30311:类型为“OracleDataReader”的值不能转换为“OracleRefCursor”。好的,这是因为您需要指定
rvCmd.CommandType=CommandType.storedProcess
,而不是Text
。请尝试更新代码是的,这就是问题所在,非常感谢您的帮助。我真的很感激。您能告诉我如何将数据放入数据网格吗?只需提交一个新问题,明确说明您在哪个环境(Winforms、WPF、web…)上
Dim reader As OracleDataReader = rvCmd.ExecuteReader()
rvCmd.CommandType = CommandType.StoredProcedure
rvCmd.CommandText = "getallprodpckg.get_allcust"
Dim qrySerial3 As New Oracle.DataAccess.Client.OracleParameter(
None, OracleDbType.RefCursor, ParameterDirection.ReturnValue)
rvCmd.Parameters.Add(qrySerial3)
rvCmd.ExecuteNonQuery()
Dim cursor as OracleRefCursor = DirectCast(qrySerial3.Value, OracleRefCursor)
Dim reader As OracleDataReader = cursor.GetDataReader()