SQL查询不起作用

时间:2010-06-13 16:31:57

标签: c# sql visual-studio ms-access

我正在尝试使用查询编辑器在访问数据库中为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.

生成的select方法没有任何参数且无法使用。 我在访问查询中尝试了完全相同的SQL语句,它运行得很完美,在将它转换为C#时,我应该做些什么呢?

3 个答案:

答案 0 :(得分:6)

据我所知(上次我尝试过,.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集合中。

答案 1 :(得分:0)

我不确定我是否理解你想要的东西,但是:

  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)

您还可以在IF语句中将“三个变量之一需要为非null”拉出来,我更喜欢。

答案 2 :(得分:0)

不确定它是否更快,但以下内容:

 Title = @Title OR @Title IS NULL 

也可以写成

 ISNULL(@Title,Title) = Title

这对我来说似乎更清楚,但这可能是因为我总是看到它已经完成了。

它还解决了Mehrdad Afshari回答必须多次列出参数的问题。例如:

ISNULL(?,Title) = Title