WebMatrix sql LIKE% - PullRequest
       9

WebMatrix sql LIKE%

3 голосов
/ 21 ноября 2011

У меня проблемы со следующим запросом. Он работает, когда я выполняю его напрямую из WebMatrix со статическими параметрами и возвращает несколько строк, но не с моей страницы .cshtml

var accounts = database.Query(
  @"SELECT Username, Email, row_count
  FROM (SELECT Username, Email, Count(0) OVER() as row_count, ROW_NUMBER() OVER(ORDER BY @0 DESC) as row_number 
  FROM UserProfile 
  WHERE Username LIKE %@1% AND Email LIKE %@2%) as accounts
  WHERE row_number BETWEEN @3 AND @4",
  new object[] { sort, username, email, start, end });

Когда я заменяю параметры LIKE @ 1 и @ 2 статическими значениями, это работает, но это не ORDER BY параметр @ 0

Ответы [ 4 ]

6 голосов
/ 21 ноября 2011

Используйте это в вашем sql:

LIKE '%' + @1 + '%'
2 голосов
/ 21 ноября 2011

Это связано с тем, что запрос @ 0 оценивается как буквальное значение параметра, а не как имя столбца таблицы - например.если @ 0 - это «Имя пользователя», соответствующая часть запроса обрабатывается как ROW_NUMBER() OVER(ORDER BY 'Username' DESC), а не ROW_NUMBER() OVER(ORDER BY Username DESC).

Поэтому номер строки всегда оценивается как 1.

Поэтому решение заключается в том, чтобы вставить значение @ 0 в строку запроса, а не рассматривать его как параметр связывания.(Этот подход обычно не рекомендуется из-за риска атак SQL вставки, но, учитывая, что вы должны быть в состоянии гарантировать, что доступные значения @ 0 будут действительны, он должен быть подходящим в этом случае .)

РЕДАКТИРОВАТЬ: альтернативный подход - вместо использования динамического SQL, если вы не можете гарантировать, что @ 0 будет должным образом очищены, то вы можете использовать вместо этого предложение case:

var accounts = database.Query(
  @"SELECT Username, Email, row_count FROM 
   (SELECT Username, 
           Email,
           Count(0) OVER() as row_count, 
           ROW_NUMBER() OVER(ORDER BY row_group DESC) as row_number 
    FROM (SELECT Username, 
                 Email,
                 CASE @0
                     WHEN 'Username' THEN Username
                     WHEN 'Email' THEN Email
                     /* insert other valid cases here */
                 END as row_group
          FROM UserProfile 
          WHERE Username LIKE '%'+@1+'%' AND Email LIKE '%'+@2+'%') u
   ) as accounts
   WHERE row_number BETWEEN @3 AND @4",
  new object[] { sort, username, email, start, end });
0 голосов
/ 12 августа 2016

Моя проблема

Я использую веб-страницы ASP.NET и имею аналогичную проблему, когда использую Database.Query () для выполнения оператора SQL SELECT с использованием LIKE предложение.

Мое решение

Вот фрагмент кода, который показывает, как я решил мою проблему:

qString = @"
Select *
From
    [Product]
Where Lastname like @0
Order By LastName";

using (var db = Database.Open("StarterSite"))
{
    data = db.Query(qString, "%" + searchTxt + "%");
}   
0 голосов
/ 21 ноября 2011

Я не знаком с синтаксисом webMatrix; но логически мне кажется, что dbengine не понимает переменные% @ 1% и% @ 2% и пытается использовать конкатенацию строк, чтобы передать значение переменной вместо переменной.

Итак ...

WHERE USERname like %" & @1 & "% AND Email like %" & @2 & "%) as accounts
...