Ali*_*hor 5 c# sql postgresql dialect dapper
我目前正在学习 Dapper。我在这里和其他地方(包括这个)搜索了很多,但找不到我的疑问的具体答案:
¿ 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; }
}
Run Code Online (Sandbox Code Playgroud)
...以下行对我不起作用:
_connection.Execute(@"INSERT cardtypes (type, description) VALUES (@Type, @Description)", cardType);
Run Code Online (Sandbox Code Playgroud)
首先,这一行引发了 ODBC 异常,因为在指定表之前需要“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);
Run Code Online (Sandbox Code Playgroud)
这些以前的案例运作良好。但是我对理解 SQL 查询是通用 SQL 方言还是特定的数据库引擎方言感到困惑。
我也尝试过 Dapper.Contrib 并且使用 INSERT 语句也失败了,例如:
_db.Insert(new CardType() {
Type = "Administrator",
Description = "The Boss"
});
Run Code Online (Sandbox Code Playgroud)
它也失败了……一个奇怪的“[”字符异常。
我做错了什么?
致以我的问候!
Dapper 不会尝试解析您的查询或提供自定义 DSL。相反:它将您的查询直接传递给您选择的 ADO.NET 提供程序。在某些情况下,它确实做了一些调整,但在一般意义上:它没有受到影响。
在 postgresql 的情况下,IIRC 参数是冒号前缀,而不是前缀。尝试使用:foo代替@foo.
| 归档时间: |
|
| 查看次数: |
3774 次 |
| 最近记录: |