Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:将varchar数据类型转换为datetime数据类型导致值超出范围_C#_.net_Sql Server 2008 - Fatal编程技术网

C# 错误:将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

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

将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);
}
下面是我存储方法的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()
步骤)