我有问题。我可以'识别我的错误......
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数据类型转换为超出范围的日期时间
答案 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)
这必须是您指定格式的问题,而不是您可能正在保存日期值列的月份列。