带参数的Access查询在Access中有效,而在C#中无效
本文关键字:Access 无效 而在 有效 参数 查询 | 更新日期: 2023-09-27 17:57: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只接受非null OleDbParameters类型的对象,而不接受String对象"
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#运行的原始查询。[聘用日期]是一个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]
您需要使用?
,因为OleDBCommand.Parameters
不支持命名参数。
OleDbCommand.Parameters属性
OLE DB.NET提供程序不支持用于传递的命名参数SQL语句或由调用的存储过程的参数当CommandType设置为Text时使用OleDbCommand。在这种情况下必须使用问号(?)占位符。
因此,OleDbParameter对象添加到OleDbParameterCollection必须直接对应于命令文本中参数的问号占位符。
所以你的代码应该是:
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);
由于您使用OleDb
,因此您的参数似乎需要使用?
。它不支持命名参数。
来自OleDbCommand.Parameters
属性
OLE DB.NET提供程序不支持用于传递的命名参数SQL语句或由调用的存储过程的参数当CommandType设置为Text时使用OleDbCommand在这种情况下必须使用问号(?)占位符。例如:
从CustomerID=的客户中选择*?
AND CDate([Date of Hire]) > CDate(?)
AND CDate([Date of Hire]) < CDate(?), True, False
正如雷莫所说;
"不支持命名参数"仅表示它将根据参数的位置识别参数,而不是说不能使用名称。你不用用?,你只需要确保订单对的