2009-05-07 7 views
1

J'ai la méthode suivante qui est utilisée pour remplir un DAO à partir de la base de données. Il effectue 3 lectures - une pour l'objet principal et 2 pour certaines traductions.Problème de requête paramétré C# MySQL

public bool read(string id, MySqlConnection c) 
{ 
    MySqlCommand m = new MySqlCommand(readCommand); 
    m.Parameters.Add(new MySqlParameter("@param1", id)); 
    m.Connection = c; 
    MySqlDataReader r = m.ExecuteReader(); 
    r.Read(); 
    accountID = Convert.ToInt32(r.GetValue(0).ToString()); 
    ... 
    comment = r.GetValue(8).ToString(); 
    r.Close(); 
    m = new MySqlCommand(getAccountName); 
    m.Parameters.Add(new MySqlParameter("@param1", accountID)); 
    m.Connection = c; 
    r = m.ExecuteReader(); 
    r.Read(); 
    account1Name = r.GetValue(0).ToString(); 
    r.Close(); 
    m = new MySqlCommand(getAccountName); 
    m.Parameters.Add(new MySqlParameter("@param1", secondAccountID)); 
    m.Connection = c; 
    r = m.ExecuteReader(); 
    r.Read(); 
    account2Name = r.GetValue(0).ToString(); 
    r.Close(); 
    return true; 
} 

Sur la ligne account2Name = r.GetValue(0).ToString(); je reçois l'erreur suivante:

Invalid attempt to access a field before calling Read() 

Je ne comprends pas ce que le problème est - la ligne précédente appelle lecture!

Répondre

3

Cela semble fonctionner plus tôt dans votre code. Êtes-vous sûr qu'il ya une valeur à lire là (c.-à-est votre requête qui renvoie 0 lignes ou nulle ou autre chose qui ne peut pas être converti en une chaîne?)

+0

Merci, si évident quand il est souligné! – Elie

1
  1. Ressemble cette procédure fonctionne très bien sur la ligne account1Name = r.GetValue(0).ToString(); . Peut-être que vous voulez vérifier la valeur de retour de r.Read() pour voir s'il y a des lignes en premier. L'erreur peut être interprétée comme "Tentative d'accès à un champ sans données" ...
  2. Il semble que vous essayez d'obtenir une valeur unique à partir d'une requête. Vous pourriez vouloir regarder dans la méthode ExecuteScalar() au lieu de ExecuteReader().