2016-02-12 111 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/ –