在.NET Core中执行MySQL存储过程时出现“ MySqlException:表'mysql.proc'不存在”

时间:2019-03-21 22:16:45

标签: mysql asp.net-core ado.net

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

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

我能找到的所有文章都建议运行mysql_upgrade来修复系统表,但这没有发现问题。

实际上,数据库不包含mysql.proc表-而是it is not supposed to since it is MySQL 8.0

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

我在做什么错了?

6 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

签出ADO.Net中的GetSchema函数,尤其是“过程”和“过程参数”集合。

答案 3 :(得分:0)

我知道这则帖子已经过时了,但是如果这个问题仍然有意义... 通过将命令类型更改为文本而不是存储过程,可以解决此问题,并且在命令文本上使用了call命令:

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

cmd.ExecuteNonQuery();

答案 4 :(得分:0)

@MikeBeaton解释说,这是无关的版本问题。 部署使用mySql.data和mySql.web依赖项作为版本6.0 ..的应用程序时,然后部署具有连接器版本8.0的计算机时,我遇到了相同的问题

主机上的连接器版本

enter image description here

BIN文件夹组装版本

enter image description here

解决方案

使用旧版本到新版本更新您的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>

同样可以在此包文件中找到所有这些依赖项,然后全部替换即可解决您的问题。

答案 5 :(得分:0)

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

<块引用>

Azure Database for MySQL – Single Server 服务,我们有一个运行 v5.6 的网关,这可能会导致此错误。您可以将连接字符串中的端口更改为 3309(默认为 3306),这会将您连接到网关中的 v8.0 客户端。此处有更多详细信息 - Supported versions - Azure Database for MySQL | Microsoft Docs

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

new MySqlConnectionStringBuilder {
   ...
   Port = 3309
}

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