繁体   English   中英

MySqlConnection.Open() System.InvalidCastException: 对象无法从 DBNull 转换为其他类型

[英]MySqlConnection.Open() System.InvalidCastException: Object cannot be cast from DBNull to other types

我有一个用 c# 编写的到 MySql (MariaDB 5.5.5-10.11.0) 的简单连接字符串:

MySqlConnection Database = new MySqlConnection("Server=127.0.0.1; Port=3306; Database=test; Uid=user; Pwd=MyPassword; Ssl Mode=Required; convert zero datetime=True;");

在两台计算机(Windows 10 和 Windows 11)上一切正常。 但是,当我尝试在 Windows Server 2022 上启动此应用程序时,出现此错误:

System.InvalidCastException: Object cannot be cast from DBNull to other types.
   at System.DBNull.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ToInt32(Object value, IFormatProvider provider)
   at MySql.Data.MySqlClient.Driver.LoadCharacterSets(MySqlConnection connection)
   at MySql.Data.MySqlClient.Driver.Configure(MySqlConnection connection)
   at MySql.Data.MySqlClient.MySqlConnection.Open()
   at MariaDB.Program.StartAPI()

在 Database.Open() 上抛出错误;

MariaDB 已安装并正在运行,Ssl 正在运行,已授予用户权限,端口正确。 有什么想法吗?

整个程序:

using System;
using MySql.Data.MySqlClient;

namespace MariaDB
{
    internal class Program
    {
        MySqlConnection Database = new MySqlConnection("Server=127.0.0.1; Port=3306; Database=test; Uid=user; Pwd=MyPassword; Ssl Mode=Required; convert zero datetime=True;");

        static void Main(string[] args)
        {
            Program p = new Program();
            p.OpenDB();
        }

        private void OpenDB()
        {
            Database.Open();
            Console.WriteLine("Ok");
            Console.ReadLine();
        }
    }
}

这样的事情我也经历过。 把MySql.Data.MySqlClient改成MySqlConnector,问题解决

这是由 MariaDB 10.10.1 使 Information_Schema.Collations 中的 ID 字段为 Nullable 并添加了一堆 ID 为 null 的 Collations 引起的。

https://jira.mariadb.org/browse/MDEV-27009

一种可能的解决方法是使用 MariaDB 10.9 或更早版本。

以下是 MySql.Data 加载排序规则的方式: 在此处输入图像描述

此方法假定“id”列的值不为空。 不幸的是,从 10.10 版本开始,MariaDB 将“Id”列切换为“Allow Null”,并且在 Collations 中有很多行带有 NULL Id。 这会导致“对象无法从 DBNull 转换为其他类型”异常。

如果您希望使用 MySql.Data 包并等待 MySql.Data 中的修复,那么 10.9 似乎是目前唯一的选择。

我也尝试了最新的 RC,似乎 MariaDB 将永远有这个问题,或者至少当前的 MySql.Data.MySqlClient 有问题。

建议的答案是回滚到 10.9 或使用完全不同的连接器,如 MysqlConnector。

要切换到 MysqlConnector,只需通过 NuGet 在您的项目中安装它,或者如果您想自己构建它,请从 Git 下载它。

然后在您的 app.config 或 web.config 中添加新的 dataProvider,以便 .net 知道它。 例如,在 app.config/web.config 添加:

<configuration><system.data><DbProviderFactories>
<remove invariant="MySqlConnector"/>
      <add name="MySqlConnector" invariant="MySqlConnector" description="Async MySQL ADO.NET Connector" type="MySqlConnector.MySqlConnectorFactory, MySqlConnector, Culture=neutral" />
</DbProviderFactories>

然后在你的 connectionStrings 中使用它确保你使用 dataProvider="MysqlConnector"

特别感谢 Ville & Miguel McFly!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM