【问题标题】:ASP.NET Core - Key Not Found Upon Execute CommandASP.NET Core - 执行命令时未找到密钥
【发布时间】:2018-02-11 09:07:51
【问题描述】:

我正在尝试使用 ASP.NET Core 连接到我的本地数据库 - 我可以使用 localhost/phpmyadmin 访问该数据库。我是该语言的新手,我正在努力处理与 MySQL 相关的异常。

string constr = Configuration.GetSection("ConnectionStrings:con").Value;
using (MySqlConnection con = new MySqlConnection(constr))
{
    string query = @"SELECT id
                    FROM `test`";
    using (MySqlCommand cmd = new MySqlCommand(query, con))
    {
        con.Open();
        using (var sqlDataReader = cmd.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
                var id = sqlDataReader.GetInt32(0);
            }
        }
        con.Close();
    }
}

异常发生在 using (var sqlDataReader = cmd.ExecuteReader()) 行。

这是我的连接字符串:

"ConnectionStrings": {
    "con": "Server=localhost;Database=musense;User=root;Password=********;Charset=utf8"
 }

我在 appsettings.json 中设置连接字符串。如果没有字符集,我会收到“'windows-1252' 不是受支持的编码名称”的异常。

在运行上述代码时,我在 using (var sqlDataReader = cmd.ExecuteReader()) 行收到以下异常。:

/home/memonick/Documents/Projects/musense/musense.csproj : warning NU1701: Package 'MySql.Data 6.9.9' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.0'. This package may not be fully compatible with your project.
/home/memonick/Documents/Projects/musense/musense.csproj : warning NU1701: Package 'MySql.Data 6.9.9' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.0'. This package may not be fully compatible with your project.

Unhandled Exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at MySql.Data.MySqlClient.MySqlField.SetFieldEncoding()
   at MySql.Data.MySqlClient.NativeDriver.GetColumnData(MySqlField field)
   at MySql.Data.MySqlClient.NativeDriver.GetColumnsData(MySqlField[] columns)
   at MySql.Data.MySqlClient.Driver.GetColumns(Int32 count)
   at MySql.Data.MySqlClient.ResultSet.LoadColumns(Int32 numCols)
   at MySql.Data.MySqlClient.ResultSet..ctor(Driver d, Int32 statementId, Int32 numCols)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlDataReader.Close()
   at MySql.Data.MySqlClient.MySqlCommand.ResetReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at musense.Startup.ConfigureServices(IServiceCollection services) in /home/memonick/Documents/Projects/musense/Startup.cs:line 46
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at musense.Program.BuildWebHost(String[] args) in /home/memonick/Documents/Projects/musense/Program.cs:line 21
   at musense.Program.Main(String[] args) in /home/memonick/Documents/Projects/musense/Program.cs:line 17

值得注意的是正在建立连接。因此,例如,我可以更新一行,或执行 SELECT VERSION()。仅当我尝试从 ASP.NET Core 对表执行 SELECT 语句时,才会出现此问题。该语句本身似乎有效,因为它在 phpmyadmin 中正常执行。

测试表具有以下架构:

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL,
  `value` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;

我尝试了各种排序规则,但异常仍然存在。欢迎任何帮助!

【问题讨论】:

  • MySQL 连接器返回一个可以与 DBNull.Value 进行比较的值。看起来数据库正在从记录中返回一个空值。
  • @AnirudhaGupta 哪个连接器应该返回一个值?
  • 我假设它是你的主键,它是否存在。因为如果它为空,它将产生类型转换异常,并且您的异常提示在 0 索引上返回什么都没有。
  • 我只有一条记录 - id(主键)为 1,value(另一列)为 12。因为我写,在phpmyadmin中执行SELECT id FROM test成功返回该行。
  • 我没有看到它已经在您的问题中。 MySql.Data 6.9.9 并非设计用于.NET Core,请升级并至少使用6.10.3-rc 版本(您需要在nuget 浏览器中勾选show prerelease packages),然后重试。

标签: c# mysql asp.net asp.net-core


【解决方案1】:

您的问题源于您使用的 NuGet 包与.NETCoreApp2.0 不兼容:

/home/memonick/Documents/Projects/musense/musense.csproj : warning NU1701: Package 'MySql.Data 6.9.9' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.0'. This package may not be fully compatible with your project.

你需要升级MySql.Data 6.9.9并至少使用6.10.3-rc版本(记得在nuget浏览器中检查show prerelease packages),兼容.netstandard1.3及以上(包括@987654326) @)。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2022-01-24
    • 2017-04-07
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多