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?
MySql 在 Visual Studio 2012 中不起作用:找不到类型或命名空间名称“MySql”