![](/img/trans.png)
[英]System.InvalidCastException: Object cannot be cast from DBNull to other types
[英]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 或更早版本。
我也尝试了最新的 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.