C# 错误:将varchar数据类型转换为datetime数据类型导致值超出范围
我正在尝试使用表单中的数据将数据输入SQL Server 2008。我正在使用DateTimePicker从表单中选择日期,并将此数据输入db,但是当我尝试运行表单时,出现以下错误: 将varchar数据类型转换为datetime数据类型导致值超出范围。C# 错误:将varchar数据类型转换为datetime数据类型导致值超出范围,c#,.net,sql-server-2008,C#,.net,Sql Server 2008,我正在尝试使用表单中的数据将数据输入SQL Server 2008。我正在使用DateTimePicker从表单中选择日期,并将此数据输入db,但是当我尝试运行表单时,出现以下错误: 将varchar数据类型转换为datetime数据类型导致值超出范围。 声明已被终止 以下是我表格的代码: private void btnAddBooking_Click(object sender, EventArgs e) { DateTime requested = dtpReque
声明已被终止 以下是我表格的代码:
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);
}
下面是我存储方法的facade中的代码:
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();
可能与运行此操作的机器的区域设置有关,最终传递到insert语句中的日期格式大致如下:
27/09/2012 4:17:42 PM
(我写这篇文章时,这是澳大利亚的当前日期)
SQL Server可能正在尝试将其转换为它使用的任何日期格式,但无法(例如,认为第一个参数是月份,但27大于12)
尝试将日期格式化为YYYY-MM-DD
格式:
2012-09-27
或者更好的方法是使用参数,因为您存在SQL注入漏洞。use,将使您免于SQL注入,也可能解决您的错误。一切都进行得很顺利,直到您决定放弃数据类型并将所有内容都视为字符串。正如@Habib提到的,您应该使用参数。另外,
Transaction
对于一个表来说是一个非常糟糕的名称(就像任何其他关键字一样),当然,但是如果您将它们作为requestedD.ToString(“yyyy-MM-dd”)发送,会发生什么呢?您收到的错误是,SQL Server试图将字符串转换为日期,但结果日期超出范围。我相信这会解决问题。好吧,它检查过了…似乎只有一列使用此错误…其余的日期列正在接收数据,这仍然可能是一个日期转换问题。我仍然认为将格式设置为yyyy MM dd或使用参数是可行的方法。yyyy MM dd
在某些情况下仍然可能模棱两可yyyyMMdd
更安全,不受地区问题的影响。set language british;选择DATEPART(月,转换(datetime,'2012-05-03'))
生成结果3
,而不是5
。(在SQL Server 2005或更早版本上,可以省略CONVERT()
步骤)