Sql 向存储过程发送日期时间值

Sql 向存储过程发送日期时间值,sql,sql-server,c#-4.0,stored-procedures,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(p

我只想将日期发送到存储过程,我编写了以下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溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日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

问题出在哪里?

错误消息谈到了1/1/1753的下限,因此,假设您已正确解析输入30/6/1390,则该消息似乎清楚地表明两列开始日期和结束日期的类型为DateTime,其下限为1/1/1753

因此,要存储年份小于1753的日期,需要datetime2或date列的下限为1/1/0001

对于这两种数据类型

代码中还有另一个问题。将参数添加到数组中而不指定它们的SqlDbType,这样,日期就被添加为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());
 }

我通过改变我的方式找到我的答案
我使用并存储了varchar。

我建议您查看DateTime.Parse和DateTime.TryParse方法。当您调试应用程序时,这两个参数的值是什么?例如30/6/1390 12:00:00 AMB0Andrew:for DateTime.Parse说同样的错误。1390?您需要datetime2列存储过程接收日期参数,但两个datatable列start_date和end_date的数据类型是什么?Steve:SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间。我是通过更改方式找到的。我使用波斯日历类并通过varchar存储它们。存储日期时间的方法不正确。如果您需要搜索该列,会发生什么情况?一团糟。不过我明白你的问题。这是构建参数的方式。如果不指定类型,将创建DateTime类型而不是DateTime2的参数。我将用我的发现更新答案