【问题标题】:Missing Key Error in MySQL QueryMySQL 查询中缺少键错误
【发布时间】:2016-10-13 23:33:56
【问题描述】:

我在 VS2015 中使用 C# 和 MySQl 来查询我的数据库。但是,当我输入非 Int 或 Datetime 类型的列名时,datareader 会返回错误。

但是,数据库中存在与我作为数据库名称输入的字符串匹配的列。我的代码:

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

        MySqlCommand cmd3 = new MySqlCommand(DateQuery, connectionString);

        MySqlDataReader dataReader3 = cmd3.ExecuteReader();

在编译时,这将返回错误:“在 mscorlib.dll 中发生 'System.Collections.Generic.KeyNotFoundException' 类型的未处理异常

附加信息:给定的键不在字典中。”

在 dataReader3 上。

但是如果我从查询中删除 name(VarChar type) 列,它将编译并使用 timeStamp(DateTime) amount(Int) 和 tax(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:\users\Testuser\documents\visual studio 2015\Projects\TestApp\TestApp\Program.cs:line 42
at TestApp.Program.Main(String[] args) in c:\users\Testuser\documents\visual studio 2015\Projects\TestApp\TestApp\Program.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()

【问题讨论】:

  • 请显示堆栈跟踪。
  • 我们不知道显示错误发生在哪里,它不在此code.sn-p中。
  • 我认为name是mysql的保留词。试试这个名字name
  • 我不确定你所说的堆栈跟踪是什么意思。我包含了仍然抛出相同错误的代码的简化版本。

标签: c# mysql


【解决方案1】:

试试这个名字:

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

【讨论】:

  • 在 name 周围加上一个单引号会使 "name" 列返回的每个值都是字符串 "name"。
  • 我的错,那些不是单引号而是反引号。我更正了我的代码以反映这一点,但我仍然从前面列出的字典错误中获取缺少的键。
  • 你有解决办法吗?我正在努力解决这个问题。请回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多