C# MySQL Read must be called first

Есть странная проблема. Вот код:

string[] ret = new string[3];
string SQLTablename = configdata(Config)["SQL"]["UserTable"];
MySqlConnection connect = new MySqlConnection(SQLConnSTR);
connect.Open();
string sqlcmd = String.Format("SELECT * FROM `{0}` WHERE `ID` = {1}", SQLTablename, ID);
MySqlCommand command = new MySqlCommand(sqlcmd, connect);
MySqlDataReader reader = command.ExecuteReader();
reader.Read();
ret[0] = reader["ID"].ToString();
ret[1] = reader["Name"].ToString();
ret[2] = reader["SelectedMember"].ToString();
reader.Close();
connect.Close();
return ret;

Он работает нормально при запуске отладки, но стоит мне собрать проект (проект netcore), то вываливается ошибка

16-12-2020 20:37:15 : Read must be called first.
16-12-2020 20:37:16 :    at MySqlConnector.Core.ResultSet.GetCurrentRow() in /_/src/MySqlConnector/Core/ResultSet.cs:line 420
   at MySqlConnector.MySqlDataReader.get_Item(String name) in /_/src/MySqlConnector/MySqlDataReader.cs:line 196
   at ПУТЬДОФАЙЛА.getuserinfo(String Config, UInt64 ID)

Ошибка появляется при попытке выполнить этот код

ПУТЬДОФАЙЛА это путь до функции. Я просто его скрыл


Ответы (1 шт):

Автор решения: FAR747

Ошибка в том, что БД по запросу возвращала null ибо по условию не подходила ни одна запись. Ошибка Read must be called first была из за того, что я пытался прочесть reader в котором ничего не было. Этого можно избежать добавив проверку if (reader.Read()). В итоге код будет выглядеть так

string[] ret = new string[3];
string SQLTablename = configdata(Config)["SQL"]["UserTable"];
MySqlConnection connect = new MySqlConnection(SQLConnSTR);
connect.Open();
string sqlcmd = String.Format("SELECT * FROM `{0}` WHERE `ID` = {1}", SQLTablename, ID);
MySqlCommand command = new MySqlCommand(sqlcmd, connect);
MySqlDataReader reader = command.ExecuteReader();
if (reader.Read()){
    // Получаем данные из reader
    ret[0] = reader["ID"].ToString();
    ret[1] = reader["Name"].ToString();
    ret[2] = reader["SelectedMember"].ToString();
    reader.Close();
    connect.Close();
    return ret;
} 
else {
    // Если reader оказался пустой
    return null;
}
→ Ссылка