Le code ci-dessous génère l'erreur suivante:
paramètre '@ID' doit être défini. P> blockQuote>
Est-ce que je fais quelque chose de mal ou n'est-il pas possible d'utiliser des variables dans la requête SQL avec MySQL qui ne sont pas des paramètres dappistes? P>
Dans cet exemple, @slug est un paramètre DAPPER, mais @ID n'est pas. J'utilise mysql donc je n'ai pas besoin de définir @ID - il est défini dans la première utilisation. P>
var sql = @"SELECT @ID := id, slug, Title, Text FROM posts WHERE slug = @Slug; SELECT * FROM comments where postid = @ID;"; using (var connection = GetOpenConnection()) { var posts = connection.QueryMultiple(sql, new { Slug = slug }) .Map<Post, Comment, int> ( Post => Post.ID, Comment => Comment.ID, (post, comments) => { post.Comments = comments; } ); return posts.FirstOrDefault(); }
3 Réponses :
Vous devez déclarer la variable d'identification dans votre code SQL:
var sql = @"DECLARE @ID Int; SELECT @ID := id, slug, Title, Text FROM posts WHERE slug = @Slug; SELECT * FROM comments where postid = @ID;";
J'utilise réellement MySQL qui, selon lequel je crois, définit automatiquement son type lorsqu'il est d'abord attribué une valeur. Si je coupe à coller la requête SQL ci-dessus dans MySQL Workbench et exécutez-la, il fonctionne très bien. Donc, je ne pense pas que ce soit l'erreur provient.
Je ne pense pas que ce soit une question de DAPPER; Dapper prend juste le SQL que vous proposez et ajoute des membres de l'objet "args" que celui-ci évidemment em> voir dans le SQL. P>
Le moyen d'enquêter sur ceci est d'essayer de fonctionner directement avec DBCommand directement - je suppose que cela échouera identique. Il y aura du truc de SQL pour le faire fonctionner, mais c'est entre vous et MySQL. Tout Dapper fait est: P>
Ce n'est pas touche em> "id", et il est correct qu'il ne le fait pas. P>
Vous êtes correct - je l'ai testé à l'aide de DBCommand et obtenu la même erreur.
Il s'avère "MySQL Connector / Net" génère l'erreur. P>
Pour utiliser des variables SQL non paramètres avec MySQL Connector / Net, vous devez ajouter l'option suivante à votre chaîne de connexion: p>