SQL-запрос не работает - PullRequest
       16

SQL-запрос не работает

3 голосов
/ 13 июня 2010

Я пытаюсь создать запрос в базе данных доступа для набора данных C # с помощью редактора запросов, но созданный метод сообщает, что существует проблема, и он создан неправильно.

SELECT Discs.*
FROM Discs
WHERE (Title=@Title OR @Title IS NULL) AND
(Type=@Type OR @Type IS NULL) AND
(ContainerID=@ContainerID OR @ContainerID IS NULL) AND
NOT (@Title IS NULL AND @Type IS NULL AND @ContainerID IS NULL)

ошибка:

Generated SELECT statement.
Error in WHERE clause near '@'.
Unable to parse query text.

сгенерированный метод выбора не имеет никаких параметров и непригоден для использования. Я попробовал точно такой же оператор SQL в запросе на доступ, и он работал безупречно, что я должен делать по-другому при переносе его в C #?

Ответы [ 3 ]

6 голосов
/ 13 июня 2010

Насколько я помню (последний раз, когда я пытался, .NET 1.1 был последним, так что я не уверен, что это так), когда вы разговариваете с провайдером Jet OLEDB, вы должны указать параметры в запросе. с вопросительными знаками (параметры не названы и порядок имеет значение):

SELECT [Discs].*
FROM [Discs]
WHERE ([Title]=? OR ? IS NULL) AND
([Type]=? OR ? IS NULL) AND
([ContainerID]=? OR ? IS NULL) AND
NOT (? IS NULL AND ? IS NULL AND ? IS NULL)

(я бы заключил идентификаторы в скобки, чтобы они не вызывали проблем, если один из них будет ключевым словом, вы можете попробовать это перед изменением параметров на вопросительные знаки)

Учитывая, что в вашем запросе неоднократно используются одни и те же параметры, вам, вероятно, придется добавить его несколько раз в коллекцию Parameters вашего экземпляра OleDbCommand.

0 голосов
/ 13 июня 2010

Не уверен, что это быстрее или нет, но следующее:

 Title = @Title OR @Title IS NULL 

Можно также записать как

 ISNULL(@Title,Title) = Title

Это кажется мне более понятным, однако это может быть из-зая всегда видел, как это делается.

Это также решает проблему с ответом Мехрада Афшари о необходимости многократного перечисления параметров.например:

ISNULL(?,Title) = Title
0 голосов
/ 13 июня 2010

Я не уверен, правильно ли я понимаю, что вы хотите, но:

  SELECT   *
  FROM     Discs
  WHERE 
           (Title = @Title OR @Title IS NULL) 
           AND (Type = @Type OR @Type IS NULL) 
           AND (ContainerID = @ContainerID OR @ContainerID IS NULL)
           AND (@Title IS NOT NULL OR @Type IS NOT NULL OR @ContainerID IS NOT NULL)

Вы также можете вывести «одна из трех переменных должна быть ненулевой» вне запроса вЕсли заявление, которое я бы предпочел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...