将datetime值发送到存储过程

时间:2014-07-13 11:23:01

标签: sql sql-server c#-4.0 stored-procedures

我想将日期发送到存储过程,我写了这个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

问题出在哪里?

2 个答案:

答案 0 :(得分:1)

错误消息说明了下限为1/1/1753,因此,假设您已正确解析输入(30/6/1390),则消息似乎清楚地表明两列start_dateend_date属于datetime类型,其下限为1/1/1753。

因此,要存储年份少于1753的日期,您需要datetime2date列,其下限为1/1/0001

对于两种数据类型

Here a quick reference

您的代码中还有另一个问题。您可以将参数添加到数组中而不指定其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