2010-11-10 18 views
10

進出口試圖SQLite中從C#執行參數化查詢,以及使用該方法的IM是連同是否可以參數化SQLite查詢中的表名和列名?

 SQLiteCommand cmd = new SQLiteCommand(
     "SELECT [ID]" + 
      ",[email]" + 
      ",[serializedata]" + 
      ",[restrictions]" + 
     " FROM " + UserTable + 
     " WHERE @search = @searchparam", SQLConnection); 

     cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 
     cmd.Parameters.Add(new SQLiteParameter("@search")); 

創建靜態命令並調用它像這樣的線:

 Command.Parameters["@searchparam"].Value = searchdata; 
     Command.Parameters["@search"].Value = search; 
     SQLiteDataAdapter slda = new SQLiteDataAdapter(UserSelectUsernameCommand); 
     DataSet ds = new DataSet(); 
     slda.Fill(ds); 
     User[] array = new User[ds.Tables[0].Rows.Count]; 
     int index = 0; 
     foreach (DataRow row in ds.Tables[0].Rows) 
     { 
      array[index] = new User(this, row); 
      index++; 
     } 
     return array; 

但即時通訊「@搜索」的錯誤是不是一個正確的列名「或類似的東西。如果我使用一個常量列名稱,並只使用它的工作參數的數據,但我不想創建10個不同的命令,當我需要通過不同的列名稱搜索。

這裏有什麼問題?像列名(或表名)

回答

12

一般的東西可以進行參數設置 - 而事實上,有不同的指數意味着它將是一個不同的計劃內。所以,你將不得不使用串聯 - 要小心白名單已知的列名,以防止SQL注入:

SQLiteCommand cmd = new SQLiteCommand(@" 
    SELECT [ID],[email],[serializedata],[restrictions] 
    FROM " + whiteListedUserTable + @" 
    WHERE [" + whiteListedColumnName + @"] = @searchparam", SQLConnection); 

    cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 
    ... 
    Command.Parameters["@searchparam"].Value = searchdata; 
2

在時尚不能使用查詢參數 - 指示列名。你只能用它來提供值。

考慮這樣的事情,而不是:

SQLiteCommand cmd = new SQLiteCommand(
    "SELECT [ID]" + 
     ",[email]" + 
     ",[serializedata]" + 
     ",[restrictions]" + 
    " FROM " + UserTable + 
    " WHERE [" + search + "] = @searchparam", SQLConnection); 

    cmd.Parameters.Add(new SQLiteParameter("@searchparam")); 

如果你控制所有輸入到這個功能,沒有它是否可以由他人爲您提供,這應該是安全的。但是,如果search來自不受信任的第三方,請確保對該值進行適當的安全檢查。

相關問題