user1071461
user1071461

Reputation:

Invalid attempt to access a field before calling Read()

I'm getting the error: Invalid attempt to access a field before calling Read() at: string result = Reader.GetString(0);

I'm not entirely sure what to do or whats wrong though

internal int GetCharGuidByName(string charactername, MySqlConnection connection)
{
    MySqlCommand command = connection.CreateCommand();
    MySqlDataReader Reader;
    command.CommandText = "SELECT guid FROM characters WHERE name=\""+charactername+"\";";
    // Initialize MySQL Reader
    Reader = command.ExecuteReader();
    Reader.Read();
    string result = Reader.GetString(0);
    // If the character doesn't exist or isn't entered, return 0
    int charguid = 0;
    if (result != String.Empty)
    {
        charguid = Convert.ToInt32(result);
    }
    return charguid;
}

Upvotes: 0

Views: 9445

Answers (3)

LesDanThree
LesDanThree

Reputation: 1

            openConnection()

            sql = "SELECT last, first, emp_type, active FROM employee INNER JOIN account ON employee.emp_id = account.emp_id WHERE employee.emp_id = '" & AtxtEmpID.Text & "'"

            command = New MySqlCommand(sql, mySqlConnection)

            reader = command.ExecuteReader

            reader.Read()

            AtxtEmpName.Text = reader.Item(0) & ", " & reader.Item(1)

            closeConn()

have the save problem

Upvotes: 0

HatSoft
HatSoft

Reputation: 11201

You should use ExecuteScalar instead of ExecuteReader

ExecuteSaclar returns the first column of the first row in the result set, or a null reference

ExecuteReader will return as resultset which you have to then iterate to read

So looking at your code you just want the first column of the result set

internal int GetCharGuidByName(string charactername, MySqlConnection connection)
{
    int charguid = 0;

    using(MySqlCommand command = connection.CreateCommand())
    {
      command.CommandText = "SELECT guid FROM characters WHERE name=\""+charactername+"\";";
      object obj  = command.ExecuteScalar();
      if (obj != null && obj != DBNull.Value)
      {
         charguid = Convert.ToInt32(obj);
      }
    }

      return charguid;
}

Upvotes: 1

Mitja Bonca
Mitja Bonca

Reputation: 4546

Change the code to:

Reader = command.ExecuteReader();
int charguid = 0;
if(Reader.Read())
{
   if(Reader[0] != DBNull.Value)
   {
       if(int.TryParse(Reader[0].ToString(), out charguid))
       {
        //value read and is an integer!
       }
   }
}
return charguid;

Upvotes: 2

Related Questions