2016-02-12 81 views
2

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

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

我在做什么错了?

我的问候!

回答

1

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

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

+0

我会尽快尝试。我会让你知道......谢谢。 – AlighaThor

+0

以冒号为前缀的IIRC参数没有奏效。尝试此... var query = @“INSERT INTO cardtypes(type,description)values(:Type,:Description)”; _db.Execute(query,cardType); ...我得到了一个异常:“错误[42601]错误:错误de sintaxis en o cerca de«:»;”。 那么, – AlighaThor

+1

@AlighaThor啊,你使用的是ODBC连接器。选项:1)使用psuedo-positions参数,即''type?','?description?' - dapper会检测到这个参数,并用位置参数'?'和'?'替换它们,添加它们。 2)使用Npgsql ADO。NET连接器而不是ODBC; dapper会检测到这一点,并启用绑定的名称,而不是只是位置绑定。 Nuget链接:https://www.nuget.org/packages/Npgsql/ –