我目前正在学习Dapper。我在这里和其他地方搜索了很多(包括this),但我无法找到具体答案来解决我的疑问:关于Dapper SQL查询和PostgreSQL参数的问题
¿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);
首先,这条线trows的ODBC异常怎么一回事,因为预计该条款在指定表之前“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 = [email protected]"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"
});
它也失败了......奇怪的字符“[”例外。
我在做什么错了?
我的问候!
我会尽快尝试。我会让你知道......谢谢。 – AlighaThor
以冒号为前缀的IIRC参数没有奏效。尝试此... var query = @“INSERT INTO cardtypes(type,description)values(:Type,:Description)”; _db.Execute(query,cardType); ...我得到了一个异常:“错误[42601]错误:错误de sintaxis en o cerca de«:»;”。 那么, – AlighaThor
@AlighaThor啊,你使用的是ODBC连接器。选项:1)使用psuedo-positions参数,即''type?','?description?' - dapper会检测到这个参数,并用位置参数'?'和'?'替换它们,添加它们。 2)使用Npgsql ADO。NET连接器而不是ODBC; dapper会检测到这一点,并启用绑定的名称,而不是只是位置绑定。 Nuget链接:https://www.nuget.org/packages/Npgsql/ –