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

时间:2016-02-12 16:28:02

标签: c# sql postgresql dapper dialect

我目前正在学习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"
});

它也失败了...一个奇怪的“[”字符例外。

我做错了什么?

我的问候!

1 个答案:

答案 0 :(得分:2)

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

对于postgresql,IIRC参数是以冒号为前缀的,而不是带前缀的。尝试使用:foo代替@foo