【问题标题】:Ajax Calendar extende - FIltering SQL Database results between 2 datesAjax 日历扩展 - 过滤两个日期之间的 SQL 数据库结果
【发布时间】:2015-03-26 10:42:55
【问题描述】:

使用下面的代码,我试图通过 IP 地址选择 2 个日期之间的唯一访问次数,并在标签中显示结果。我正在使用 Ajax 日历扩展器在日期之间进行过滤,但它不起作用,我从 2 天以来一直在尝试解决这个头痛问题,但没有机会在 Internet 上找到完整的东西(附注:如果我在SSMS 2014 的查询功能):

这是我的 .aspx 页面代码:

<asp:Label ID="Label1" runat="server" Text="Start Date"></asp:Label> <asp:TextBox ID="StartDateTextBox" runat="server"></asp:TextBox> <cc1:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="StartDateTextBox" Format="dd/MM/yyyy" Enabled="True"></cc1:CalendarExtender> <asp:Label ID="Label2" runat="server" Text="End Date"></asp:Label> <asp:TextBox ID="EndDateTextBox" runat="server"></asp:TextBox> <cc1:CalendarExtender ID="CalendarExtender2" runat="server" TargetControlID="EndDateTextBox" Format="dd/MM/yyyy" Enabled="True"></cc1:CalendarExtender> <asp:Button ID="showbtn" runat="server" Text="Button" onclick="showvisits"/> <asp:Label ID="uniquevisits" runat="server" Text=""></asp:Label> <asp:Label ID="failure" runat="server" Text=""></asp:Label>

在后面的代码中:

 Protected Sub showvisits(sender As Object, e As EventArgs) Handles showbtn.Click
    Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString)
    Try
        conn.Open()
        Dim cmd As New SqlCommand("SELECT COUNT (DISTINCT VisitIp) FROM IpStorage WHERE VisitDate BETWEEN '@StartDate' AND '@EndDate')", conn)
        cmd.Parameters.AddWithValue("@StartDate", DateTime.Parse(StartDateTextBox.Text))
        cmd.Parameters.AddWithValue("@EndDate", DateTime.Parse(EndDateTextBox.Text))
        Dim myReader As SqlDataReader = cmd.ExecuteReader()
        While myReader.Read()
            uniquevisits.Text = myReader("VisitIp").ToString()
        End While
        myReader.Close()
    Catch ex As SqlException
        failure.Text = "ERROR"
    Finally
        conn.Close()
    End Try
End Sub

你知道上面的代码有什么问题吗?

没有抛出特定错误,但我在上面在 failure.Text 标签中实现的错误消息

非常感谢您的帮助

【问题讨论】:

    标签: asp.net vb.net date asp.net-ajax calendarextender


    【解决方案1】:

    您只需要删除参数占位符周围的引号。 使用引号,占位符变为文字字符串,当然,查询无法检索字符串“@StartDate”和“@EndDate”之间的任何记录

    Dim cmd As New SqlCommand("SELECT COUNT (DISTINCT VisitIp) " & _ 
                              "FROM IpStorage " & _ 
                              "WHERE VisitDate " & _ 
                              "BETWEEN @StartDate AND @EndDate", conn)
    

    @EndData 参数后面还有一个不需要的右括号,它不是必需的,并且在 T-SQL 引擎解析此查询时会导致语法错误。

    要严格控制的另一点是 AddWithValue 的使用。虽然它是一个方便的快捷方式,但它有严重的缺点,如本文所述

    Can we stop using AddWithValue already?

    所以

    cmd.Parameters.Add("@StartDate", SqlDbType.Date).Value = DateTime.Parse(StartDateTextBox.Text)
    cmd.Parameters.Add("@EndDate", SqlDbType.Date).Value = DateTime.Parse(EndDateTextBox.Text)
    

    特别注意SqlDbType 枚举以用于您的表列类型

    最后请记住,如果您的数据库字段包含时间部分,则 BETWEEN 表达式可能会产生不完整的结果。

    如果 test_expression 的值大于 BETWEEN,则返回 TRUE 或等于 begin_expression 的值且小于或等于 end_expression 的值。

    @EndDate = 2015/03/26 14:37:00VisitDate = 2015/03/26 14:36:59 大,尽管它们是在同一天。

    【讨论】:

    • 嗨史蒂夫,谢谢你,但即使我从占位符中删除引号,查询仍然失败。还有什么可能是错的?请注意,我的“VisitDate”列是日期数据类型,当我直接查询数据库时,我需要按如下方式查询它:SELECT COUNT (DISTINCT VisitIp) FROM IpStorage WHERE VisitDateAndTime BETWEEN '2015/03/23' AND '2015/03 /25',即我需要颠倒年份和日期的顺序。请问还有什么建议吗?
    • 我不会使用 AddWithValue,而是尝试使用准系统 Add。 AddWithValue 使用参数值推断要传递给数据库引擎的类型,这可能会导致错误的决策。 (尤其是日期)
    • 难以置信,仍然失败。我将 AddWIthValue 修改如下: cmd.Parameters.Add("@StartDate", SqlDbType.Date).Value = DateTime.Parse(StartDateTextBox.Text) cmd.Parameters.Add("@EndDate", SqlDbType.Date).Value = DateTime.Parse(EndDateTextBox.Text)
    • 你说你在失败标签中得到错误文本吗?然后打印 ex.Message 的内容而不是通用文本。
    • 谢谢史蒂夫,好主意。前消息说:26/03/2015 14:17:32:')' 附近的语法不正确。这很奇怪,因为应用程序没有指出任何语法错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多