使用以下代码我尝试在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标签
中实现的错误消息非常感谢你的帮助
答案 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
,虽然它们在同一天。