C# 将Varchar数据类型转换为超出范围的datetime结果
我有问题。我无法识别我的错误C# 将Varchar数据类型转换为超出范围的datetime结果,c#,.net,ado.net,exception-handling,datetime-parsing,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().Tr
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数据类型转换为超出范围的datetime结果
好吧,我会以非常不同的方式处理这项任务:
- 在将日、月和年作为整数后,我肯定不会将它们重新组合在一起并解析它们。只需使用:
// Note the meaningful variable names here, btw... DateTime date = new DateTime(year, month, day);
- 更新数据库时,我不会将值直接放入SQL语句中。改为使用参数化SQL语句,并将参数设置为
。这样,您就不必担心数据库需要与您提供的日期格式不同的日期格式。一般来说,您应该始终使用参数化SQL,而不是将值直接嵌入到SQL中,这样可以避免SQL注入攻击date
现在,在完成所有这些操作之后,如果仍然出现错误,则应该检查要插入的实际数据。可能
项中的数据确实超出了SQL Server的范围。好吧,我将以非常不同的方式处理此任务:
- 在将日、月和年作为整数后,我肯定不会将它们重新组合在一起并解析它们。只需使用:
// Note the meaningful variable names here, btw...
DateTime date = new DateTime(year, month, day);
- 更新数据库时,我不会将值直接放入SQL语句中。改为使用参数化SQL语句,并将参数设置为
date
。这样,您就不必担心数据库需要与您提供的日期格式不同的日期格式。一般来说,您应该始终使用参数化SQL,而不是将值直接嵌入到SQL中,这样可以避免SQL注入攻击
现在,在完成所有这些操作之后,如果仍然出现错误,则应该检查要插入的实际数据。可能项中的数据确实超出了SQL Server的范围。这一定是您指定的格式问题,例如您可能保存的是日期值列而不是月份列。这一定是您指定的格式问题,与“月份”列类似,您可能会保存“日期值”列。因为您没有显示任何输入,所以很难准确查看;然而,以下情况显然是危险的:
DateTime RegExp = Convert.ToDateTime(DtString);
string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";
即使我们忽略了您应该使用参数这一事实(您确实应该这样做),您也需要按照SQL server期望的方式格式化此日期,这可能与本地格式非常不同
但是,;不要费心格式化它!为此使用一个参数,它就会消失。这并不一定很难,例如:
完成了;完全安全,不受注入和(在本例中更可能)将数据格式化为字符串的问题的影响。很难准确地看到,因为您没有显示任何输入;然而,以下情况显然是危险的:
DateTime RegExp = Convert.ToDateTime(DtString);
string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";
即使我们忽略了您应该使用参数这一事实(您确实应该这样做),您也需要按照SQL server期望的方式格式化此日期,这可能与本地格式非常不同
但是,;不要费心格式化它!为此使用一个参数,它就会消失。这并不一定很难,例如:
完成了;完全安全,不受注入和(在本例中更可能)将数据格式化为字符串的问题的影响