【发布时间】: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能够工作。
标签: c# mysql stored-procedures dapper