ADO.net BETWEEN奇怪的行为

时间:2011-07-15 13:31:37

标签: 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 = '')  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,当选择有效日期时,我似乎在我的数据网格上没有值。但是,当我在此之后取出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);

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

3 个答案:

答案 0 :(得分:0)

我认为这不是你的日期选择那就是问题。我认为这是一些像这样的陈述:

VendorName = @VendorName OR @VendorName = ''

你的意思是@VendorName = ''还是你想写VendorName = ''

我怀疑是因为你正在和WHERE中的所有条款并列,因为没有符合所有条件的数据,所以你没有得到任何数据。

EDIT 根据你的进一步编辑,听起来就像你添加更多数据,你被排除/过滤没有得到任何结果,所以我再次建议没有结果,因为没有数据符合那些收紧的标准。

答案 1 :(得分:0)

几乎可以肯定,传递给其他参数的值导致一个或多个其他子句评估为false。检查在调试器中放入非日期参数的内容和/或对数据库进行概要分析以提取值..

答案 2 :(得分:0)

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

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