关于 PostgreSQL 的 Dapper SQL 查询和参数的问题
Questions about Dapper SQL queries and parameters with PostgreSQL
我目前正在学习 Dapper。我在这里和其他地方(包括this)搜索了很多,但我找不到具体的答案来解决我的疑惑:
¿ Dapper 使用通用 SQL 方言还是特定于数据库引擎?我的意思是,它使用底层数据库引擎中预期的 SQL 语法?起初和阅读了十几个示例后,我认为 SQL 查询是通用的,但现在尝试使用 PostgresSQL ODBC 我遇到了语法和参数问题。
使用这个例子 POCO class ...
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 异常,因为在指定 table 之前需要子句 "INTO"。参数也不起作用,因为如果我没记错的话,PostgresSQL 参数设置为“?”符号而不是“@keyword”。在 GitHub page 我们可以找到这个:
Dapper has no DB specific implementation details, it works across all
.NET ADO providers including SQLite, SQL CE, Firebird, Oracle, MySQL,
PostgreSQL and 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 参数以冒号为前缀,而不是以 at 为前缀。尝试使用 :foo
而不是 @foo
.
我目前正在学习 Dapper。我在这里和其他地方(包括this)搜索了很多,但我找不到具体的答案来解决我的疑惑:
¿ Dapper 使用通用 SQL 方言还是特定于数据库引擎?我的意思是,它使用底层数据库引擎中预期的 SQL 语法?起初和阅读了十几个示例后,我认为 SQL 查询是通用的,但现在尝试使用 PostgresSQL ODBC 我遇到了语法和参数问题。
使用这个例子 POCO class ...
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 异常,因为在指定 table 之前需要子句 "INTO"。参数也不起作用,因为如果我没记错的话,PostgresSQL 参数设置为“?”符号而不是“@keyword”。在 GitHub page 我们可以找到这个:
Dapper has no DB specific implementation details, it works across all .NET ADO providers including SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL and 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 参数以冒号为前缀,而不是以 at 为前缀。尝试使用 :foo
而不是 @foo
.