Команда mysql executescalar возвращает null в С#

Допустим, у меня есть результат запроса, который выглядит следующим образом:

ID    NAME    Phone
----  ----    -----
1     John    123456
2     John    125678
3     John    345678
4     Abby    456789
5     Abby    567890

Я хочу вернуть только один экземпляр строки имени: Джон, где номер телефона, например, «12%».

В C# я написал этот синтаксис, чтобы получить переменную PersonName в результате запроса.

MySqlConnection connection = new MySqlConnection("SERVER=" + "localhost" + ";" + "DATABASE=" + "testdb" + ";" + "UID=" + "root" + ";" + "PASSWORD=" + "" + ";");
MySqlCommand command = new MySqlCommand();    

    connection.Open();
    string selectQuery = "SELECT NAME FROM testtable WHERE Phone LIKE '12%' ORDER BY ID LIMIT 1";
    command.Connection = connection;
    command.CommandText = selectQuery;
    string PersonName = (string)command.ExecuteScalar();
    connection.Close();

Я не знаю, что не так с моим кодом, но PersonName возвращает null. Что я сделал не так?


person rfa    schedule 09.07.2015    source источник
comment
Когда вы запускаете selectQuery для базы данных напрямую (не через код, который вы показываете), каковы результаты?   -  person Eric Walker    schedule 09.07.2015
comment
Является ли тип столбца «Телефон» текстовым или числовым столбцом?   -  person Joel Coehoorn    schedule 09.07.2015
comment
он возвращает 1 столбец 1 строку со значением John.   -  person rfa    schedule 09.07.2015
comment
Кроме того: не забудьте использовать try/finally или использование блоков для переноса объекта подключения, иначе вы можете заблокировать себя в базе данных.   -  person Joel Coehoorn    schedule 09.07.2015
comment
это числовой столбец. когда я запускаю запрос к БД напрямую, он возвращает Джона, как я и ожидал. Я вставил табличный запрос с аналогичным порядком запуска команды. Я не мог найти ошибку своего кода.   -  person rfa    schedule 09.07.2015
comment
Если вы получаете скалярное значение при непосредственном выполнении запроса, ошибка должна быть где-то еще. Можете ли вы добавить к своему вопросу дополнительный код, показывающий, где вы создаете соединение и команду?   -  person Eric Walker    schedule 09.07.2015
comment
Спасибо за дополнительную информацию @rfa, просто быстрый вопрос, а затем мне нужно попробовать еще одну вещь. Ваша база данных и таблица названы testtable?   -  person Eric Walker    schedule 10.07.2015
comment
имя базы данных — testdb, а имя таблицы — testtable. спасибо   -  person rfa    schedule 12.07.2015


Ответы (2)


Мы должны упустить что-то еще здесь. Попробуйте следующий пример кода на основе того, что вы предоставили:

try {
MySqlConnection connection = new MySqlConnection("SERVER=localhost;DATABASE=testdb;UID=root;PASSWORD=;");
MySqlCommand command = new MySqlCommand();    

connection.Open();
string selectQuery = "SELECT NAME FROM testtable WHERE Phone LIKE '12%' ORDER BY ID LIMIT 1";
command.Connection = connection;
command.CommandText = selectQuery;
string PersonName = (string)command.ExecuteScalar();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
finally {
    connection.Close();
}

У меня такое ощущение, что по какой-то причине вызов .Open() не работает, и ошибка проглатывается в другом месте. Попробуйте вышеизложенное и дайте мне знать, что вы обнаружите.

person Eric Walker    schedule 13.07.2015

сделать это : изменить это (string)command.ExecuteScalar(); на Convert.ToString(command.ExecuteScalar());

MySqlConnection connection = new MySqlConnection("SERVER=" + "localhost" + ";" + "DATABASE=" + "testdb" + ";" + "UID=" + "root" + ";" + "PASSWORD=" + "" + ";");

Команда MySqlCommand = новая MySqlCommand();

connection.Open();
string selectQuery = "SELECT NAME FROM testtable WHERE Phone LIKE '12%' ORDER BY ID LIMIT 1";
command.Connection = connection;
command.CommandText = selectQuery;
string PersonName = Convert.ToString(command.ExecuteScalar());
connection.Close();
person bigtheo    schedule 09.04.2021