We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

VB OracleDataReader

bertino12
bertino12 asked
on
Medium Priority
492 Views
Last Modified: 2012-05-07
I am selecting a single row that will return a single value. I need to assign that value to a variable of type integer. How can I do this?
The code below is crashing at:
Dim dr As OracleDataReader = myCmd.ExecuteReader()
with this error:
Connection must be open for this operation

I know I just dont have the syntax right because the connection object is correct right before that line is executed.
Dim intDocID As Integer = Nothing
        Dim myConn As Global.Oracle.DataAccess.Client.OracleConnection = Nothing
        Dim myCmd As OracleCommand = Nothing
        Dim strQuery As String = "SELECT DOC_ID FROM DOCUMENTS WHERE DISPLAY_NAME = '1a' 
 
        Try
            Dim strConnect As String = ConfigurationManager.ConnectionStrings("MYDB").ConnectionString
            myConn = New OracleConnection(strConnect)
            myCmd = New OracleCommand(strQuery, myConn)
            myCmd.CommandType = CommandType.Text
            Dim dr As OracleDataReader = myCmd.ExecuteReader() 
            dr.Read()
 
            intDocID = dr.GetInt16("doc_id").ToString()
        Catch ex As Exception
            Dim statusMessage As String = "DATABASE ERROR retrieving data - " + ex.Message
            Throw New ApplicationException(statusMessage)
        Finally
 
            If Not myCmd Is Nothing Then
                myCmd.Dispose()
            End If
 
            If Not myConn Is Nothing Then
                myConn.Close()
                myConn.Dispose()
            End If
        End Try

Open in new window

Comment
Watch Question

Billing Engineer
CERTIFIED EXPERT
Most Valuable Expert 2014
Top Expert 2009
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
You never called myConn.Open(), this is likely the cause of the specific error message you got.

--
Alain

Author

Commented:
Well I did it like below in another function and it works fine.
 Dim myDT As DataTable = Nothing
        Dim myConn As Global.Oracle.DataAccess.Client.OracleConnection = Nothing
        Dim myCmd As OracleCommand = Nothing
        Dim myDA As OracleDataAdapter = Nothing
        Dim strQuery As String = "SELECT D.DOC_ID, D.DOC_TYPE, D.DISPLAY_NAME, D.SUMMARY, D.HTML_DOC, D.SORTCODE " & _
            "FROM DOCUMENTS D " 
        Try
            Dim strConnect As String = ConfigurationManager.ConnectionStrings("myDB").ConnectionString
            myConn = New OracleConnection(strConnect)
 
            myCmd = New OracleCommand(strQuery, myConn)
 
            myCmd.CommandType = CommandType.Text
 
            myDA = New OracleDataAdapter(myCmd)
            myDT = New DataTable("FindResults")
 
            myDA.Fill(myDT)
 
        Catch ex As Exception
            Dim statusMessage As String = "DATABASE ERROR retrieving Find data (""Find By Text"") - " + ex.Message
            Throw New ApplicationException(statusMessage)
        Finally
 
            If Not myCmd Is Nothing Then
                myCmd.Dispose()
            End If
 
            If Not myConn Is Nothing Then
                myConn.Close()
                myConn.Dispose()
            End If
        End Try

Open in new window

Top Expert 2007

Commented:
If you are only returning a single value from 1 row, then use the ExecuteScalar method:

    myCmd.Connection.Open()

    Dim myValue As String = myCmd.ExecuteScalar()

    myCmd.Connection.Close()

Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.