MySql Connector / NetおよびDapperを使用した非パラメータSQL変数

dapper parameters sql

質問

次のコードは、次のエラーを生成します。

パラメータ '@ID'を定義する必要があります。

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

この例では@SlugはDapperパラメータですが、@ IDはDapperパラメータではありません。私はMySQLを使用しているので、@ 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();
}

受け入れられた回答

「MySql Connector / Net」がエラーを生成することが判明しました。

MySql Connector / Netで非パラメータSQL変数を使用するには、接続文字列に次のオプションを追加する必要があります。

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

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


エキスパート回答

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

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

  • あなたのSQLでコマンドを作成する
  • 「スラグ」と呼ばれるパラメータを定義し、値を設定する
  • sqlを呼び出して結果を解析する

それは "ID"に触れておらず、そうしていないのは正しいです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ