如何在循环中执行多条SQL查询?按月查询数据遇阻求助
解决整月数据查询的循环报错问题
兄弟,你这明显踩了两个典型的坑:一是完全没必要循环每天查数据库(既低效又容易出对象复用问题),二是对ADODB.Recordset的状态管理没做好。咱们一步步来解决:
先搞懂你遇到的两个错误原因
- 用
cn_body.execute时报错800a0e78:这个错误是因为execute执行后,如果当天没有匹配数据,rs_Results对象会保持关闭状态,后续直接操作它就会触发“不允许操作关闭的对象”的提示。 - 用
rs_Results.open循环两次报错800a0e79:第一次open后,rs_Results处于打开状态,第二次循环直接调用open同一个对象就会冲突——ADODB不允许在对象打开时重复执行open操作。
最优解决方案:直接查询整月数据(完全不用循环)
循环每天查数据库是非常低效的做法,直接构造日期范围查询,一次SQL就能搞定整月数据,还能彻底避免Recordset的状态问题,同时自动处理所有月份的天数(包括2月的28/29天)。
代码示例
Set rs_Results = Server.CreateObject("ADODB.Recordset") ' 计算指定年月的第一天和最后一天 Dim firstDay, lastDay firstDay = CDate(year_num & "-" & month_num & "-01") ' 最后一天 = 下个月第一天减1天(自动适配所有月份天数) lastDay = DateAdd("d", -1, DateAdd("m", 1, firstDay)) ' 构造整月查询的SQL(如果是SQL Server数据库,日期用'包裹;Access用#) strSQL_CIP_Date = "SELECT * FROM data_storage WHERE creation_date >= #" & firstDay & "# AND creation_date <= #" & lastDay & "#" ' 执行查询 rs_Results.Open strSQL_CIP_Date, cn_body, 1, 1 ' 处理查询结果 If Not rs_Results.EOF Then Do While Not rs_Results.EOF ' 这里替换成你要输出的字段,比如: ' response.write "创建日期:" & rs_Results("creation_date") & " | 内容:" & rs_Results("content") & "<br>" rs_Results.MoveNext Loop Else response.write "该月份没有数据" End If ' 用完记得关闭并释放对象(好习惯) rs_Results.Close Set rs_Results = Nothing
为什么这个方案更好?
- 只需要一次数据库查询,大幅减少数据库连接开销;
- 自动处理所有月份的天数,不用再手动判断30/31天的月份;
- 彻底避免了循环中Recordset状态冲突的问题。
如果非要保留循环方式(不推荐)
如果你因为特殊需求必须循环每天查询,那一定要每次循环前关闭Recordset,确保对象处于关闭状态后再重新打开:
Set rs_Results = Server.CreateObject("ADODB.Recordset") ' 注意:你的原代码里少了一个Or,这里补上了 If month_num = 4 Or month_num = 6 Or month_num = 9 Or month_num = 11 Then For day_counter = 1 To 30 search_date = cDate(day_counter & "-" & month_num & "-" & year_num) converted_date = Clng(search_date) strSQL_CIP_Date = "SELECT * FROM data_storage WHERE creation_date=" & converted_date ' 关键步骤:每次循环前检查并关闭Recordset If rs_Results.State = 1 Then ' 1代表adStateOpen,没定义常量就直接用数字 rs_Results.Close End If ' 重新打开查询 rs_Results.Open strSQL_CIP_Date, cn_body, 1, 1 ' 处理当天的结果 If Not rs_Results.EOF Then response.write "日期 " & search_date & " 的数据:<br>" Do While Not rs_Results.EOF ' 输出你的数据字段 ' response.write rs_Results("字段名") & "<br>" rs_Results.MoveNext Loop Else response.write "日期 " & search_date & " 没有数据<br>" End If response.write day_counter & " " & strSQL_CIP_Date & "<br><br>" Next End If ' 最后清理对象 rs_Results.Close Set rs_Results = Nothing
内容的提问来源于stack exchange,提问作者RUCK FULES
相关产品推荐
相关产品推荐

