【问题标题】:Cannot run any stored procedure creation script using EF Core or LinqToDb EF Core Tools or ADO.NET无法使用 EF Core 或 LinqToDb EF Core Tools 或 ADO.NET 运行任何存储过程创建脚本
【发布时间】:2021-10-07 12:55:02
【问题描述】:

重现步骤:

var s = @"USE `my_schema`;
DROP procedure IF EXISTS `new_procedure`;

DELIMITER $$
USE `my_schema`$$
CREATE PROCEDURE `new_procedure` ()
BEGIN
select 1;
END$$

DELIMITER ;
";

await dbContext.Database.ExecuteSqlRawAsync(s);

例外:

您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 'DELIMITER $$
附近使用的正确语法 CREATE DEFINER=root@% PROCEDURE new_procedure()

  • MySQL 版本:8.0.21
  • Microsoft.EntityFrameworkCore 版本:5.0.8
  • Pomelo.EntityFrameworkCore.MySql 版本:5.0.0
  • .NET 版本:5.0.302

【问题讨论】:

  • 如果您使用客户端工具直接在您的 mysql 数据库上运行该 sql 语句,它是否有效?
  • @rene 是的。 (通过 Workbench v8.0.25)

标签: c# mysql entity-framework-core


【解决方案1】:

你必须使用MySqlScript类,但Pomelo驱动使用MySqlConnector库,库中不包含实现tracking Issue

但您可以从 Oracle 的源代码中复制它的实现:

https://github.com/mysql/mysql-connector-net/blob/6.9/Source/MySql.Data/MySqlScript.cs

用法很简单:

using (var connection = new MySqlConnection(connectionString))
{
    var script = new MySqlScript(connection, scriptText);
    connection.Open();
    script.Execute();
}  

【讨论】:

    【解决方案2】:

    来自https://mysqlconnector.net/troubleshooting/delimiter/

    MySqlConnector 中不存在此限制,因此无需使用DELIMITER,必须将其移除(以避免向服务器发送无效的 SQL)。

    要解决此问题,请删除 DELIMITER 声明和分隔符的任何尾随实例:

    var s = @"USE `my_schema`;
    DROP procedure IF EXISTS `new_procedure`;
    CREATE PROCEDURE `new_procedure` ()
    BEGIN
    select 1;
    END;
    ";
    
    await dbContext.Database.ExecuteSqlRawAsync(s);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多