簡體   English   中英

SQLParameterCollection AddWithValue和Add不會轉義通配符

[英]SQLParameterCollection AddWithValue and Add does not escape wildcard symbols

我目前正在構建一個API,該API允許用戶使用名稱搜索數據庫對象。 存儲過程按以下方式運行此查詢:

ALTER PROCEDURE [GetMyDatabaseObjectByName] 
    @name varchar(255)
as
begin
select mdo.Name,
       mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + @name + '%'
end

我從C#應用程序調用此查詢,如下所示:

dbCommand.Parameters.AddWithValue("@name", name); 

這一切都是好事,但是如果用戶像我的QA工程師那樣優雅地傳遞了'%'符號,則存儲過程將返回數據庫中的每個元素,因為它將其解釋如下:

 select mdo.Name,
        mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + '%' + '%'

我嘗試使用

dbCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = name; 

但是我得到了相同的結果。 根據文檔,我認為AddAddWithValue會自動對字符串進行轉義以避免這種情況。

問題:

System.Data.SqlClient中是否有任何內置解決方案可以轉義傳入的任何符號?

在客戶端級別使用正則表達式來避免傳遞任何時髦字符的首選方法是什么?

AddAddWithValue不會自動轉義任何符號,為了清除或轉義您的用戶可能傳入的符號,您需要實現以下內容

name = EscapeForLike(name)
dbCommand.Parameters.AddWithValue("@name", name); 

public static string EscapeForLike(string input)
{
    return input
        .Replace("[", "\\[")
        .Replace("]", "\\]")
        .Replace("\\", "[\\]")
        .Replace("%", "[%]")
        .Replace("_", "[_]");
}

暫無
暫無

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

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