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

nukf8bse  于 4个月前  发布在  Mysql
关注(0)|答案(6)|浏览(90)

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

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正在工作,用户的pemissions被授予,端口是正确的。请有什么想法?
整个程序:

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();
        }
    }
}

chhkpiq4

chhkpiq41#

同样的事情也发生在我身上,把MySql.Data.MySqlClient改成MySqlConnector,问题就解决了
我使用的数据库已经在生产环境中,因此更改连接器比降级数据库更容易
我简单介绍一下我做的事情:

  • 我的项目是在Visual Studio 2017上使用.NET Core 2.1。我必须更新到Visual Studio 2022并将.NET Core更改为3.1版本
  • 在NuGet包管理器中卸载MySql.Data并安装MySqlConnector 2.2.2版
  • 遵循official page MySqlConnector的建议
hvvq6cgz

hvvq6cgz2#

这是由于MariaDB 10.10.1在Information_Schema.Collations中使ID字段可为空,并添加了一堆ID为空的Collations。
https://jira.mariadb.org/browse/MDEV-27009
一个可能的解决方法是使用MariaDB 10.9或更早版本。

xiozqbni

xiozqbni3#

我尝试了最新的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!

ubbxdtey

ubbxdtey4#

下面是MySql.Data如何加载排序规则:

此方法假设“id”列的值不为null。不幸的是,从版本10.10开始,MariaDB将“Id”列切换为“允许排序”,并且排序规则中有很多行的ID为NULL。这导致“Object cannot be cast from DBDB to other types”异常。
如果您希望使用MySql.Data包并等待MySql.Data中的修复,那么现在看来10.9是唯一的选择。

vwkv1x7d

vwkv1x7d5#

同样的问题和Oracle没有合并相关的PR,我做了一个fork和一个nuget包来处理它。迁移到MysqlConnector并不总是可能的。
叉式 Package :https://www.nuget.org/packages/MediReport.MySql.Data/8.1.0
原始PR:https://github.com/mysql/mysql-connector-net/pull/51/commits/7a7aeec16807a17e07d55de1ae83b37aa9a960a7

q43xntqr

q43xntqr6#

如果你不能迁移到MySqlConnector,试试这个,让我知道它是否有帮助。刚刚发布了一个pre-pre-alpha版本的软件包,试图解决这个问题。
NuGet:https://www.nuget.org/packages/Jf.MySql.Data.Collations/
来源:https://github.com/jeffraska/Jf.MySql.Data.Collations/
软件包处于“works on my computer”状态。这意味着.NET framework 4.5,非常旧的MySql.Data 6.9.7库和Debian仓库中当前可用的最新MariaDB 10.11.4。所以不要期待奇迹。
它使用MySql.Data库(https://dev.mysql.com/doc/connector-net/en/connector-net-interceptors.html)的标准命令拦截器功能来更改所有SHOW COLLATION查询并将其替换为SHOW COLLATION WHERE id IS NOT NULL
此外,该包还具有更改MySql.Data的内部字符集Map的功能,以允许阅读8.0.28之前版本的MySql.Data中的utf 8 mb 3字段。

相关问题