将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数据类型转换为日期时间导致超出范围

将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 });

;完全避免了注入和(在这种情况下更有可能)将数据格式化为字符串的问题。

这一定是您指定的格式的问题,就像您可能保存日期值列而不是月份。