【发布时间】:2014-04-09 14:23:32
【问题描述】:
我有一个可以在 Access 中完美运行的查询,但在 C# 中似乎无法运行。我很确定它与我添加的参数有关,因为如果我用“#”符号对日期进行硬编码,那么它可以正常工作。有谁知道这里的解决方案是什么?提前感谢
string queryAccessNewHires =
@"SELECT cdate([Date of Hire]), Count([SSN]) AS DateCount
FROM [FED]
WHERE
IIf(
IsNull([Date of Hire]), False,
IIf([Date of Hire] <> 'DoesNotApply'
AND [Date of Hire] <> ""
AND CDate([Date of Hire]) > CDate(PBP)
AND CDate([Date of Hire]) < CDate(PBE), True, False
)
)
GROUP BY [Date of Hire]
ORDER BY [Date of Hire]";
OleDbCommand cmdNewHires = new OleDbCommand(queryAccessNewHires, conn);
cmdNewHires.Parameters.AddWithValue("PBP", tbTYB.Text);
cmdNewHires.Parameters.AddWithValue("PBE", tbTYE.Text);
编辑:: 感谢您的帮助。而不是收到“查询表达式中的语法错误”错误,它似乎是在我更改代码时理解我想要的。但是我收到的新错误是:“OleDbParameterCollection 只接受非空 OleDbParameter 类型对象,而不接受字符串对象”
string queryAccessNewHires = @"SELECT cdate([Date of Hire]), Count([SSN]) AS DateCount
FROM [FED]
WHERE IIf(IsNull([Date of Hire]),False,
IIf([Date of Hire]<>'DoesNotApply'
AND [Date of Hire]<>""
AND CDate([Date of Hire])>CDate(?)
AND CDate([Date of Hire])<CDate(?), True, False))
GROUP BY [Date of Hire]
ORDER BY [Date of Hire]";
OleDbCommand cmdNewHires = new OleDbCommand(queryAccessNewHires, conn);
cmdNewHires.Parameters.Add(tbTYB.Text);
cmdNewHires.Parameters.Add(tbTYE.Text);
编辑: 仍然没有找到解决方案。我在想我可能使这变得比它需要的更难,所以我想向你们展示我想从 C# 运行的原始查询。 [Date of Hire] 是一个 varchar,需要转换。我不能改变设计。此查询返回“无效使用 null”。我不明白为什么这个查询没有执行。
SELECT cdate([Date of Hire]), Count([SSN]) AS DateCount
FROM [FED]
WHERE (CDate([Date of Hire]) > #1/1/2013#
AND CDate([Date of Hire]) < #12/31/2013#)
GROUP BY [Date of Hire]
ORDER BY [Date of Hire]
【问题讨论】:
-
不工作是指它抛出错误还是不返回数据?
-
我坚信你不能在你自己的应用程序中使用在 Access 中工作的 VBA 东西。 IE。
IIf、CDate、IsNull等 -
@UweKeim IsNull、CDate 和 IIf 不是“VBA 的东西”,有 Jet/ACE 的东西,并且在 MS Access 之外可以正常工作。
-
谢谢,@Remou 你确定吗? IIRC我过去尝试过类似上面的代码但没有成功。很高兴听到!
-
@UweKeim 我刚刚用 C# 和 ACE 进行了测试,虽然看到我已经在经典 ASP 中使用了一些这些东西,但我真的不需要:)