C#DateTime不适用于MSSQL存储过程

时间:2015-02-26 16:29:24

标签: c# jquery sql-server datetime stored-procedures

HTML

<asp:TextBox ID="startDate" runat="server" </asp:TextBox>

<asp:TextBox ID="endDate" runat="server"></asp:TextBox>

<asp:Button ID="btnSearch" runat="server" Text="search" OnClick="btnSearch_Click"/>

Datepicker Js / Jquery

 $("#startDate").datepicker(
            {
                onSelect: function (date) {
                    var date1 = $('#startDate').datepicker('getDate');
                    var date = new Date(Date.parse(date1));
                    date.setDate(date.getDate() + 0);
                    var newDate = date.toDateString();
                    newDate = new Date(Date.parse(newDate));
                    $('#endDate').datepicker("option", "minDate", newDate);
                },
                onClose: function (dateText, inst) {
                    $(this).datepicker('option', 'dateFormat', 'dd.mm.yy');
                },
            });

        $("#endDate").datepicker({
            onClose: function (dateText, inst) {
                $(this).datepicker('option', 'dateFormat', 'dd.mm.yy');
            },
        });

Asp.net CodeBehind

protected void btnSearch_Click(object sender, EventArgs e)
{
    startDate.Text = Request.Form[startDate.UniqueID]; // I get startDate
    endDate.Text = Request.Form[endDate.UniqueID]; // I get endDate

    spGetReport(Tools.AbsoluteStart(Convert.ToDateTime(startDate.Text)),
    Tools.AbsoluteEnd(Convert.ToDateTime(endDate.Text)));
}

存储过程参数类

 private DataSet spGetReport(DateTime startDate, DateTime EndDate)
 {
     // Connection settings here.. no code for simple question

     SqlCommand scmd = new SqlCommand();
     scmd.CommandText = "sp_Report";

     scmd.Parameters.Add("@startDate", SqlDbType.DateTime);
     scmd.Parameters["@startDate"].Value = startDate;
     scmd.Parameters.Add("@EndDate", SqlDbType.DateTime);
     scmd.Parameters["@EndDate"].Value = EndDate;

     // etc...
 }

帮助程序类,以获得一天的最短日期时间和最长日期时间。

/// gets 00:00:00 of a day
public static DateTime AbsoluteStart(DateTime dateTime)
{
    return dateTime.Date;
}

/// gets 23:59:59 of a day
public static DateTime AbsoluteEnd(DateTime dateTime)
{
    return dateTime.Date.AddDays(1).AddSeconds(-1);
}

存储过程

ALTER  procedure [dbo].[sp_Report] 
(
   @startDatedatetime,
   @EndDate datetime
)
as

select * from MyTable where startDAteColumn between CAST(@startDate AS VARCHAR(100) and CAST(@EndDateAS VARCHAR(100)

注意: 存储已编程的作品。

我有非常复杂的存储过程查询,这就是为什么我在&#34; Store Procedured&#34;中显示简单代码的原因。部分。问题在于搜索数据。当我在 startdate enddate 之间搜索数据时,数据永远不会正确,因为存在问题从c#asp.net代码后面强制转换发送参数。我认为由于在sql端进行转换而出现问题。我无法在sql端更改强制转换。我必须在后面的asp.net代码中更改它。

或者

无论你能提出什么建议,我都可以申请。我在asp.net代码隐藏中错过了什么?

感谢。

1 个答案:

答案 0 :(得分:1)

让我们在这里向后工作 - 你的存储过程永远不会工作,你没有为where指定一个字段,它有2个缺少紧密的括号。

select * from MyTable 
where between CAST(@startDate AS VARCHAR(100) and CAST(@EndDateAS VARCHAR(100)

应该是

select * from MyTable 
where SOMEFIELD between CAST(@startDate AS VARCHAR(100)) and CAST(@EndDateAS VARCHAR(100))

此外,使用日期时BETWEEN关键字必须是实际日期 - 转换为VARCHAR的日期不太可能有效。

接下来,使用Convert.ToDateTime(startDate.Text)是一种容易出错的方式,可以从字符串转换为日期。相反,您应该调用DateTime.ParseExact(或更恰当地TryParseExact)来指定要使用的格式。