使用MySql Connector / Net和Dapper的非參數SQL變量?

dapper parameters sql

下面的代碼生成以下錯誤:

必須定義參數'@ID'。

我做錯了什麼或者不可能在MySQL的SQL查詢中使用不是Dapper參數的變量?

在此示例中,@ Slug是Dapper參數,但@ID不是。我正在使用MySQL,所以我不需要DEFINE @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”會生成錯誤。

要將非參數SQL變量與MySql Connector / Net一起使用,必須在連接字符串中添加以下選項:

  • “允許用戶變量=真”

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


專家解答

我不認為這是一個短小精悍的問題; dapper只接受你提供的SQL,並添加它顯然在SQL中看到的“args”對像中的任何成員。

調查這個的方法是嘗試直接使用DbCommand運行相同的 - 我的猜測是它將失敗相同。有一些SQL技巧可以使它工作,但這是你和MySQL之間的。所有精巧的人都在做:

  • 用你的sql創建一個命令
  • 定義一個名為“Slug”的參數並設置該值
  • 調用sql並解析結果

它不會觸及 “ID”,並且它沒有這樣做是正確的。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因