2012-02-08 13 views
7

El código siguiente genera el error siguiente:Variables SQL sin parámetro con MySql Connector/Net y Dapper?

Parameter '@ID' must be defined.

¿Estoy haciendo algo mal o no es posible utilizar 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

18

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

Para utilizar variables de SQL no de parámetros con MySQL Connector/Net, hay que añadir la siguiente opción de la 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

+0

Gracias, acabo de recibir el mismo error horas antes. –

+0

Guau, eso realmente me ayudó. ¡Muchas gracias! – harriyott

+0

Muchas gracias, blog muy útil !!! – Rida

0

tiene que declarar la variable de identificación en el código SQL:

var sql = @"DECLARE @ID Int; 
      SELECT @ID := id, slug, Title, Text FROM posts WHERE slug = @Slug; 
      SELECT * FROM comments where postid = @ID;"; 
+1

En realidad estoy usando MySQL, que creo que define automáticamente su tipo cuando se le asigna un valor por primera vez. Si corté para pegar la consulta SQL de arriba en MySQL Workbench y la ejecuté, funciona perfectamente. Por lo tanto, no creo que haya venido el error. –

2

no creo que este es un tema pulcro; dapper simplemente toma el SQL que usted ofrece, y agrega cualquier miembro del objeto "args" que obviamente ve en el SQL.

La manera de investigar esto es intentar ejecutar lo mismo con DbCommand directamente, supongo que fallará idéntico. Habrá algún truco de SQL para hacerlo funcionar, pero eso es entre usted y MySQL. Todo pulcro está haciendo es:

  • la creación de un comando con su SQL
  • definir un parámetro llamado "Slug" y estableciendo el valor
  • invocando el SQL y analizar los resultados

doesn 't toque "ID", y es correcto que no lo haga.

+1

Tiene razón, lo probé usando DbCommand y obtuve el mismo error. –