带参数的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]

带参数的Access查询在Access中有效,而在C#中无效

您需要使用?,因为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 

正如雷莫所说;

"不支持命名参数"仅表示它将根据参数的位置识别参数,而不是说不能使用名称。你不用用?,你只需要确保订单对的