2014-01-03 3 views
2

Я использую следующую функцию для получения записи по выбору. Я дал таблицу имя и значение столбца, и он показывает результат. но проблема в том, Его не получает имя столбца в качестве параметра, как:Имя атрибута SQL в параметризованном запросе

public List<Products> ListAllProducts(string searchOption, string searchValue) 
{ 
    db.ClearParameters(); 
    db.AddParameter(db.MakeInParam("@ColumnName", DbType.String, 50, searchOption)); 
    db.AddParameter(db.MakeInParam("@Value", DbType.String, 50, searchValue)); 
    string query = @"SELECT * 
        FROM [Products] 
        WHERE @ColumnName LIKE '%'[email protected]+'%'"; 

    ds = db.GetDataSet(query); 
    //Rest of code but above query is not executing 
} 

но когда я использую запрос, как это:

string query = @"SELECT * 
       FROM [Products] 
       WHERE "+searchOption+" LIKE '%'[email protected]+'%'"; 

Он прекрасно работает и дает мне результат. Я читал this, this и this one specially, но понятия не имел. Прошу вас посоветуйте.

ответ

2

Параметры могут использоваться вместо значений внутри выражений, и ни для чего другого: в частности, вы не можете использовать параметры для обозначения имен таблиц, имен столбцов, спецификаторов порядка сортировки или других частей инструкции SQL, которые не являются значениями.

Ваш неинтерминированный запрос работает, потому что searchOption скопирован в ваш SQL и становится частью строки запроса.

Если вам необходимо создать запрос, который изменяет условия, основанные на параметре, вам необходимо изменить условие для учета всех возможных значений @ColumnName, как этого

string query = @"SELECT * 
       FROM [Products] 
       WHERE (@ColumnName='FirstName' AND FirstName LIKE '%'[email protected]+'%') 
        OR (@ColumnName='LastName' AND LastName LIKE '%'[email protected]+'%') 
        OR (@ColumnName='Location' AND Location LIKE '%'[email protected]+'%')"; 

или упасть обратно на генерирование запроса динамически. Пока searchOption не поступает непосредственно от входа пользователя, вы можете безопасно атаковать SQL-инъекциями, даже если ваш SQL генерируется динамически.

1

При попытке, я наткнулся на следующий вариант и опубликовал в ответ, так что другие могут получить выгоду от этого.

string query = String.Format(
          @"SELECT * 
          FROM [Products] 
          WHERE {0} LIKE '%'[email protected]+'%'", searchOption 
          ); 

Так полная функция становится:

public List<Products> ListAllProducts(string searchOption, string searchValue) 
{ 
    db.ClearParameters(); 
    db.AddParameter(db.MakeInParam("@Value", DbType.String, 50, searchValue)); 
    string query = String.Format(
           @"SELECT * 
           FROM [Products] 
           WHERE {0} LIKE '%'[email protected]+'%'", searchOption 
          ); 

    ds = db.GetDataSet(query); 
    //Rest of code 
} 
Смежные вопросы