2010-11-10 15 views
10

Im próbuje wykonać zapytania parametrycznego w SQLite z C# i metoda im przy pomocy jest wzdłuż linii tworząc polecenie statyczny zCzy można sparametryzować nazwy tabel i kolumn w zapytaniach 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")); 

i nazywając go tak:

 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; 

ale im błąd w linii "@search" nie jest poprawną nazwą kolumny "lub coś podobnego. jeśli używam stałej nazwy kolumny i używam tylko danych dla parametrów, które on działa, ale nie chcę tworzyć 10 różnych poleceń, kiedy muszę szukać według różnych nazw kolumn.

Na czym polega problem?

Odpowiedz

12

Generalnie takie rzeczy jak nazwy kolumn tabeli (lub nazwy) mogą nie być parametryzowane - oraz fakt, że istnieją różne indeksy oznacza, że ​​będzie mieć być inny plan wewnętrznie. Więc trzeba będzie używać konkatenacji - ale uważać na białej liście znane nazwy kolumn, aby zapobiec SQL injection:

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

Nie można użyć parametru zapytania w tej mody - aby wskazać nazwę kolumny. Możesz go użyć tylko do podania wartości.

rozważyć coś takiego zamiast:

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

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

Jeśli kontrolować wszystkie wejścia do tej funkcji i żaden jeżeli może być dostarczony przez kogoś innego niż ty, to powinno być bezpieczne. Ale jeśli search pochodzi od niezaufanej strony trzeciej, należy wykonać odpowiednie kontrole bezpieczeństwa wartości.

Powiązane problemy