簡體   English   中英

在MySQL參數中使用OR語句

[英]Using OR Statement in MySQL Parameter

我正在嘗試在我的C#應用​​程序中構造MySQL查詢,我想知道是否可以在MySQL參數中使用OR語句。

我有一個名單列表,我想檢查並查看數據庫中已存在的名稱。 這是一個簡短的例子

List<string> names = new List<string> {"adam", "bob", "cathy"}; //actual list is much longer
MySqlConnection connection = getAndOpenConnection();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM Employees WHERE name = @names";
command.Parameters.Add(new MySqlParameters("@names", String.Format("names = {0}", String.Join(names, " or name = ")))); //is this line legal?

我最初的想法是以這種方式構造命令文本:

command.CommandText = String.Format("SELECT * FROM Employees WHERE name = '{0}'", String.Join(names, "' or name = '"))

代碼將為我提供我想要的正確命令文本,但我真的想防止SQL注入。

有人可以幫我解決一下如何正確構建MySqlCommand嗎?

不容易,沒有。 你需要進行一個IN查詢,這是一個很難處理參數化(你真的應該這樣做)。 基本上,您有兩種選擇:

  • 根據數組大小構建適當的命令和參數
  • 使用一個可以幫到你的工具

后者更容易; 與“小巧玲瓏”,這只是:

connection.Query("SELECT * FROM Employees WHERE name in @names", new { names })
          .ToList();

(這將是一個List<dynamic> ;如果你有一個與列匹配的Employee類,你可以使用connection.Query<Employee>(...).ToList()來獲取List<Employee>

不過,前者更像(簡單版本):

var sb = new StringBuilder("SELECT * FROM Employees WHERE name=@name0");
cmd.Parameters.AddWithValue("name0", names[0]);
for(int i = 1; i < names.Count ; i++) {
    sb.Append(" or name=@name").Append(i);
    cmd.Parameters.AddWithValue("name" + i, names[i]);
}
cmd.CommandText = sb.ToString();

還有其他一些方法可以做到這一點:

switch(names.Count)
{
    case 0: cmd.CommandText = "SELECT * FROM Employees"; break;
    case 1:
        cmd.CommandText = "SELECT * FROM Employees WHERE name=@name";
        cmd.Parameters.AddWithValue("name", names[0]);
        break;
    default:
        var sb = new StringBuilder(
            "SELECT * FROM Employees WHERE name IN (@name0")
        cmd.Parameters.AddWithValue("name0", names[0]);
        for(int i = 1;i<names.Count;i++) {
            sb.Append(",@name").Append(i);
            cmd.Parameters.AddWithValue("name" + i, names[i]);
        }
        cmd.CommandText = sb.Append(")").ToString();
        break;
}

暫無
暫無

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

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