2017-01-30 3 views
1

Попытка получить простой счет из таблицы приводит к исключению ниже. Пробовал разные избранные statemens, которые также делают исключение: «SELECT * FROM goods», но «SELECT col1, col2 FROM goods» - работает без исключения. Что я делаю не так? С рабочего места работают эти селекторы.. Net MySql error «Указанный ключ отсутствовал в словаре»

Данный ключ отсутствует в словаре. System.Collections.Generic.KeyNotFoundException: данный ключ не был указан в словаре. в System.Collections.Generic.Dictionary`2.get_Item (ключ TKey) в MySql.Data.MySqlClient.MySqlField.SetFieldEncoding() в MySql.Data.MySqlClient.NativeDriver.GetColumnData (MySqlField поле)
в MySql. Data.MySqlClient.NativeDriver.GetColumnsData (MySqlField [] столбцы) в MySql.Data.MySqlClient.Driver.GetColumns (количество Int32)
на MySql.Data.MySqlClient.ResultSet.LoadColumns (Int32 numCols) на MySql.Data. MySqlClient.ResultSet..ctor (водитель д, Int32 StatementId, Int32 numCols) при MySql.Data.MySqlClient.Driver.NextResult (Int32 StatementId, булева сила) в MySql.Data.MySqlClient.MySqlDataReader.NextResult() при MySql.Data.MySqlClient.MySqlDataReader.Close() в MySql.Data.MySqlClient.MySqlCommand.ResetReader() в MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (CommandBehavior поведение) при MySql.Data.MySqlClient.MySqlCommand. ExecuteReader()
в MySqlSybaseComparer.DbTester.Test (String & ошибки) в C: \ MySqlSybaseComparer \ DbTester.cs: строка 68

фрагмент кода:

using (MySqlConnection conn = new MySqlConnection(ConStrMySql)) 
{ 
    try 
    { 
     conn.Open(); 
     using (MySqlCommand cmd = new MySqlCommand("SELECT count(*) FROM goods", conn)) 
     { 
      using (MySqlDataReader reader = cmd.ExecuteReader()) 
      { 
       if (reader.Read()) 
        MessageBox.Show(reader[0].ToString()); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message + Environment.NewLine + ex.ToString();); 
    } 
    conn.Close(); 
} 

строка подключения к DB: Server=localhost; Database=art; Uid=ramunas; Pwd=xxxx; AllowUserVariables=True;

+2

Когда у у вас есть только счетчик (*), который будет целочисленной переменной, было бы лучше использовать executeScalar Int32 count = Convert.ToInt32 (cmd.ExecuteScalar()); – dennis

+0

ExecuteScalar исключает также. – Ramunas

+0

Надеюсь, что будет таблица, называемая товаром, и u укажут правильное имя базы данных в вашей веб-конфигурации, пожалуйста, попробуйте также выбрать isnull (count (*), 0) из товаров и использовать ExecuteScalar – dennis

ответ

0

Код верный и все предложение также должно работать. Просто удалили настройки «collation-server» и перезапустили сервер, и все работает так, как ожидалось.

enter image description here

1

Попробуйте использовать

SELECT count(*) as count FROM goods 
+0

пробовал, что без успеха – Ramunas

0

Вместо этого заявления:

using (MySqlCommand cmd = new MySqlCommand("SELECT count(*) FROM goods", conn)) 

Использование:

using (var cmd = new MySqlCommand("SELECT COUNT(*) FROM goods", conn)) 

, а затем преобразовать его в целое значение с помощью ExecuteScalar() , Что-то вроде этого:

int count = Convert.ToInt32(cmd.ExecuteScalar()); 
+0

попытался, что без успеха – Ramunas

+0

Вы получаете ту же ошибку, используя это утверждение также? –

+0

Да, сообщение об ошибке идентично – Ramunas

0

я решил ваш же ошибка, просто добавив кодовую строку подключения:

Server=myServer;Port=3306;Database=myDB15;User ID=usr33;Password=usr33P;CharSet=utf8; 

В моем случае я использую MySql Connector для .Net версии 6.9.3. для подключения к 30 равным базам данных с одинаковой структурой, одинаковой сортировкой (utf8_unicode_ci) и различным содержимым таблицы.

Когда я побежал MySqlCommand.ExecuteReader() метод для выбора содержимого из пользователя таблицы, в некоторых базах данных (4 из 30) получил ту же ошибку Данный ключ не присутствовал в словаре.

Смежные вопросы