2012-02-08 16 views
7

Il seguente codice genera il seguente errore:Variabili SQL non parametriche con connettore MySql/Net e Dapper?

Parameter '@ID' must be defined.

Sto facendo qualcosa di sbagliato o non è possibile utilizzare le variabili nella query SQL con MySQL, che non sono parametri Dapper?

In questo esempio, @Slug è un parametro Dapper, ma @ID no. Sto usando MySQL quindi non ho bisogno di DEFINE @ID - viene definito al primo utilizzo.

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

risposta

18

Si scopre che "MySql Connector/Net" genera l'errore.

Per poter utilizzare non-parametri variabili SQL con MySQL Connector/Net, è necessario aggiungere la seguente opzione per la stringa di connessione:

  • "Consenti Variabili utente = True"

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

+0

Grazie, ho appena ricevuto lo stesso errore ore prima. –

+0

Wow, mi ha davvero aiutato. Grazie molto! – harriyott

+0

Grazie mille, blog molto utile !!! – Rida

0

è necessario dichiarare la variabile ID nel codice SQL:

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

Attualmente sto usando MySQL che, credo, definisce automaticamente il suo tipo quando viene assegnato un valore per la prima volta. Se taglio a incollare la query SQL sopra in MySQL Workbench ed eseguirlo, funziona perfettamente. Quindi, non penso che sia stato causato l'errore. –

2

non credo che questo sia un problema azzimato; dapper prende solo l'SQL che offri e aggiunge tutti i membri dall'oggetto "args" che sia ovviamente vedi nell'SQL.

Il modo per indagare su questo è provare a eseguire lo stesso con DbCommand - suppongo che non funzionerà in modo identico. Ci sarà qualche trucco SQL per farlo funzionare, ma questo è tra te e MySQL. Tutto Dapper sta facendo è:

  • creazione di un comando con il vostro SQL
  • definizione di un parametro chiamato "Slug" e impostando il valore
  • invocando la sql e l'analisi dei risultati

doesn 't touch "ID", ed è corretto che non lo faccia.

+1

Sei corretto - l'ho provato usando DbCommand e ho ottenuto lo stesso errore. –