7
votes

Variables SQL non paramètres avec connecteur MySQL / Net et Dapper?

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();
}


0 commentaires

3 Réponses :


0
votes

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;";


1 commentaires

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.



2
votes

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 voir dans le SQL.

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:

  • Création d'une commande avec votre SQL
  • Définition d'un paramètre appelé "Slug" et réglage de la valeur
  • invoquer le SQL et analysant les résultats

    Ce n'est pas touche "id", et il est correct qu'il ne le fait pas.


1 commentaires

Vous êtes correct - je l'ai testé à l'aide de DBCommand et obtenu la même erreur.



23
votes

Il s'avère "MySQL Connector / Net" génère l'erreur.

Pour utiliser des variables SQL non paramètres avec MySQL Connector / Net, vous devez ajouter l'option suivante à votre chaîne de connexion:


0 commentaires