2017-04-25 19 views
-1

将nvarchar数据类型转换为日期时间数据类型 会导致超出范围的值。SQL中的例外日期时间

我的代码:

string sqlthem = "INSERT INTO Infosp1 VALUES (@khach,@sp,@sl,@gia,@tg)"; 
     string sqlconvert = "select CONVERT(varchar(20),[Tg], 103) from Infosp1"; 
     SqlCommand cmd = new SqlCommand(sqlthem, con); 
     cmd.Parameters.AddWithValue("Khach", cbbtenkh.Text); 
     cmd.Parameters.AddWithValue("Sp", cbbmahang.Text); 
     cmd.Parameters.AddWithValue("Sl", cbbsl.Text); 
     cmd.Parameters.AddWithValue("Gia", cbbgia.Text); 
     cmd.Parameters.AddWithValue("Tg", datetg.Text);   
     cmd.ExecuteNonQuery(); 

它出现在.ExecuteNonQuery()

PLS

+1

使用正确的类型为您的段米,请在参数实例中指定类型并添加正确类型的值。另请参见[最佳实践 - 执行SQL语句](http://stackoverflow.com/documentation/.net/3589/ado-net/14261/best-practices-executing-sql-statements)。 – Igor

+2

您确实应该确保参数的类型与数据库中列的类型相匹配,并且应该首先在代码中将字符串值解析为DateTime。另请考虑[不使用'AddWithValue'](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) – juharr

+0

您能否显示传递的示例值在'datetg'变量中? – nocodename

回答

0

如果你有你需要的参数转换为datetime日期时间字段。如果你想它进行转换,因为你没有执行这个查询,它不会工作:

string sqlconvert = "select CONVERT(varchar(20),[Tg], 103) from Infosp1"; 

您尝试将没有转化的字符串,从而可能有不正确的格式。

cmd.Parameters.AddWithValue("Tg", datetg.Text); 

尝试创建定义,像这样它的数据类型的SQL参数:

cmd.Parameters.Add("Tg", SqlDbType.DateTime).Value = Convert.ToDateTime(datetg.Text); 

理想情况下,你应该有CultureInfo的地方来解析,而不是

...或致电转化的sql脚本,像这样:

string sqlthem = @"declare @dt datetime 
    select @dt = CONVERT(varchar(20), @tg, 103) 
    INSERT INTO Infosp1 VALUES (@khach,@sp,@sl,@gia,@dt)"; 
+0

感谢您的详细解释。我试过了,它出现这个异常:'附加信息:将varchar数据类型转换为日期时间数据类型导致超出范围的值。' –

+0

尝试使用 DateTime tg; TryParse(datetg.Text,tg out); cmd.Parameters.Add(“Tg”,SqlDbType.DateTime).Value = tg; – barzozwierz

+0

不错。有效。非常感谢 !!! –