[英]Update with Dapper using dynamic column name
我需要進行更新,但列名稱是動態的。
代碼片段:
using (var cn = Connection)
{
var sql = @"UPDATE Teste
SET @columnName = @parameter,
DT_PROCESSAMENTO = @vDtProcessamento
WHERE ID = @ID";
var resultado = cn.Execute(sql, new
{
columnName,
parameter,
ID
});
}
是否可以將列名作為參數傳遞? 這段代碼就是我所做的,但它不起作用。 沒有例外,但更新不起作用。
不,你不能那樣做,因為列名不能是變量。 要做到這一點,你需要像這樣的動態SQL:
using (var cn = Connection)
{
var sql = $@"UPDATE Teste
SET {columnName} = @parameter,
DT_PROCESSAMENTO = @vDtProcessamento
WHERE ID = @ID";
var resultado = cn.Execute(sql, new
{
parameter,
ID
});
}
在上面的代碼片段中,您可以將@組合使用字符串中的換行符,並將$組合在字符串中插入變量 - 它比使用String.Format
更清晰,更短。
對於一些特定的場景,我已經使用了這種類似於dapper的東西。
你應該使用String.Format
:
var columnName = "Name";
var sql = String.Format(@"UPDATE Teste
SET {0} = @parameter
WHERE ID = @ID", columnName);
但是在這里你可以獲得SQL注入。
因此,最好檢查列名是否是表中的列名 。
如上所述,要做到這一點,您需要動態構造SQL,在SQL中使用EXEC(),或在C#中使用string.Format()或StringBuilder。 請注意,通過這樣做,你會認為自己是一些人眼中的野蠻人! 您無法保證方法的用戶將提供有效的列名稱。 您必須運行程序才能查看它生成的SQL以及它是否運行。 輸入參數周圍沒有類型安全性。 必須有更好的方法 。 免責聲明:我寫過QueryFirst
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.