Вопросы о Dapper SQL-запросах и параметрах с PostgreSQL

2

В настоящее время я изучаю Dapper. Я много искал здесь и в других местах (в том числе this), и я не смог найти конкретные ответы на мои сомнения:

¿Использует ли Dapper общий диалект SQL или он специфичен для механизма БД? Я имею в виду, что он использует синтаксис SQL, ожидаемый в подсистеме базы данных подкласса? Вначале и после прочтения более десятка примеров я подумал, что SQL-запросы, где родовые, но теперь пытаются использовать PostgresSQL ODBC, я столкнулся с проблемами с синтаксисом и параметрами.

Используя этот пример класс POCO...

public class CardType {

    //Autoincremented Key
    public int Id { get; set; }

    public string Type { get; set; }

    public string Description { get; set; }
}

... для меня не работает следующая строка:

_connection.Execute(@"INSERT cardtypes (type, description) VALUES (@Type,  @Description)", cardType);

Во-первых, эта строка запускает исключение ODBC. beacuse ожидает предложение "INTO" перед указанием таблицы. Также параметры не работают, потому что, если я не ошибаюсь, параметры PostgresSQL устанавливаются с помощью параметра "?" символ, а не с "@keyword". На странице GitHub мы можем найти это:

Dapper не имеет конкретных деталей реализации конкретной БД, он работает во всех Поставщики .NET ADO, включая SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL и SQL Server.

Итак, я потерял это.:) После много экспериментов я обнаружил, что все работы PostgresSQL работают так, как ожидалось. Например, все следующие случаи работали:

//Manually parameters

var query = @"INSERT INTO cardtypes (type, description) values ('Administrator', 'The Boss')";
_db.Execute(query);


//Dynamic parameters

var dynamicParameters = new DynamicParameters();
dynamicParameters.AddDynamicParams(new {
    cardType.Type,
    cardType.Description
});

var query = @"INSERT INTO cardtypes (type, description) values (?, ?)";    //Note the '?' symbol
_db.Execute(query, dynamicParameters);


//Interpolating values
var query = $@"INSERT INTO cardtypes (type, description) values ('{cardType.Type}', '{cardType.Description}')";
_db.Execute(query);

Эти случаи превзоялись нормально. Но я смущен пониманием того, являются ли SQL-запросы типичным диалектом SQL или конкретным диалектом ядра базы данных.

Также я опробовал Dapper.Contrib и не смог выполнить с инструкцией INSERT, например:

_db.Insert(new CardType() {
    Type = "Administrator",
    Description = "The Boss"
});

Сбой тоже слишком... странное исключение "[".

Что я делаю неправильно?

С уважением!

Теги:
dapper
dialect

1 ответ

1
Лучший ответ

Dapper не пытается проанализировать ваш запрос или предложить собственный DSL. Скорее: он передает ваш запрос прямо на ваш выбранный поставщик ADO.NET. В некоторых случаях он делает несколько попыток, но в общем смысле: он не тронут.

В случае postgresql параметры IIRC имеют префикс двоеточия, а не префикс. Попробуйте использовать :foo вместо @foo.

  • 0
    Я попробую это в ближайшее время. Я дам тебе знать ... спасибо.
  • 0
    Параметры IIRC с префиксом двоеточия не сработали. Попробуем это ... var query = @ "INSERT INTO cardtypes (type, description) values (: Type,: Description)"; _db.Execute (query, cardType); ... Я получил исключение: "ОШИБКА [42601] ОШИБКА: ошибка синтаксиса en o cerca de«: »;". Так?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню