【问题标题】:Exception when When using使用时的异常
【发布时间】:2017-06-03 00:21:00
【问题描述】:

我有一个包含 datetimepicker 的 winform 应用程序。当我选择一个日期时,它会提供该日期的销售详细信息。我也添加了代码来形成加载事件,但我得到一个 SqlDateTime 溢出错误。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

我的代码是

  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;
        }

.

【问题讨论】:

  • 您可能在日期参数中传递了 null
  • 你输出 dateTimePicker_FromByDateSaleReport.Text 了吗?它说什么?它包含哪种日期格式?
  • 您不需要从选择器中解析出值 - 您可以使用 Value 属性检索它。不要认为这是问题所在,但它可能会有所帮助。
  • 日期时间不能为空@husnain_sys
  • 为什么这个问题被赞成?如果提问者只调试过一次,这个问题很容易解决。代码格式不正确。我们只能猜测是哪个日期导致了溢出。这与 Visual Studio 无关。那么为什么会被赞呢?此问题质量低下。

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


【解决方案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】:

    这可能是由于以下两个原因之一:

    首先,fromDatetoDate 超出该范围,或者(很可能):

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

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

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

    【讨论】:

    • 或者,更好的是,根本不使用字符串值,只获取选择器将give you directly 的日期时间!顺便说一句,很好的通灵调试;)
    【解决方案3】:

    嗯,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;
    

    【讨论】:

    • 我可以插入日期时间类型的列,参数为 cmd4.Parameters.AddWithValue("@BillDate", dateTimePicker_POS.Text);我收到错误消息“从字符串转换日期和/或时间时转换失败。”
    • 没看到你在哪里使用AddWithValue,把它改成Add。无论如何,更重要的是你根本不需要使用Text 属性,因为你有一个Value 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多