Link to home
Start Free TrialLog in
Avatar of ridi786
ridi786

asked on

DATAREADER Invalid attempt to Read when reader is closed.

Basically im having the error because the datareader is not finding any data to meet the query criteria. So it closes but returns nothing, how do i give back a message saying that there is no data? Code is Below


'This checks the date selected on the calendar and runs a query based on the selection
Sub Button1_Click(sender As Object, e As EventArgs)
    If month(formatdatetime(calendar1.SelectedDate,0)) = month(formatdatetime(system.DateTime.now,0)) or month(formatdatetime(calendar1.selectedDate,0)) > month(formatdatetime(system.DateTime.now,0)) then
    datagrid1.datasource = ""
    datagrid1.databind()
        Label1.text = "Please choose another date, at least a month back"
    Else
    datagrid1.datasource = Select_info(calendar1.selecteddate) ' DATA READER USED HERE
    datagrid1.databind()
        label1.text = "Select the campaign using the select button next to it to view detailed campaign information. You have selected campaign information from " & formatdatetime(Calendar1.SelectedDate,2) & " to " & formatdatetime(system.Datetime.now,2) & "."
    End if
End Sub


THIS IS THE FUNCTION used ABOVE :

    Function Select_info(ByVal datesel As Date) As System.Data.IDataReader
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=DATASOURCE
        Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

        Dim queryString As String = "SQL QUERY where [Start_Dte] >= @datesel) order by start_dte desc"
        Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
        dbCommand.CommandText = queryString
        dbCommand.Connection = dbConnection

        Dim dbParam_datesel As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_datesel.ParameterName = "@datesel"
        dbParam_datesel.Value = datesel
        dbParam_datesel.DbType = System.Data.DbType.DateTime
        dbCommand.Parameters.Add(dbParam_datesel)

        dbConnection.Open
        Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
       
        Return dataReader
    End Function

Any help will be appreciated.

Thx
Avatar of razo
razo

Else
    datagrid1.datasource = Select_info(calendar1.selecteddate) ' DATA READER USED HERE
    datagrid1.databind()
if datagrid1.items.count<1 then
' no data found
else
        label1.text = "Select the campaign using the select button next to it to view detailed campaign information. You have selected campaign information from " & formatdatetime(Calendar1.SelectedDate,2) & " to " & formatdatetime(system.Datetime.now,2) & "."
    End if
Avatar of ridi786

ASKER

Hi still does not work.

Gives me the same error.

System.InvalidOperationException: Invalid attempt to Read when reader is closed.
Source Error:


Line 21:         Else
Line 22:         datagrid1.datasource = Select_info(calendar1.selecteddate)
Line 23:         datagrid1.databind() 'HIGHLIGHTS HERE
Line 24:         if datagrid1.items.count<1 then
Line 25:     ' no data found
 

I stand to be corrected but I think there needs to be some sort of statement in the function here

Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
       
        Return dataReader


Hi,

change this
 datagrid1.datasource = Select_info(calendar1.selecteddate) ' DATA READER USED HERE
    datagrid1.databind()

to

 Dim reader as DataReader = Select_info(calendar1.selecteddate)
 if reader.HasRows Then
    datagrid1.datasource = reader
    datagrid1.databind()
 else
 'show message
 end if


Regards,
B..M
Avatar of ridi786

ASKER

Type 'DataReader' is not defined.

Error thats coming up.
the datareader doesnt give an error when binded if it is empty
Avatar of ridi786

ASKER

Well it is giving me the error as below

System.InvalidOperationException: Invalid attempt to Read when reader is closed.
Source Error:


Line 21:         Else
Line 22:         datagrid1.datasource = Select_info(calendar1.selecteddate)
Line 23:         datagrid1.databind() 'HIGHLIGHTS HERE
Line 24:         if datagrid1.items.count<1 then
Line 25:     ' no data found

I think its not picking up data and closing, so its not returning anything, and thats creating the error.
ASKER CERTIFIED SOLUTION
Avatar of mmarinov
mmarinov

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
also you have to use

Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader()
instead of
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

because the behaviour that you have specified close the reader


Regards,
B..M
Avatar of ridi786

ASKER

but then wont it still keep an open connection to the database until its closed?
Avatar of ridi786

ASKER

Ok its sorted, i didnt have to leave the reader open, as you said. What i did was just defined it with System.Data.OleDb.OleDbDataReader, and that accepted and worked. Thanks alot for the help :)

if you want to close the connection, then use a dataset object
datareader object read a one-record at a time not all records
so if you close the connection, the reader will not be able to read from database
the dataset object get all data in memory and doesn't care if there is open connection
it dispose the object from the memory when you set it to null and the garbage collector goes through it
Regards,
B..M
Hi,
I think the problem is that the connection is getting closed when the function Select_info ends sotry by placing the line
 Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
globally i.e out of the select_info function. It should work

Regards,
Venki