J'ai une console c # simple qui utilise le Dapper ORM pour appeler une base de données MySql locale afin d'exécuter une procédure stockée appelée users.UserCreate
.
Cependant, lors de l'exécution de la requête, une exception s'affiche.
La procédure ou la fonction 'UserCreate' est introuvable dans la base de données 'utilisateurs'
Mais les users
ne sont pas la base de données local_db
.
Voici un exemple d'utilisation:
public virtual Task CreateAsync(User user)
{
using (var con = new MySqlConnection(_dbConn))
return con.ExecuteAsync("users.UserCreate", user, commandType: CommandType.StoredProcedure);
}
_dbConn contient la chaîne de connexion, indiquant également le nom de la base de données en tant que local_db
.
Voici à quoi ressemble la procédure stockée:
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 ;
Le problème est-il lié à MySql ou Dapper? J'utilise une convention de dénomination similaire pour les procédures stockées dans SQL Server, également à l'aide de Dapper, et je n'ai jamais rencontré ce problème auparavant.
J'ai essayé:
Des idées?
Eh bien, il s'avère que la conversion de SQL à MySQL a été pleine de courbes d’apprentissage en termes de (in) capacités de MySQL. Pour contourner les conventions de nommage du schéma en utilisant full-stops / period ("."), Je viens de le remplacer par un trait de soulignement.
Pour ceux qui font face au même dilemme, utilisez des traits de soulignement, vous vous épargnerez des heures de maux de tête à long terme!