【问题标题】:Error: the conversion of a varchar data type to a datetime data type resulted in an out-of-range value错误:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2012-09-27 06:11:05
【问题描述】:

我正在尝试使用表单中的数据将数据输入我的 SQL Server 2008。我正在使用 DateTimePicker 从表单中选择日期并将此数据输入到数据库中,但是当我尝试运行表单时出现以下错误:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
声明已终止

这是我下面表格的代码:

private void btnAddBooking_Click(object sender, EventArgs e)
{
            DateTime requested = dtpRequested.Value;
            DateTime pickup = dtpPickup.Value;
            DateTime estDropoff = dtpEstimatedDrop.Value;

            SAF.AddNewBooking(requested, pickup, estDropoff, selectedStatus.StatusId, selectedRate.RateId);
            dtpRequested.CustomFormat = " ";
            dtpPickup.CustomFormat = " ";
            dtpEstimatedDrop.CustomFormat = " ";

            cbStatus.SelectedIndex = 0;
            cbRateOfPayment.SelectedIndex = 0;

            MessageBox.Show("Booking Created");
            tabControl2.SelectTab(2);
}

这是我存储方法的外观中的代码:

public void AddNewBooking(DateTime requestedD, DateTime pickupD, DateTime estDropOff, int statusId, int rateId)
{
            dao.AddNewBooking(requestedD, pickupD, estDropOff, statusId, rateId);
}//end CreateBooking

这是我的 DAO 中的 INSERT 语句代码:

sql = "INSERT INTO [Transaction] (TransactionId, RequestedDateOfPickup, ActualDateOfPickup, EstimatedDropOffDate, StatusId, RateId)";
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", transactionId, requestedD, pickupD, estDropOff, statusId, rateId);

cn = new SqlConnection(Properties.Settings.Default.UKRENTALSConnectionString);
cmd = new SqlCommand(sql, cn);

cn.Open();
cmd.ExecuteNonQuery();

【问题讨论】:

  • 使用Parameters,可以让你免于SQL注入,也可以解决你的错误。
  • 一切进展顺利,直到您决定放弃数据类型并将所有内容都视为字符串。正如@Habib 提到的,您应该使用参数。此外,Transaction 是一个非常糟糕的表名称(就像任何其他关键字一样)

标签: c# .net sql-server-2008


【解决方案1】:

可能与正在运行的机器的区域设置有关,并且最终传递到插入语句中的日期格式类似于:

27/09/2012 4:17:42 PM

(在我写这篇文章时是澳大利亚的当前日期)。

SQL Server 可能会尝试将其转换为它使用的任何日期格式,但不能(例如,认为第一个参数是月份,但 27 大于 12)。

尝试将日期格式化为YYYY-MM-DD 格式:

2012-09-27

或者更好的是,使用参数代替,因为那里存在 SQL 注入漏洞。

【讨论】:

  • 当然,但是如果您按照要求发送它们会发生什么D.ToString("yyyy-MM-dd")?您得到的错误是说 SQL Server 试图将您的字符串转换为日期,但结果日期超出范围。我相信这会解决问题。
  • 好的,它检查了...似乎只有一列导致此错误...其余日期列正在接收数据
  • 这仍然可能是日期转换问题。我仍然认为格式化为 yyyy-MM-dd OR 使用参数是可行的方法。
  • yyyy-MM-dd 在某些情况下仍然可能不明确。 yyyyMMdd 更安全,不受地域问题影响。
  • set language british; select DATEPART(month,CONVERT(datetime,'2012-05-03')) 产生结果3,而不是5。 (您可以在 SQL Server 2005 或更早版本上省略 CONVERT() 步骤)
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2016-02-08
相关资源
最近更新 更多