Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Invalid attempt to read when no data is present" when using SQLDataReader

Tags:

c#

asp.net

Here is my GeneralFunctions:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

/// <summary>
/// Summary description for GeneralFunctions
/// </summary>
public class GeneralFunctions
{
    public GeneralFunctions ()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public static DataTable GetData ( string query )
    {
        SqlDataAdapter dataAdapter;
        DataTable table;

        try
        {
            dataAdapter = new SqlDataAdapter( query, GetConnectionString() );
            table = new DataTable();

            dataAdapter.Fill( table );
            return table;
        }
        catch ( Exception ex )
        {
        }
        finally
        {
            dataAdapter = null;
            table = null;
        }

        return table;
    }

    private static string GetConnectionString ()
    {
        string connectionString = ConfigurationManager.ConnectionStrings[ "CAPortalConnectionString" ].ConnectionString;

        return connectionString;
    }

    public static int? AuthenticateLogin ( string username, string password )
    {
        using ( var conn = new SqlConnection( GetConnectionString() ) )
        using ( var cmd = conn.CreateCommand() )
        {
            conn.Open();
            cmd.CommandText =
            @"SELECT 
                 DistID 
             FROM 
                 Distributor
             WHERE 
                 Username = @username 
             AND 
                 Password = @password";
            cmd.Parameters.AddWithValue( "@username", username );
            cmd.Parameters.AddWithValue( "@password", password );
            using ( var reader = cmd.ExecuteReader() )
            {
                if ( !reader.Read() )
                {
                    // no results found
                    return null;
                }
                return reader.GetInt32( reader.GetOrdinal( "DistID" ) );
            }
        }
    }

    public static string GetDistInfo ( int distID )
    {
        using ( var conn = new SqlConnection( GetConnectionString() ) )
        using ( var cmd = conn.CreateCommand() )
        {
            conn.Open();
            cmd.CommandText =
            @"SELECT 
                 FName + ' ' + LName AS Name
             FROM 
                 Distributor
             WHERE 
                 DistID = @distid";
            cmd.Parameters.AddWithValue( "@distid", distID );
            using ( var reader = cmd.ExecuteReader() )
            {
                return reader.GetString( reader.GetOrdinal( "Name" ) );
            }
        }
    }

}

Here is my login page:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class index : System.Web.UI.Page
{
    protected void Page_Load ( object sender, EventArgs e )
    {

    }
    protected void but_login_Click ( object sender, EventArgs e )
    {
        if ( username_id.Text != "" || password.Text != "" )
        {
            // Verify the username and password match the database
            var distId = GeneralFunctions.AuthenticateLogin( username_id.Text, password.Text );

            if ( distId != null )
            {
                // User is authenticated
                var name = GeneralFunctions.GetDistInfo( (int)distId );
                Session[ "DistName" ] = name;
                Session[ "DistID" ] = distId;

                Response.Redirect( "dashboard.aspx", false );
            }
            else
            {
                // provide error label here username and password do not match
                authentFailed.Text = "Username / Password did not match our records";
            }
        }
        else
        {
            // Username or Password blank error lable
            authentFailed.Text = "Please Input Username / Password";
        }
    }
}

Before I added the GetDistInfo method it worked just fine, logged in the user. I then tried to add Session variables and the GetDistInfo method. I pass in the DistID returned from AuthenticateLogin into the GetDistInfo method. It errors out with the following error:

Exception Details: System.InvalidOperationException: Invalid attempt to read when no data is present.

Source Error:

Line 95:             using ( var reader = cmd.ExecuteReader() )
Line 96:             {
Line 97:                 return reader.GetString( reader.GetOrdinal( "Name" ) );
Line 98:             }
Line 99:         }


Source File: c:\inetpub\wwwroot\Base\ClientAccessPortal\App_Code\GeneralFunctions.cs    Line: 97 

When I run the SQL against the database it correct pulls back the clients name. I'm not sure why it isn't doing that inside the code. Anyone able to see what I am missing?

like image 989
James Wilson Avatar asked Apr 13 '12 18:04

James Wilson


People also ask

What is SqlDataReader in Ado net?

ADO.NET SqlDataReader Class. This class is used to read data from SQL Server database. It reads data in forward-only stream of rows from a SQL Server database. it is sealed class so that cannot be inherited. It inherits DbDataReader class and implements IDisposable interface.

What is the use of SqlDataReader in C#?

The SqlDataReader is used to read a row of record at a time which is got using SqlCommand. It is read only, which means we can only read the record; it can not be edited. And also it is forward only, which means you can not go back to a previous row (record).

Do I need to close SqlDataReader?

You must explicitly call the Close method when you are through using the SqlDataReader to use the associated SqlConnection for any other purpose.

How do you fix there is already an open DataReader associated with this Command which must be closed first?

There is already an open DataReader associated with this Command which must be closed first. Have you got solution for this error? Hi, Try disconnecting and reconnecting to database before executing the query.


2 Answers

Please try replacing this. Actually Read() was missing in your code.

using ( var reader = cmd.ExecuteReader() )
{
     return reader.GetString( reader.GetOrdinal( "Name" ) );
}

With following

using ( var reader = cmd.ExecuteReader() )
{
     if(reader.Read())
     {
          return reader.GetString( reader.GetOrdinal( "Name" ) );
     }
     return null;
}
like image 94
Pankaj Avatar answered Sep 17 '22 07:09

Pankaj


You need to read first (you're doing it when using the reader above in your code):

using ( var reader = cmd.ExecuteReader() )
{
    // you haven't positioned yourself on a record yet.
    while (reader.Read())
    {
        return reader.GetString( reader.GetOrdinal( "Name" ) );
    }
    return string.Empty;
}

EDIT To respond to the error you got; since you define your function

public static string GetDistInfo ( int distID )

all possible ways "out of the function" must return something. In your case you should return a string or maybe null depending on what you want to do.

like image 40
Asken Avatar answered Sep 21 '22 07:09

Asken