簡體   English   中英

使用動態列名更新Dapper

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM