C# net之间的奇怪行为

C# net之间的奇怪行为,c#,sql,visual-studio-2010,ado.net,C#,Sql,Visual Studio 2010,Ado.net,我不确定这个代码有什么错 else if (combo_View.Text == "Orders") { da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE (VendorName = @VendorName OR @VendorName = '') AND (CustomerName = @CustomerName OR @CustomerName = '') AND (PO = @PO OR @PO

我不确定这个代码有什么错

else if (combo_View.Text == "Orders")
{

    da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE (VendorName = @VendorName OR @VendorName = '') AND (CustomerName = @CustomerName OR @CustomerName = '') AND (PO = @PO OR @PO = '')  AND (ItemNum = @ItemNum OR @ItemNum = '') AND (orderDate BETWEEN @From AND @To) ORDER BY CustomerName", cs);

    //da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE orderDate BETWEEN @From AND @To", cs);

    da.SelectCommand.Parameters.Add("@VendorName", OleDbType.VarChar).Value = combo_VendorView.Text.ToString();
    da.SelectCommand.Parameters.Add("@CustomerName", OleDbType.VarChar).Value = combo_CustomerView.Text.ToString();

    da.SelectCommand.Parameters.Add("@From", OleDbType.Date).Value = "#" + tp_viewFrom.Value.Date.ToString("M/d/yyyy") + "#";
    da.SelectCommand.Parameters.Add("@To", OleDbType.Date).Value = "#" + tp_viewTo.Value.Date.ToString("M/d/yyyy") + "#";

    da.SelectCommand.Parameters.Add("@PO", OleDbType.VarChar).Value = txt_POLookup.Text.ToString();
    da.SelectCommand.Parameters.Add("@ItemNum", OleDbType.VarChar).Value = combo_ItemNumLookup.Text.ToString();


    dsB.Clear();
    da.Fill(dsB);
    dgv_DataLookup.DataSource = dsB.Tables[0];
}
基本上,我想用between语句填充数据网格。对于未注释的SelectCommand,当选择有效日期时,我的datagrid上似乎没有任何值。但是,当我取出select命令的注释之后,它会在其唯一日期生效。当我有其他参数时,有人能告诉我第一个命令有什么问题吗?谢谢

编辑:

更奇怪的是,当我使用这个select命令时:

da.SelectCommand = new OleDbCommand("SELECT * FROM TestQuery WHERE
    (VendorName = @VendorName OR @VendorName = '')
    AND (CustomerName = @CustomerName OR @CustomerName = '')
    AND orderDate BETWEEN @From AND @To ORDER BY CustomerName", cs);

它可以工作,但我添加了更多内容,它就停止了…

我不认为是您选择的日期是问题所在。我想是这样的一些说法:

VendorName = @VendorName OR @VendorName = ''
你真的是指
@VendorName=''
还是指写
VendorName=''

我的怀疑是,由于您正在将
WHERE
中的所有子句合并在一起,您没有得到任何数据,因为没有满足所有标准的数据

编辑
根据您的进一步编辑,似乎一旦您添加了更多要排除/筛选的数据,您就不会得到任何结果,因此,我再次建议没有结果,因为没有数据符合严格的标准。

这几乎肯定是由于传递到其他参数的值导致一个或多个其他子句的计算结果为false。检查调试器中非日期参数中的内容和/或分析数据库以提取值。

如果您的任何数据值或between子句中的参数本身为null,between将始终为false。测试@from和@to上的空值,并将中间值与该测试一起放在or中

and (@from is null or @to is null or <between stmt> )
和(@from为null或@to为null或)

您是否检查了查询分析器中的消息文本?你能提供它吗?你能直接在数据库上运行该查询并得到结果吗?请阅读上的这篇博文。因此,可能你的PO和ItemNum列是数字。PO和ItemNum列是varcharNo。我认为他的逻辑是正确的,他的意思是“如果参数有值,将其与字段进行比较,如果没有值,则计算为true”,只有在用户为该字段提供了vlue时才应用过滤。这是我最初的想法,但在此之前,如果我将日期去掉,所有内容都有效…好的,是的,现在我想这是有意义的。我可能会亲自重新构造它,这样我甚至不会为未提供的值生成WHERE子句,在构建查询时使用
StringBuilder
保存查询。嗨,这就是我尝试的。我去掉了Between子句,一切正常(输入供应商、客户名称,但没有PO或ItemName)。我很确定我也涵盖了实际有订单的日期。不是确切的答案,我不得不补充一些东西,但已经足够接近了。谢谢