Объявите переменную в синтаксисе mysql и сделайте запрос с помощью dapper, получите исключение - PullRequest
0 голосов
/ 04 марта 2020

У меня есть sql sytanx, например:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
            set @i = 0;
            select @i := @i+1 as Row,Target,StartDate,EndDate
            from (
                     select target,
                            StartDate,
                            EndDate
                     from t_xxx_table
                     where 1 = 1
                       and target= @TargetSn
                     order by StartDate desc
                 )
            COMMIT;

и C# код:

using (var connection = new MySqlConnection(ConnectionString))
        {
            try
            {
                var result = connection.Query<XXXClass>(sqlString, new
                {
                    TargetSn
                });
                return result;
            }
            catch (Exception e)
            {
                throw new Exception(e.ToString());
            }
        }

Получить исключение 'Ссылка на объект не установлена ​​для экземпляра объекта .» Я пытаюсь добавить «Разрешить переменные пользователя = True» в строке подключения, но не работает. Когда я удаляю '@ i', это может сработать.

Проблема в том, что генерация dapper не может обрабатывать '@i' и '@TargetSn', я думаю ..

Есть ли любое решение для решения проблемы?

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Попробуйте

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT (@i := @i+1) as `Row`,
       Target,
       StartDate,
       EndDate
FROM t_learning_note, 
     (SELECT @i:=0) init_variable
WHERE 1 = 1
  AND target= @TargetSn
ORDER BY StartDate DESC

COMMIT;

Возможно, проблема не будет устранена, но этот код ГАРАНТИРУЕТ, что вычисленное перечисление будет правильным после успешного выполнения (тогда как исходный запрос не может).

0 голосов
/ 04 марта 2020

Строка - это зарезервированное слово в mysql

используйте тики для текста

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
set @i = 0;
select @i := @i+1 as 'Row',Target,StartDate,EndDate
from (
         select target,
                StartDate,
                EndDate
         from t_learning_note
         where 1 = 1
           and target= @TargetSn
         order by StartDate desc
     )
COMMIT;

Как указала Акина, это работает в mysql, но может вызвать проблемы.

так что вы можете использовать также обратные тики, как

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
set @i = 0;
select @i := @i+1 as `Row`,Target,StartDate,EndDate
from (
         select target,
                StartDate,
                EndDate
         from t_learning_note
         where 1 = 1
           and target= @TargetSn
         order by StartDate desc
     )
COMMIT;
...