0

次のエラーが表示されます: Read() at: string result = Reader.GetString(0); を呼び出す前に、フィールドにアクセスする試みが無効です。

私は何をすべきか、何が間違っているのか完全にはわかりません

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;
}
4

3 に答える 3

2

コードを次のように変更します。

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;
于 2012-07-13T19:19:46.073 に答える
1

ExecuteReader の代わりに ExecuteScalar を使用する必要があります

ExecuteSaclar は、結果セットの最初の行の最初の列、または null 参照を返します。

ExecuteReader は結果セットとして返され、それを繰り返して読み取る必要があります

したがって、コードを見ると、結果セットの最初の列が必要です

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;
}
于 2012-07-13T19:48:14.383 に答える