簡體   English   中英

在調用存儲過程時管理單引號

[英]Managing Single Quotes while calling on a Stored Procedure

經過多次辯論,我停止使用LINQ,轉而使用存儲過程。 既然我正在使用所有存儲過程,那么我將碰到那些我認為對LINQ完全理解的事情。 一是單引號。

一位同事在下面向我展示了此方法,它使調用存儲過程變得更加容易,而不必為每個查詢寫很長的路。 我現在的問題是處理諸如Mc'KayO'Reilly這樣的人的名字的數據。 單引號將我傳遞的字符串弄亂了。

public static void exe(string sql)
{
        SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString);

        SqlCommand cmd = new SqlCommand(sql, con);

        if (con.State == ConnectionState.Closed) { con.Open(); }

        cmd.ExecuteNonQuery(); con.Close();
    }

我在網站上經常使用這種方法,並且非常相似。 我可以清理此方法的最佳方法是什么,以便它可以讓我操作其中包含“''的數據並且仍然對SQL注入安全/可靠。 我希望使用此方法或使用輔助方法來執行此操作,因此自從進行此切換以來,我不必遍歷已編寫的每個查詢。

我要求傳遞存儲過程的名稱作為存儲過程,然后用逗號分隔其背后的參數。 如果參數是字符串,則將其用單引號引起來。

排序答案:撰寫查詢時,將單引號替換為兩個單引號。 這就是您在SQL Server中轉義單引號的方式。 即:

var escapedValue = originalValue.Replace("'","''");

好的建議:正如所有注釋中所述,請勿以這種方式編寫查詢,而應使用參數化查詢或存儲過程,並傳遞參數值:您將避免出現數字和日期解析,SQL注入攻擊和很多不同的地方,而且很多時候還出乎意料的問題。

此外,如果您使用的是存儲過程,則必須已經有可用的參數。 請簡單地使用它們! 真的很簡單:

換句話說:只需創建一個命令,將命令類型設置為存儲過程,設置存儲過程名稱,將參數及其值添加到參數集合中,然后執行。 這樣,您將無需擔心上述問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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