如何从Visual Basic中调用具有Ref Cursor作为Out参数的Oracle函数



我正在尝试调用从VB返回SYS_REFCURSOR的Oracle函数。我能够使用存储过程检索数据。我试着用同样的方法调用oracle函数,但它给出了一个错误。

如果有人能帮上忙,请道歉?谢谢如果需要,我会提供屏幕截图。

Function in DB end
====================
PKG BODY
FUNCTION GET_ALLCUST RETURN SYS_REFCURSOR AS 
getallcursor SYS_REFCURSOR; 
BEGIN
OPEN getallcursor FOR SELECT * FROM CUSTOMER; 
RETURN getallcursor; 
CLOSE getallcursor;
END;
PKG Spec
==============
create or replace PACKAGE GetAllProdPckg AS
PROCEDURE GetAllProd;
PROCEDURE get_allprod_viasqldev;
PROCEDURE get_allcust_viasqldev;
FUNCTION get_allcust RETURN SYS_REFCURSOR;
function GET_ALLPROD_FROM_DB RETURN SYS_REFCURSOR;

END GetAllProdPckg;

**错误**

System.NullReferenceException:"对象引用未设置为对象的实例。

我的代码=============================================

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("getallcursor", OracleDbType.RefCursor) With {
.Direction = ParameterDirection.Output}

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

**DB连接等级**

公开课表格1Private Sub-TestOracleButton_Click(发送方作为对象,e作为EventArgs(处理TestOracleButton.ClickTestOracleConnection((结束子

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()

最新更新