关于 PostgreSQL 的 Dapper SQL 查询和参数的问题

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)

它也失败了……一个奇怪的“[”字符异常。

我做错了什么?

致以我的问候!

Mar*_*ell 5

Dapper 不会尝试解析您的查询或提供自定义 DSL。相反:它将您的查询直接传递给您选择的 ADO.NET 提供程序。在某些情况下,它确实做了一些调整,但在一般意义上:它没有受到影响。

在 postgresql 的情况下,IIRC 参数是冒号前缀,而不是前缀。尝试使用:foo代替@foo.

  • @AlighaThor 啊,您正在使用 ODBC 连接器。选项:1) 使用伪位置参数代替,即`?type?`、`?description?` - dapper 将检测到这一点并用位置参数`?` 和`?` 替换它们,使用名称来确定哪个顺序添加它们。2) 使用 Npgsql ADO.NET 连接器而不是 ODBC;dapper 将检测到这一点并启用按名称绑定,而不仅仅是位置绑定。Nuget 链接:https://www.nuget.org/packages/Npgsql/ (2认同)