2012-02-08 26 views
7

以下のコードは、次のエラーを生成します。MySql Connector/NetおよびDapperを使用したパラメータ以外のSQL変数?

Parameter '@ID' must be defined.

私が何か間違ったことをやっているか、それがDapperのパラメータではありませんMySQLでSQLクエリ内の変数を使用することはできませんか?

この例では、@SlugはDapperパラメータですが、@ IDはDapperパラメータではありません。私はMySQLを使用しているので、@ IDを定義する必要はありません。最初の使用で定義されます。あなたのSQLコードにID変数を宣言する必要が

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

答えて

18

「MySql Connector/Net」がエラーを生成することが判明しました。 MySQLのConnector/NETの持つ非パラメータのSQL変数を使用するためには、あなたの接続文字列に次のオプションを追加する必要が

  • "許可ユーザー変数= True" を

参照してください:http://blog.tjitjing.com/index.php/2009/05/mysqldatamysqlclientmysqlexception-parameter-id-must-be-defined.html

+0

ありがとう、私はちょうど前に同じエラー時間を持っています。 –

+0

うわー、それは本当に私を助けました。どうもありがとう! – harriyott

+0

ありがとう、非常に役立つブログ!!! – Rida

0

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

私は実際にMySQLを使用していますが、私はそれが最初に値を割り当てられたときにその型を自動的に定義すると信じています。上記のSQLクエリをMySQL Workbenchに貼り付けて実行すると、正常に動作します。だから、私はそれがエラーが来ているとは思わない。 –

2

私はこれがDapperの問題だとは思いません。 dapperはあなたが提供しているSQLを取り出し、 "args"オブジェクトから任意のメンバーを追加します。明らかに、はSQLを参照してください。

これを調べる方法は、DbCommandで直接同じものを実行してみることです - 私の推測では、それは全く同じではないということです。それを動作させるためのいくつかのSQLのトリックがあるでしょうが、それはあなたとMySQLの間です。 Dapperのをやっているすべては、次のとおりです。あなたのSQL

  • は「メタルスラッグ」と呼ばれるパラメータを定義し、
  • はSQLを呼び出し、それはdoesnの結果
  • を解析する値を設定してコマンドを作成

    • 't touch「ID」、そうでないことは間違いありません。

    +1

    あなたは正しいですか?私はDbCommandを使ってそれをテストし、同じエラーが発生しました。 –

    関連する問題