Dapper 或 MySql 找不到包含句号“。”的存储过程。

Posted

技术标签:

【中文标题】Dapper 或 MySql 找不到包含句号“。”的存储过程。【英文标题】:Dapper or MySql not finding stored procedures that contain a full stop "." 【发布时间】:2017-06-19 20:37:47 【问题描述】:

我有一个简单的 c# 控制台,它使用 Dapper ORM 调用本地 mysql 数据库,以执行名为 users.UserCreate 的存储过程。

但是,当运行查询时,我得到一个异常提示

在数据库“用户”中找不到过程或函数“用户创建”

但是users 不是数据库local_db 是。

这里是一个使用示例:

public virtual Task CreateAsync(User user)

        using (var con = new MySqlConnection(_dbConn))
            return con.ExecuteAsync("users.UserCreate", user, commandType: CommandType.StoredProcedure);

_dbConn 包含连接字符串,同时将数据库名称声明为local_db

这是存储过程的样子:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `users.UserCreate`(IN `@UserId` VARCHAR(128), IN `@UserName` VARCHAR(255), IN `@PasswordHash` LONGTEXT, IN `@SecurityStamp` LONGTEXT)
    NO SQL
INSERT INTO Users
(Id, UserName, PasswordHash, SecurityStamp, EmailConfirmed, PhoneNumberConfirmed, TwoFactorEnabled, LockoutEnabled, DateCreated, DateUpdated, IsDeleted)
VALUES
(@UserId, @UserName, @PasswordHash, @SecurityStamp, 0, 0, 0, 0, CURRENT_DATE, CURRENT_DATE, 0)$$
DELIMITER ;

问题与 MySql 或 Dapper 有关吗?我对 SQL Server 中的存储过程使用类似的命名约定,也使用 Dapper,之前没有遇到过这个问题。

我试过了:

使用“local_db.users.UserCreate” 使用“local_db.UserCreate” 使用“用户创建”

有什么想法吗?

【问题讨论】:

con.ExecuteAsync(`users.UserCreate`… ? 我认为转义过程名称可以解决问题。尝试写users.UserCreate ``将表明该字符串是一个单数标识符。 如果我只是在 users.UserCreate 中使用 `` 标识符包装名称,我只会在 Visual Studio 中收到“意外字符”错误。还尝试了用引号括起来的“users.UserCreate”(摆脱了VS错误)以及@“users.UserCreate”和@“users.UserCreate”。仍然没有快乐 郑重声明:dapper 绝对不会尝试以任何方式解析此查询;如果您可以在 mysql 的特定模式中找到调用 sproc 的语法,那么:它应该只适用于 dapper。不过,我不能告诉你具体的语法是什么,因为我不使用 mysql;使用 sql-server,我希望 SprocName(连接的默认架构)、schema.SprocName[schema].SprocName 能够工作。 【参考方案1】:

嗯,从使用 SQL 到 MySQL 的转换,就 MySQL 的 (in) 能力而言,充满了学习曲线。为了绕过使用句号/句点(“.”)的架构命名约定,我只是将其替换为下划线。

对于面临同样困境的其他人,请使用下划线,从长远来看,您将为自己节省数小时的头痛!

【讨论】:

架构不是命名约定。架构不是存储过程名称的一部分,它是存储过程的位置,就像服务器和数据库名称一样

以上是关于Dapper 或 MySql 找不到包含句号“。”的存储过程。的主要内容,如果未能解决你的问题,请参考以下文章

Dapper SqlMapperExtensions / Dapper.Contrib?

为什么vaex会改变包含句号的列名?

MySql 在 Visual Studio 2012 中不起作用:找不到类型或命名空间名称“MySql”

如何使用 Dapper 实现工作单元模式?

在 Worklight 平台中找不到 com.mysql.jdbc.Driver 或项目错误

找不到包含 Startup 或 [AssemblyName].Startup 类的程序集