我想将日期发送到存储过程,我写了这个C#代码:
string[] pr = { "/" };
string[] s = txtStartDate.Text.Split(pr, StringSplitOptions.None);
term.Start_date = new DateTime(Convert.ToInt32(s[0]), Convert.ToInt32(s[1]), Convert.ToInt32(s[2])).Date;
s = txtEndDate.Text.Split(pr, StringSplitOptions.None);
term.End_date = new DateTime(Convert.ToInt32(s[0]),Convert.ToInt32(s[1]),Convert.ToInt32(s[2])).Date;
我将它发送到存储过程,如下所示:
public bool AddNewTerm(Term term)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter ("@termName",term.TermName),
new SqlParameter ("@start_date",term.Start_date),
new SqlParameter ("@end_date",term.End_date)
};
return SqlDBHelper.ExecuteNonQuery("AddNewTerm", CommandType.StoredProcedure, parameters);
}
但是当它转到存储过程时说:
SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
我看到其他话题,但他们无法帮助我
这是存储过程代码:
ALTER PROCEDURE dbo.AddNewTerm
(
@termName varchar(50),
@start_date date,
@end_date date
)
AS
insert into term(termName, start_date, end_date)
values(@termName, @start_date, @end_date)
RETURN
问题出在哪里?
答案 0 :(得分:1)
错误消息说明了下限为1/1/1753,因此,假设您已正确解析输入(30/6/1390),则消息似乎清楚地表明两列start_date
和end_date
属于datetime
类型,其下限为1/1/1753。
因此,要存储年份少于1753的日期,您需要datetime2
或date
列,其下限为1/1/0001
您的代码中还有另一个问题。您可以将参数添加到数组中而不指定其SqlDbType,并且以这种方式将Date添加为DateTime参数,当然这些参数当然不能接受低于1/1/1753的值。您的特定代码的解决方法可能是。
public bool AddNewTerm(Term term)
{
List<SqlParameter> parameters = new List<SqlParameter>()
{
new SqlParameter("@termName",SqlDBType.VarChar, 50) {Value = term.TermName},
new SqlParameter("@start_date",SqlDBType.DateTime2, 0) {Value = term.Start_Date},
new SqlParameter("@end_date",SqlDBType.DateTime2, 0) {Value = term.End_Date},
};
return SqlDBHelper.ExecuteNonQuery("AddNewTerm", CommandType.StoredProcedure, parameters.ToArray());
}
答案 1 :(得分:1)
我通过改变方式找到答案
我使用了PersianCalendar Class并将其存储为varchar
。