C# 带参数的Access查询在Access中工作,而不是在C中

C# 带参数的Access查询在Access中工作,而不是在C中,c#,ms-access,C#,Ms Access,我有一个查询在Access中工作得很好,但在C中似乎不起作用。我非常确定它与我添加的参数有关,因为如果我用符号对日期进行硬编码,那么它工作得很好。有人知道这里的解决方案是什么吗?谢谢 string queryAccessNewHires = @"SELECT cdate([Date of Hire]), Count([SSN]) AS DateCount FROM [FED] WHERE IIf( IsNull([Date of Hi

我有一个查询在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);
编辑:: 谢谢你的帮助。它没有在查询表达式错误中接收语法错误,而是在修改代码时理解了我想要的东西。但是,我收到的新错误是:OLEDBPParameterCollection只接受非null的OLEDBPParameter类型对象,而不是字符串对象

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]
既然您使用OleDb,看起来您需要使用?为您的参数。它不支持命名参数

OLE DB.NET提供程序不支持用于传递的命名参数 由调用的SQL语句或存储过程的参数 CommandType设置为Text时的OleDbCommand。在这种情况下 必须使用问号占位符。例如:

从CustomerID=?的客户中选择*

如Remou


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

你需要使用什么?作为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);

“不工作”是指它抛出错误还是不返回数据?我坚信您不能在自己的应用程序中使用在Access中工作的VBA功能。即IIf、CDate、IsNull等@UweKeim IsNull、CDate和IIf不是“VBA材料”,有Jet/ACE材料,在MS Access之外工作正常。谢谢,@Remou你确定吗?IIRC我以前尝试过上面的代码,但没有成功。很高兴听到这个消息@UweKeim我刚刚用C&ACE进行了测试,虽然看到我在经典ASP中使用了一些这方面的东西,但我真的不需要:啊,我明白了,我不知道。非常感谢。然而,我现在收到一个不同的错误。OleDbParameter集合只接受非null类型的对象,而不接受字符串对象“不支持命名参数”只是意味着它将仅根据其位置识别参数,而不是不能使用名称。您不必使用?,只需确保顺序正确即可。那句话不太正确。@Remou你说得对。用你的报价更新我的答案。也谢谢你。然而,我现在得到一个新的错误。OleDbParameter集合只接受非null类型的对象,而不接受字符串对象。我已对上述命名参数进行了注释。@Remou,因此可以使用任何字符来代替?,但只有顺序才重要?这是一个很好的观点,我不知道。当然,MSDN文档有误导性,但它如何区分查询中的参数和其他文本??和@符号似乎是唯一从我的快速测试中触发参数的符号。
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);