【问题标题】:When to close the result set (Basic ODBC question)何时关闭结果集(基本 ODBC 问题)
【发布时间】:2010-11-28 11:13:55
【问题描述】:

我正在为本地公司做一些小项目,以下代码在我的机器上运行良好,但在他们的服务器上产生错误。目前我没有访问该服务器的权限,而且这不是我很了解的领域,所以我不得不问你们。

页面是用经典的 ASP(用于脚本的 javascript)编写的。 逻辑是这样的:

conn.Open("myconnection");
bigQuery = "...";
rs = conn.execute(bigQuery);
while (!rs.eof) {
    ...
    smallQuery = "..."
    rssmall = conn.execute(smallQuery);
    ...
    rssmall.close();
    ...
    rs.movenext();
}
rs.close();
conn.close();

正如我所说,这在我的机器上运行良好,但它会在公司的服务器上返回一些错误(最糟糕的是我什至不知道是什么错误)如果 bigQuery 返回超过 ~20 行。我的代码有问题吗(这真的不是我的领域,但我想像这样在循环中收集数据是可以的?),或者他们的 IIS 服务器有问题。

谢谢。

编辑: 更多信息: 它是 Access 数据库。一切都很标准:

conn=Server.CreateObject("ADODB.Connection");
conn.Provider="Microsoft.Jet.OLEDB.4.0";
conn.Open("D:/db/testingDb.mdb");

查询有点长,所以我不会发布它们。它们是完全普通的选择,所以它们不是问题。

【问题讨论】:

  • 您的基本逻辑看起来不错,而且它在本地计算机上执行的事实暗示它可能是客户端计算机上的配置问题,但更多信息会有所帮助。你用的是什么数据库?您的连接字符串是什么样的? SELECT 语句是什么样的?他们将不得不告诉你错误信息是什么! (许多客户没有意识到软件开发人员不会远程读心;-)。
  • 好的,谢谢。我只需要确认基本逻辑没问题。我更新了问题,但我几乎可以肯定他们设法将咖啡洒在服务器上或类似的东西上:)

标签: sql iis asp-classic odbc resultset


【解决方案1】:

我有一个我继承的遗留 Classic ASP 应用程序,它非常相似(大查询与在循环中运行的其他查询检索第一个查询的结果)运行良好,直到返回 40 条或更多记录。我“解决”问题的方法是实例化另一个连接对象来运行另一个查询。所以使用你的伪代码,试试 --

conn.Open("myconnection");
conn2.Open("myconnection")

bigQuery = "...";
rs = conn.execute(bigQuery);
while (!rs.eof) {
    ...
    smallQuery = "..."
    rssmall = conn2.execute(smallQuery);
    ...
    rssmall.close();
    ...
    rs.movenext();
}
rs.close();
conn2.close();
conn.close();

【讨论】:

  • 是的,这解决了问题。奇怪的。有谁知道为什么会这样?是每个 ADODB 连接的情况,还是只有经典的 ASP?非常感谢。你为我节省了很多时间。
【解决方案2】:

他们实际运行的是什么服务器?

大多数较新版本的 Windows Server 实际上根本不附带 64 位的 Jet 4.0 驱动程序,因此如果您的应用程序作为 64 位应用程序运行,您就不能将访问数据库与该驱动程序一起使用。您可以尝试以 32 位运行,这可能会解决问题。

有一个alternative driver 打包为一个办公组件,这可能是一个选项。

尝试编写一个简单的测试页面,像这样打开和关闭数据库连接:

<%
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Open("D:/db/testingDb.mdb")

Response.Write("Database Opened OK")

conn.Close()

%>

在生产服务器上运行它,如果你看到Database Opened OK,那么你就会知道这肯定是查询而不是数据库导致了问题。

如果您在尝试打开数据库时遇到错误,那么您需要更改为使用较新的驱动程序或在 32 位模式下尝试应用程序

如果是查询导致问题,那么您可能需要使用 Open() 方法的各种附加参数来尝试使用不同的游标(仅在您只需要迭代时转发结果一次),这将改变 ADODB 检索数据的方式,并有望解决与查询相关的任何性能瓶颈。

编辑

如果您想尝试更多地调试代码,请在文件开头添加以下内容。这会导致 ASP 脚本处理器即使遇到错误也会继续运行

On Error Resume Next

然后在整个文件中您预计可能会发生错误的时间间隔做

If Err <> 0 Then
    Response.Write(Err.Number & " - " & Err.Description)
End If

有关 ASP 和 VBScript 中错误处理的基础知识,请参阅来自 ASP 101 的 this 文章

【讨论】:

  • 感谢您的回答。打开连接不是问题。正如我在问题中所说,一切运行正常,直到数据库中有超过 20 个条目。我不确定哪种错误与查询的返回条目数有关?我知道这是一个非常令人困惑的问题,因为我什至无法提供错误描述。明天我会去那里,如果问题仍然存在,我会告诉你们更多关于问题的信息(我想重新启动 IIS 就可以完成这项工作:))
  • @Klark:在调试此类问题时,Ctrl-Alt-Del 通常是第一个尝试的好方法。
  • 添加了一些您可以添加的代码,以便从您的代码中获得有意义的错误消息
猜你喜欢
  • 2011-12-15
  • 2010-09-11
  • 2014-04-14
  • 1970-01-01
  • 2012-05-18
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多