cześć,
Za pomocą mysqlconnectora czytam dane z bazy. Zrobiłem sobie to tak, główna klasa ma interfejs w stylu getUserData itd. W tych metodach jest po prostu tworzona komenda sql i wołamy kolejny obiekt który mam uniwersalną metodę która wykonuje zapytanie(zawsze Select) i przetwarza go na dictionary<string,string> gdzie obrabiam go w wyższych warstwach jak chcę(tworze na jego podstawie inne obiekty). Dodam że ta klasa w sobie trzyma połączenie do mysql. W momencie w kórym obiekt jest niszczony z finalizatora wołane jest close na połączeniu(dlatego w metodzie niżej nie ma close na samym połączeniu tylko na readerze).
Wygląda to mniej więcej tak
MySqlCommand myCommand = new MySqlCommand(sql, mConnection);
MySqlDataReader myReader;
myReader = myCommand.ExecuteReader();
Dictionary<string, string> data = new Dictionary<string, string>();
int count = myReader.FieldCount;
string key;
string value;
bool status = myReader.Read();
for (int i = 0; i < count; i++)
{
key = myReader.GetName(i).ToString();
value = myReader.GetValue(i).ToString(); // tu dostaję Read must be called first
data.Add(key, value);
}
myReader.Close();
myCommand.Dispose();
return data;
W kodzie wy wyższych partiach pod rząd wołam to pośrednio dwa razy. Za pierwszym razem działa a za drugim wali Read must be called first. W skrócie wygląda to tak(pseudo kod):
void foo()
{
IRunner = new mysqlSqlRunner(konfiguracja_bazy)
DbInterface = new mysqlInterface (lRunner) //ok
dictionary1=DbInterface .getUserData();
// wykonaj operacje na słowniku
dictionary2=DbInterface .getOtherData(); // i tu mamy błąd
// Funkcja się kończy i niszczymy obiekty. Finalizator z zamknięciem połączenia jest wołany w mysqlSqlRunner.
}
Jakiś pomysł dlaczego tak mi rzuca wyjątkiem?