Ajax Calendar extende - 在2个日期之间复制SQL数据库结果

时间:2015-03-26 10:42:55

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

使用以下代码我尝试在2个日期之间选择IP地址的唯一访问次数,并在标签中显示结果。我使用Ajax Calendar扩展程序来过滤日期,但它不起作用,我一直试图解决这个问题,因为2天没有机会在互联网上找到完整的东西(PS如果我使用它,查询确实有效在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标签

中实现的错误消息

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

您只需删除参数占位符周围的引号即可。 使用引号占位符成为文字字符串,当然,查询无法检索字符串之间的任何记录&#34; @ StartDate&#34;和&#34; @ EndDate&#34;

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枚举

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

  

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

@EndDate = 2015/03/26 14:37:00大于VisitDate = 2015/03/26 14:36:59,虽然它们在同一天。