将Varchar数据类型转换为日期时间导致超出范围
本文关键字:范围 时间 日期 Varchar 数据 类型转换 | 更新日期: 2023-09-27 18:01:31
我有问题。我不能识别我的错误…
int dt = Convert.ToInt32(Items.Rows[T1]["F14"].ToString().Trim());
int mn = Convert.ToInt32(Items.Rows[T1]["F15"].ToString().Trim());
int yr = Convert.ToInt32(Items.Rows[T1]["F16"].ToString().Trim());
string DtString = mn.ToString().Trim() + "/" + dt.ToString().Trim() + "/" + yr.ToString().Trim();
DateTime RegExp = Convert.ToDateTime(DtString);
exp_date is datetime field in sqlserver.
string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";
但是我得到错误:
将Varchar数据类型转换为日期时间导致超出范围
嗯,我会用非常不同的方式来处理这个任务:
-
在得到日、月和年作为整数之后,我肯定不会将它们粘在一起并解析它们。只使用:
// Note the meaningful variable names here, btw... DateTime date = new DateTime(year, month, day);
-
在更新数据库时,I 不会将值直接放入SQL语句中。请使用参数化的SQL语句,并将参数设置为
date
。这样,您就不必担心数据库期望使用与您提供的日期格式不同的日期格式。一般来说,您应该始终使用参数化的SQL,而不是将值直接嵌入到SQL中-以及帮助处理这种情况,它避免了SQL注入攻击。
现在,在之后做了所有这些,如果你仍然得到一个错误,你应该检查你试图插入的实际数据是什么。也许Items
中的数据真的是超出SQL Server的范围
很难准确地看到,因为您没有显示任何输入;然而,下面的语句显然是危险的:
DateTime RegExp = Convert.ToDateTime(DtString);
string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";
即使我们掩盖了你应该使用参数的事实(你真的应该),你也需要按照SQL server期望的方式格式化这个日期——这可能与本地格式非常不同。
然而;不要费心格式化它!使用一个参数,它就会消失。这并不需要很难-例如dapper:
DateTime RegExp = new DateTime(yr, mn, dt);
connection.Execute("UPDATE MyTable SET exp_date=@exp where MyTable.id_no=@id",
new { exp = RegExp, id = AlmIDNo });
;完全避免了注入和(在这种情况下更有可能)将数据格式化为字符串的问题。
这一定是您指定的格式的问题,就像您可能保存日期值列而不是月份。