Непараметрические переменные SQL с MySql Connector / Net и Dapper? - PullRequest
7 голосов
/ 08 февраля 2012

Приведенный ниже код генерирует следующую ошибку:

Необходимо определить параметр '@ID'.

Я что-то не так делаю или невозможно использоватьпеременные в запросе SQL с MySQL, которые не являются параметрами 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();
}

Ответы [ 3 ]

19 голосов
/ 08 февраля 2012

Оказывается, "MySql Connector / Net" генерирует ошибку.

Чтобы использовать непараметрические переменные SQL с MySql Connector / Net, необходимо добавить следующую опцию в строку подключения:

  • «Разрешить переменные пользователя = True»

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

2 голосов
/ 08 февраля 2012

Я не думаю, что это более серьезная проблема;dapper просто берет предложенный вами SQL и добавляет любые члены из объекта «args», которые он очевидно видит в SQL.

Чтобы исследовать это, попробуйте запустить то же самое сDbCommand напрямую - я предполагаю, что он не будет идентичен.Будет несколько SQL-трюков, чтобы заставить его работать, но это между вами и MySQL.Все, что делает dapper:

  • создает команду с вашим sql
  • , определяя параметр с именем "Slug" и устанавливая значение
  • , вызывая sql и анализируярезультаты

это не касание «ID», и это правильно, что это не так.

0 голосов
/ 08 февраля 2012

Вам необходимо объявить переменную ID в вашем коде sql:

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