cfquery:找不到句柄x的预处理语句

时间:2013-07-26 17:03:34

标签: coldfusion

我们间歇性地收到以下错误,但通常是:

Error Executing Database Query. [Macromedia][SQLServer JDBC Driver][SQLServer]Could not find prepared statement with handle 1.

我实现了我能够找到的这个问题的两个解决方案 -

  1. 在查询末尾加一个分号(据说强制重新编译查询)
  2. 将此MS-SQL放在查询末尾:OPTION (RECOMPILE)
  3. 我已应用修复1,错误在当天的剩余时间内停止。第二天错误又回来了。

    我应用了修复2并且发生了同样的事情 - 直到第二天再没有错误。

    我确实理解每当我使用<cfqueryparam>时,会自动使用预准备语句,但是每次使用查询时都没有办法强制db“重新准备”而不依赖于缓存的语句?

    请注意,我没有此Cf服务器的管理员权限。

    Cf版本是9.0.0

    SQL Server 9.0.3054。

    违规查询:

    <cfquery datasource="#dsn#" name="q" maxrows="1">
    SELECT
    ID
    FROM
    tableOne
    WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.ID#">
    ORDER BY ID
    </cfquery>
    

    由于

3 个答案:

答案 0 :(得分:1)

关于您的错误:在#dsn#的值从一个请求更改为下一个请求之前,我已经看到了该错误。 如果不是这种情况,请尝试应用您的CF更新,因为您仍然使用9.0.0。

关于您的问题:Set&#34; Max Pooled Statements&#34;这将要求CF每次重新准备声明。此外,取消选中&#34;维护连接&#34;还需要重新编译,因为每次请求都会重新协商与DB的连接。

同样是技术说明,无论您在CF中执行什么操作,SQL Server都将始终缓存执行计划。 CF只是持有该预处理语句的句柄,因此它不必每次都通过网络传递SQL。

答案 1 :(得分:1)

您可以将CachedWithin属性设置为cfquery语句..

<cfquery 
    name="GetParks" datasource="#dsn#" name="q" maxrows="1" 
    cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#">

以上示例将始终将查询保留在缓存之外

答案 2 :(得分:0)

这可能听起来很愚蠢,但你是否认为maxrows属性可能会导致你的痛苦。尝试使用TOP,看看会发生什么。

<cfquery datasource="#dsn#" name="q">
SELECT TOP 1
ID
FROM
tableOne
WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.ID#">
ORDER BY ID
</cfquery>