2012-09-27 78 views
1

我试图使用表单中的数据将数据输入到SQL Server 2008中。我使用一个DateTimePicker选择从一种形式的日期,进入这个数据到数据库,但是当我尝试运行的形式,我发现了以下错误:错误:将varchar数据类型转换为日期时间数据类型导致超出范围值

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated

这是我下面的表单代码:

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(); 
+4

使用[参数](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx),可以帮助您从SQL注入中解脱出来,同时也可以解决您的错误。 – Habib

+0

直到你决定丢弃数据类型并将所有内容当作字符串处理,这一切都将如此。正如@Habib提到的,你应该使用参数。此外,“交易”对于一个表格来说真的很差(与其他关键字一样) –

回答

2

大概是与这个正在运行的机器的区域设置,和被最终传递到沿线的INSERT语句中是什么日期格式:

27/09/2012 4:17:42 PM 

(这是我在澳大利亚写的这个日期)。

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

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

2012-09-27 

或者更好的是,使用的参数,而是因为你有一个SQL注入漏洞存在。

+0

日期以与数据库相同的格式发送 –

+0

当然,但是如果您将它们发送为requestedD.ToString(“yyyy -MM-DD“)?您收到的错误是说SQL Server试图将您的字符串转换为日期,但结果日期超出范围。我相信这会解决这个问题。 –

+0

确定它检查了它...似乎只有一列是caausing这个错误...其余日期列正在接收数据 –

相关问题