0

我有问题。我无法识别我的错误...

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

4

3 回答 3

3

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

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

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

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

于 2011-07-07T12:15:54.050 回答
2

由于您没有显示任何输入,因此很难准确看到;但是,以下内容显然是危险的:

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

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

于 2011-07-07T12:18:35.220 回答
1

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

于 2011-07-07T12:16:52.267 回答