我目前正在学习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异常,因为在指定表之前,请求“INTO”子句。此外参数也不起作用,因为如果我没错,PostgresSQL参数设置为“?”符号而不是“@keyword”。在GitHub上page我们可以找到:
Dapper没有特定于DB的实现细节,它适用于所有 .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);
这些previuos案件运作良好。但是我很难理解SQL查询是一般的SQL方言还是特定的数据库引擎方言。
此外,我尝试过Dapper.Contrib并使用INSERT语句失败,例如:
_db.Insert(new CardType() {
Type = "Administrator",
Description = "The Boss"
});
它也失败了...一个奇怪的“[”字符例外。
我做错了什么?
我的问候!
答案 0 :(得分:2)
Dapper不会尝试解析您的查询或提供自定义DSL。相反:它将您的查询直接传递给您选择的ADO.NET提供程序。在某些情况下, 做了一些调整,但在一般意义上说:它没有受到影响。
对于postgresql,IIRC参数是以冒号为前缀的,而不是带前缀的。尝试使用:foo
代替@foo
。