使用时的例外情况

时间:2017-01-18 14:53:40

标签: c# sql-server winforms visual-studio

我有一个包含datetimepicker的winform应用程序。当我选择日期时,它会给出日期销售详细信息。我已经添加了代码来形成加载事件,但是我收到了SqlDateTime溢出错误。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。

我的代码是

  DateTime fromDate, toDate;
            DateTime.TryParse(dateTimePicker_FromByDateSaleReport.Text, out fromDate);
            DateTime.TryParse(dateTimePicker_ToByDateSaleReport.Text, out toDate);


            SqlDataAdapter da3 = new SqlDataAdapter("SELECT Bill_Date,Name,Item,Item_Code,MRP, Quantity,Amount as Total, Amount_After_Discount as Grand_Total  From POS  LEFT JOIN Customers ON POS.Customer=Customers.Customer_Id WHERE Bill_Date Between @From AND @To", con);
            da3.SelectCommand.Parameters.AddWithValue("@From", SqlDbType.DateTime).Value = fromDate;
            da3.SelectCommand.Parameters.AddWithValue("@To", SqlDbType.DateTime).Value = toDate;
            DataTable dt3 = new DataTable();
            da3.Fill(dt);
            dgv_ByDateSaleReport.DataSource = dt3;
        }

3 个答案:

答案 0 :(得分:3)

出现这种情况有两个原因:

首先,fromDatetoDate超出该范围,或(最有可能):

fromDate无法解析您的某个日期变量(toDateTryParse())。发生这种情况时,日期设置为C#的默认0001-01-01值。

SQL Server中,DATETIME数据类型只能保存从1753-01-019999-12-31的值,并且传递的0001-01-01超出范围。< / p>

在执行之前检查要解析的字符串的值。

答案 1 :(得分:1)

这可能是由于您的fromDatetoDate值未正确解析而导致的,因此可能包含其原始默认值“1/1/0001 12:00:00 AM”,其中将不是有效日期:

DateTime fromDate, toDate;
DateTime.TryParse(dateTimePicker_FromByDateSaleReport.Text, out fromDate);
DateTime.TryParse(dateTimePicker_ToByDateSaleReport.Text, out toDate);

如果您使用的是DateTime选择器控件,则可以使用DateTimePicker.Value property访问日期,这将返回实际的DateTime对象:

DateTime fromDate = dateTimePicker_FromBydateSaleReport.Value;
DateTime toDate = dateTimePicker_ToByDateSaleReport.Value;

答案 2 :(得分:0)

好吧,SqlDbType.DateTime的值介于1753年1月1日至9999年12月31日之间,因此您应该尝试使用SqlDbType.DateTime2代替。 此外,没有必要将DateTimePicker.Text属性解析为DateTime,因为它已经有一个名为Value的DateTime属性。

请改为尝试:

        SqlDataAdapter da3 = new SqlDataAdapter("SELECT Bill_Date,Name,Item,Item_Code,MRP, Quantity,Amount as Total, Amount_After_Discount as Grand_Total  From POS  LEFT JOIN Customers ON POS.Customer=Customers.Customer_Id WHERE Bill_Date Between @From AND @To", con);
        da3.SelectCommand.Parameters.Add("@From", SqlDbType.DateTime2).Value = dateTimePicker_FromByDateSaleReport.Value;
        da3.SelectCommand.Parameters.Add("@To", SqlDbType.DateTime2).Value = dateTimePicker_ToByDateSaleReport.Value;
        DataTable dt3 = new DataTable();
        da3.Fill(dt);
        dgv_ByDateSaleReport.DataSource = dt3;