Ошибка отсутствия ключа в запросе MySQL

#c# #mysql

#c# #mysql

Вопрос:

Я работаю на C # и MySQL в VS2015 для запроса моей базы данных. Однако, когда я ввожу имя столбца, которое не имеет типа Int или Datetime, datareader возвращает ошибку.

Однако в базе данных существует столбец, который соответствует строке, которую я ввожу в качестве имени базы данных. Мой Код:

         string DateQuery = "SELECT timeStamp, amount, tax, name FROM log.transactions";

        MySqlCommand cmd3 = new MySqlCommand(DateQuery, connectionString);

        MySqlDataReader dataReader3 = cmd3.ExecuteReader();
 

При компиляции это вернет ошибку: «Необработанное исключение типа ‘System.Коллекции.Generic.KeyNotFoundException’ произошел в mscorlib.dll

Дополнительная информация: Данный ключ отсутствовал в словаре.»

В dataReader3.

Но если я удалю столбец name(VarChar type) из запроса, он будет скомпилирован и выполнен нормально с меткой времени (DateTime), суммой (Int) и налогом (Int).

На какой словарь он ссылается, который не содержит ключа? И почему это влияет только на типы, которые не являются Int или DateTime?

РЕДАКТИРОВАТЬ: полный код размещен ниже

  using System;
 using MySql.Data.MySqlClient;

 namespace TestApp
{
 class Program
{
    static void Main(string[] args)
    {
        Program generateReport = new Program();
        generateReport.Kickoff();
    }

    public void Kickoff()
    {
        string dbString = "server=XXXXXX;uid=XXXXXX;"   "pwd=XXXXX;database=XXXXX;";
        MySqlConnection connectionString = new MySqlConnection(dbString);

        connectionString.Open();
        Console.WriteLine("nAttempting to connect to database...");
        if (connectionString.State.ToString() == "Open")
        {
            Console.WriteLine("Connection successful.");
        }
        else
        {
            Console.WriteLine("Connection failed. :(");
            return;
        }

        string DateQuery = "SELECT timeStamp, amount, tax, name FROM log.transactions";

        MySqlCommand cmd3 = new MySqlCommand(DateQuery, connectionString);
        MySqlDataReader dataReader3 = cmd3.ExecuteReader();
    }
}
 

}

РЕДАКТИРОВАТЬ: Трассировка стека, я полагаю:

 at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at MySql.Data.MySqlClient.CharSetMap.GetCharacterSet(DBVersion version String CharSetName)
at MySql.Data.MySqlClient.NativeDriver.GetFieldMetaData41()
at MySql.Data.MySqlClient.NativeDriver.GetFieldMetaData()
at MySql.Data.MySqlClient.NativeDriver.ReadColumnMetadata(Int32 count)
at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior       behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
at TestApp.Program.Kickoff() in c:usersTestuserdocumentsvisual studio 2015ProjectsTestAppTestAppProgram.cs:line 42
at TestApp.Program.Main(String[] args) in c:usersTestuserdocumentsvisual studio 2015ProjectsTestAppTestAppProgram.cs:line 13
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
 

Комментарии:

1. Пожалуйста, покажите трассировку стека.

2. Мы не знаем, где происходит ошибка, ее нет в этом code.snippet .

3. Я думаю, что name является резервным словом mysql. Попробуйте сделать это так для имени name

4. Я не уверен, что вы подразумеваете под трассировкой стека. Я включил упрощенную версию кода, которая по-прежнему выдает ту же ошибку.

5. dev.mysql.com/doc/refman/5.5/en/keywords.html

Ответ №1:

Попробуйте сделать это так для имени:

    SELECT timeStamp, amount, tax,  `name` FROM log.transactions
 

Комментарии:

1. если заключить имя в одинарную кавычку, то каждое значение, возвращаемое для столбца «name», будет строкой «name».

2. По моей вине это не одинарные кавычки, а обратные тики. Я исправил свой код, чтобы отразить это, и я все еще получаю недостающий ключ из ошибки словаря, которая указана ранее.

3. У вас есть решение? Я борюсь с этой проблемой. Пожалуйста, ответьте.