Variables SQL sin parámetro con MySql Connector / Net y Dapper?

dapper parameters sql

Pregunta

El siguiente código genera el siguiente error:

El parámetro '@ID' debe estar definido.

¿Estoy haciendo algo mal o no es posible usar variables en la consulta SQL con MySQL que no son parámetros Dapper?

En este ejemplo, @Slug es un parámetro Dapper, pero @ID no lo es. Estoy usando MySQL, así que no necesito DEFINIR @ID, ya está definido en el primer uso.

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

Respuesta aceptada

Resulta que "MySql Connector / Net" genera el error.

Para usar variables SQL que no sean parámetros con MySql Connector / Net, debe agregar la siguiente opción a su cadena de conexión:

  • "Permitir variables de usuario = True"

Ver: http://blog.tjitjing.com/index.php/2009/05/mysqldatamysqlclientmysqlexception-parameter-id-must-be-defined.html


Respuesta experta

No creo que este sea un tema inteligente; dapper simplemente toma el SQL que ofrece y agrega cualquier miembro del objeto "args" que obviamente ve en el SQL.

La forma de investigar esto es intentar ejecutar lo mismo con DbCommand directamente; mi suposición es que fallará de manera idéntica. Habrá algún truco de SQL para hacerlo funcionar, pero eso es entre usted y MySQL. Todo lo que Dapper está haciendo es:

  • creando un comando con su sql
  • definir un parámetro llamado "Slug" y establecer el valor
  • invocando el sql y analizando los resultados

no toca "ID", y es correcto que no lo haga.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow