ASP.NET如何查询展示数据库中日期为当日的记录并统计行数
问题背景
需要统计SQL Server数据库APPOINT表中日期为当日的记录行数,原有VB.NET代码存在安全隐患与逻辑错误,无法稳定得到正确统计结果。
原有代码核心问题
- 直接将日期变量拼接进SQL语句,存在SQL注入风险,且日期字符串格式受服务器区域设置影响,极易出现格式不匹配导致的SQL执行错误、统计结果偏差
- 直接用等号匹配日期,若
A_DATE字段为带时分秒的datetime类型,仅能匹配当日0点0分0秒的记录,会漏掉当日其余所有时段的数据 - 未手动释放数据库连接、Command对象资源,频繁调用会耗尽数据库连接池,导致服务异常
正确实现代码
' 生产环境建议将连接字符串统一配置在web.config中,方便维护 Dim connectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\SUJAY GHOSH\Documents\Visual Studio 2010\WebSites\DateTest\App_Data\Database.mdf;Integrated Security=True;User Instance=True" Dim todayAppointCount As Integer Using con As New SqlConnection(connectionString) con.Open() Dim querySql As String = "SELECT COUNT(*) FROM APPOINT WHERE A_DATE >= @TodayStart AND A_DATE < @NextDayStart" Using cmd As New SqlCommand(querySql, con) ' 传入当日零点时间作为范围起点 cmd.Parameters.AddWithValue("@TodayStart", DateTime.Today) ' 传入次日零点时间作为范围上限(不包含) cmd.Parameters.AddWithValue("@NextDayStart", DateTime.Today.AddDays(1)) todayAppointCount = Convert.ToInt32(cmd.ExecuteScalar()) End Using End Using Label2.Text = todayAppointCount.ToString()
关键优化说明
- 采用参数化查询,从根源避免SQL注入问题,同时由框架自动处理日期类型的格式适配,无需手动拼接日期字符串,兼容不同服务器的时间格式配置
- 采用时间区间匹配逻辑替代等号判断,无论
A_DATE字段是纯date类型还是带时分秒的datetime类型,都能100%覆盖当日所有记录,不会出现漏统计 - 通过
Using块包裹数据库连接、命令对象,执行完成后自动释放非托管资源,避免数据库连接泄漏问题
内容的提问来源于stack exchange,提问作者Sujay Ghosh
相关产品推荐
相关产品推荐

