Можно ли использовать оператор присваивания MySql (: =) в MySqlCommand? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть запрос, который отлично работает в MySql Workbench, но выдает синтаксическую ошибку "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':= 0+1 AS Rank, z.* 
FROM(SELECT MemberId, Valu' at line 2" при запуске через MySqlCommand.ExecuteReader. Синтаксис, о котором идет речь, - это присвоение переменной внутри выбора (т. Е. SELECT @r := @r + 1). Я использую .net разъем v.6.9.9 на случай, если это уместно. Также вот моя строка подключения: "server=mymysqlserveraddress;port=3306;database=dbName;user id=username;password=********;Convert Zero Datetime=True;Allow User Variables=true"

Я попытался установить Allow User Variables = true в строке подключения, как показано здесь: Можно ли использовать определяемую пользователем переменную MySql в .NET MySqlCommand?

Я искал другие вопросы, которые соответствовали этому, но в конечном итоге нашел только тот, который является той же проблемой, но для спящего режима в java: Как я могу использовать оператор присваивания MySQL (: =) в собственном запросе спящего режима?

Вот необработанный SQL-запрос, который работает в MySql Workbench:

SELECT Rank, Value 
FROM (SELECT @r := @r+1 AS Rank, z.* 
      FROM(SELECT MemberId, Value 
           FROM (SELECT Id, MemberId, Value, CreatedDate, EventId 
                 FROM Scores
                 WHERE (LoadTime IS NULL AND EventId = 408)
                 ORDER BY Value DESC
                ) AS sub 
     )z, 
     (SELECT @r:=0)y
)x 
WHERE x.Value<=228000;

408 и 228000 являются просто примерами - мой код C # создает строку и затем отправляет ее на сервер через:

StringBuilder statisticQueryString = new StringBuilder("");
// construct statisticQueryString
using (MySqlCommand cmd = new MySqlCommand(statisticQueryString.ToString(), conn))
{
    cmd.Parameters.AddWithValue("r", 0);

    using (MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
    {
        // Iterate through the collection of RankResult items...
    }
}

Пример сконструированного запроса (я печатаю последний запрос в журнал перед отправкой), который завершается ошибкой с синтаксической ошибкой, приведенной выше:

SELECT Rank, Value 
FROM (SELECT @r := @r+1 AS Rank, z.* 
      FROM(SELECT MemberId, Value 
           FROM (SELECT Id, MemberId, Value, CreatedDate, EventId 
                 FROM Scores
                 WHERE (LoadTime IS NULL AND EventId = 408)
                 ORDER BY Value DESC
                ) AS sub 
     )z, 
     (SELECT @r:=0)y
)x 
WHERE x.Value<=228000;

Как видите, составленный запрос идентичен тому, который я могу выполнить без ошибок в MySql workbench.

1 Ответ

0 голосов
/ 21 мая 2019

Комментарий @Uueerdo побудил меня попробовать удалить строку cmd.Parameters.AddWithValue("r", 0); из кода C #.Это исправило ошибку и дало ожидаемые результаты.

...