"MySqlException: Table 'mysql.proc' doesn't exist" 在 .NET Core 中执行 MySQL 存储过程时

"MySqlException: Table 'mysql.proc' doesn't exist" when executing MySQL stored procedures in .NET Core

我正在使用 ADO.NET 数据提供程序 MySql.Data.MySqlClient 从 .NET Core 访问 MySQL 数据库并且大部分工作正常,但每当我尝试访问存储过程时我看到以下异常消息:

MySql.Data.MySqlClient.MySqlException : Table 'mysql.proc' doesn't exist

我能找到的所有文章都推荐 运行 mysql_upgrade 来修复系统 tables,但这没有发现任何问题。

实际上数据库不包含 mysql.proc table - 但 it is not supposed to since it is MySQL 8.0!

我已经使用 MySQL 安装程序安装了最新版本的 Connector/NET (8.0.15)。

我做错了什么?

安装的 Connector/NET 版本是...无关紧要!

这是 .NET Core,ADO.NET .NET Core 的数据提供程序是通过 NuGet 获取的 - 因此请确保您的 .NET Core 项目正在加载最新版本的 MySql.Data NuGet包。

旧版本的 MySql.Data NuGet 包(v.8 之前)在尝试访问版本 8+ MySQL 数据库上的存储过程时确实会出现上述错误。

如果在获取最新版本的 MySql.Data 软件包后仍然遇到问题,请确保添加 CheckParameters=false

查看 ADO.Net 中的 GetSchema 函数,尤其是 "Procedures" 和 "Procedure Parameters" 集合。

我知道这个 post 是旧的,但万一这个问题仍然相关... 我能够通过将命令类型更改为文本而不是存储过程来解决这个问题,并且在命令文本上我使用了调用命令:

sql = "call yourstoreproc()";
cmd = new Mysql.Data.MySqlClient.MySqlCommand(sql, connection);
cmd.CommandType = System.Data.CommandType.Text;

cmd.ExecuteNonQuery();

正如@MikeBeaton 所解释的,这是不相关的版本问题。 我在部署使用 mySql.data 和 mySql.web 依赖项作为 6.0.. 版本参考的应用程序时遇到了同样的问题,然后在部署具有 8.0 版连接器的机器时导致了此错误

主机上的连接器版本

BIN 文件夹组件版本

解决方案

将 web.config 和 packages.config 文件的版本从旧版本更新为新版本

例子

这里的旧版本是 6.9.0 所以我全部更新为 8.0.21.0

  <dependentAssembly>
    <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-8.0.21.0" newVersion="8.0.21.0" />
  </dependentAssembly>

同样在这个包文件中找到这些所有依赖项并全部替换将解决你的问题。

我偶然发现了这个 post 试图用我的 Azure 托管的 MySQL 数据库找到解决这个问题的方法,但是 none 的解决方案是适用的。我想分享对我有用的东西(来自 rfontona's response here):

Azure Database for MySQL – Single Server service, we have a gateway which runs v5.6 which may be cause this error. You can change the port in the connection string to 3309 (default would be 3306), which will connect you to v8.0 client in the gateway. More details here - Supported versions - Azure Database for MySQL | Microsoft Docs

设置 MySqlConnectionStringBuilder 时,我使用了以下内容:

new MySqlConnectionStringBuilder {
   ...
   Port = 3309
}

我假设类似的方法也适用于连接字符串。