我正在尝试使用查询编辑器在访问数据库中为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#时,我应该做些什么呢?
答案 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