将Varchar数据类型转换为超出范围的日期时间结果

时间:2011-07-07 12:12:04

标签: c# .net ado.net exception-handling datetime-parsing

我有问题。我可以'识别我的错误......

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

3 个答案:

答案 0 :(得分:3)

好吧,我会以非常不同的方式完成任务:

  • 将日,月,年作为整数后,我绝对不会将它们重新组合在一起并解析它们。只需使用:

    // Note the meaningful variable names here, btw...
    DateTime date = new DateTime(year, month, day);
    
  • 更新数据库时,我不会将值直接放入SQL语句中。请改用参数化的SQL语句,并将参数设置为date。这样您就不必担心数据库需要与您提供的日期格式不同的日期格式。通常,您应该始终使用参数化SQL,而不是将值直接嵌入到SQL中 - 除了帮助解决这种情况,它还可以避免SQL注入攻击。

现在,完成所有这些操作之后,如果您仍然遇到错误,则应该检查您尝试插入的实际数据。也许Items中的数据确实 超出了SQL Server的范围。

答案 1 :(得分:2)

很难看到完全因为你没有显示任何输入;但是,以下内容显然是危险的:

DateTime RegExp = Convert.ToDateTime(DtString);

string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";

即使我们掩盖了你应该使用参数(你真的应该)的事实,你需要按照SQL服务器期望的方式格式化这个日期 - 这可能与本地格式非常不同。

然而;不要格式化它!使用一个参数,它会消失。这不需要很难 - 例如with 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 });

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

答案 2 :(得分:1)

这必须是您指定格式的问题,而不是您可能正在保存日期值列的月份列。