Query работает нормально через GUI, но возвращает общую ошибку при попытке запустить через Dapper - PullRequest
1 голос
/ 12 марта 2019

У меня есть запрос, который прекрасно работает на сервере MariaDB через GUI, однако, как только я попытаюсь выполнить через Dapper C #, я получу ошибку:

MySql.Data.MySqlClient.MySqlException: «У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом с 'DELIMITER $ BEGIN NOT ATOMIC

IF (@EndDate

Я использую Regulard IDbConnection, т. е.

using (IDbConnection con = new MySqlConnection(SQLConfig.UI))

и для вызова запроса:

return con.Query<MembershipDynamic.MembershipStatus>(sqlQuery, new{ @MembershipId = membershipId}).Single();

Тот же запрос отлично работает стот же идентификатор членства.

Я понятия не имею, почему точно такой же запрос не будет выполняться через Dapper.

Моя строка подключения является обычной с одним дополнительным параметром

AllowUserVariables=True

Поскольку запрос не является проблемой, так как он проходит через все остальное, я предполагаю, что в строке подключения что-то отсутствует ???

Я также пытался установить

 public MembershipsRepo()
    {
        DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.MySqlDialect();
    }

Вотзапрос.Я пытался без DELIMITER на прямую реализацию MySqlConnection, но он будет возвращать результат только для первого выбора (???), игнорируя остальные ... SQL является модифицированной процедурой MS SQL.

SET @TypeId = NULL;
SET @StartDate = NULL;
SET @EndDate = NULL;
SET @GroupId = NULL;
SET @Status = NULL;

SELECT @TypeId := TypeId, @StartDate := StartDate, @EndDate := EndDate
FROM Membership_Memberships
WHERE MembershipId = @MembershipId;

DELIMITER $
BEGIN NOT ATOMIC

IF (@EndDate < NOW()) THEN
SET @GroupId = 3;
SET @STATUS = 'Expired';
END IF;

IF (SELECT COUNT(Id) FROM Membership_Trials WHERE MembershipId = 
@MembershipId AND Active = 1 ) > 0  THEN
SET @GroupId = 4;
SET @Status = 'Trial';

ELSE
SELECT @GroupId := T.GroupType, @Status := T.Name FROM Membership_Types T 
WHERE T.Id = @TypeId;
-- RETURN  Select @GroupId, @Status;
END IF;

END $
DELIMITER ;

SELECT @GroupId, @Status;

Dapper /ADO.NET отлично работает с простыми запросами, но не работает с более сложными запросами: /

***** РЕДАКТИРОВАТЬ

После некоторого исследования похоже, что MySQL ограничен 1 запросом назапрос, так что почти невозможно написать даже более сложный запрос: / (с переменными, которые задаются Select).

Единственный способ - создать прокы, которые я не буду, или вернутьсяв Microsoft SQL или в другой SQL ...

Это был бы огромный успех, поскольку я почти 6 месяцев инвестировал в переход от SQL к MySQL: / (архитектура, репликация и т. д.)

: ((((((((((((

1 Ответ

0 голосов
/ 12 марта 2019

Хорошо, похоже, мы потеряли несколько месяцев работы.

MySQL - это не то, что может заменить Microsoft SQL.

В основном хранимые процедуры будут возвращать все выборы (и объединять / обрабатывать все дела и т. Д. ЭТО ДОЛЖНО делать много операций выбора / соединения / если).

К сожалению, это нарушает условия сделки, так как это приведет к возврату сотен МБ ненужных данных и разрушит всю платформу. (в настоящее время работает на Microsoft SQL)

...