В настоящее время я изучаю 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 не пытается проанализировать ваш запрос или предложить собственный DSL. Скорее: он передает ваш запрос прямо на ваш выбранный поставщик ADO.NET. В некоторых случаях он делает несколько попыток, но в общем смысле: он не тронут.
В случае postgresql параметры IIRC имеют префикс двоеточия, а не префикс. Попробуйте использовать :foo
вместо @foo
.