我目前正在學習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/ –