选择两个日期之间的查询不起作用

时间:2017-02-02 20:40:28

标签: c# sql winforms

我以我的一种形式拥有这段代码,

using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConString))
{
    query = "select SUM(TotalMinutes) as TotalMin, SUM(OTMinutes) as OTMin from EmpLog where EmpID = @EmpID and LogDate >= @empdate1 and LogDate <= @empdate2";
    conn.Open();
    using (SqlCommand cmd2 = new SqlCommand(query, conn))
    {
        cmd2.Parameters.AddWithValue("@empdate1", dtp_from.Value.ToString("yyyy-MM-dd"));
        cmd2.Parameters.AddWithValue("@empdate2", dtp_to.Value.ToString("yyyy-MM-dd"));
        cmd2.Parameters.Add(new SqlParameter() { ParameterName = "@EmpID", Value = listBox1.SelectedValue.ToString() });
        var da = new SqlDataAdapter(cmd2);
        DataTable dt = new DataTable();
        da.Fill(dt);             

        decimal decminutes = Convert.ToDecimal(dt.Rows[0]["TotalMin]"].ToString());
        decimal decOTminutes = Convert.ToDecimal(dt.Rows[0]["OTMin"].ToString());

我已经在不同的表单上制作了类似的代码,但不知怎的,这不起作用。我已经尝试过SqlDataReader,但它甚至不会进入一段时间的reader.read循环。

在通过ssms尝试查询时,它按预期工作。但如果我尝试其他方法,如sqldatareader,它将进入null异常。

编辑:我已经尝试从查询中删除WHERE子句,并且我能够返回行。

由于某些奇怪的原因,datetimepicker值未正确匹配数据库中的值。即使我将它转换为字符串,它完全匹配,但是再次,它仍然返回dbnull。

1 个答案:

答案 0 :(得分:4)

BETWEEN关键字

您可能需要考虑在SQL中使用BETWEEN关键字来检查某个值是否存在于给定范围内,如此SQL示例所示:

SELECT SUM(TotalMinutes) AS TotalMin, 
       SUM(OTMinutes) AS OTMin 
  FROM EmpLog 
 WHERE EmpID = @EmpID 
   AND LogDate BETWEEN @empdate1 AND @empdate2"

避免不必要的投射

此外,您可能希望避免将DateTime值显式地转换为字符串。 SQL提供程序应该毫不费力地将这些值转换为适当的SQL等价物。

所以应用这两个变化,应该给你这样的东西:

using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
     conn.Open();
     var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
     using (var cmd = new SqlCommand(query, conn))
     {
           cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
           cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
           cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
           var da = new SqlDataAdapter(cmd2);
           DataTable dt = new DataTable();
           da.Fill(dt);     

           // Other code omitted for brevity
     }        
}

使用DataReader的示例

using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
     conn.Open();
     var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
     using (var cmd = new SqlCommand(query, conn))
     {
           cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
           cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
           cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
           using(var reader = cmd.ExecuteReader())
           {
                while(reader.Read())
                {
                     var minutes = Convert.ToDecimal(reader["TotalMin"]);
                     var otMinutes = Convert.ToDecimal(reader["OTMin"]);

                     // Do something here
                }
           }
     }        
}