0

aの中に、を大きな値にcffunction設定してキャッシュを長くしたいクエリがあります。cachedwitinただし、いくつかの状況では、そのキャッシュもクリアしたいと思います。

私はこれを多くの場所で行ってきましたが、そのうちの1つではキャッシュが更新されることはなく、キャッシュされた値を提供するように依頼すると、常に元の値を取得します。

cfqueryのドキュメントには次のように記載されています。

キャッシュされたデータを使用するには、現在のクエリで同じSQLステートメント、データソース、クエリ名、ユーザー名、およびパスワードを使用する必要があります。

これはクエリの場合です。これは、cfqueryparam;以外の非SQLを含まない単一のSQLステートメントであるためです。データソースとクエリ名は変更されず、ユーザー名とパスワードは指定されません。

関連するコードは次のとおりです。

<!--- Long cache the query since the values rarely change, but allow the cache to be cleared. --->
<cfif Arguments.ClearCache EQ false>
    <cfset local.CachedWithin = CreateTimeSpan(7,0,0,0)>
<cfelse>
    <cfset local.CachedWithin = CreateTimeSpan(0,0,0,-1)>
</cfif>

<cfquery name="local.qryName" datasource="#Variables.DSN#" cachedwithin="#local.CachedWithin#">
    SELECT
        [User].[Name]
    FROM
        [User]
    WHERE
        [User].[UserID] = <cfqueryparam value="#Arguments.UserID#" cfsqltype="cf_sql_integer">
</cfquery>

なぜこれは他の場所で機能するのに、ここでは機能しないのですか?

4

1 に答える 1

1

ドキュメントに記載されていない、キャッシュされたクエリには追加の「同一性」要件があります。そのメモは次で終わる必要があります:

...パスワード、およびcfqueryparam値の基になるデータ型。

Arguments.UserIDがデータ型に強制されるようにコードを変更します。あなたの場合、これはcfqueryの前に次のコードを置くことで達成できます。

<!--- Make sure data types used in query are consistent --->
<cfset local.UserID = Int(Arguments.UserID)>

cfqueryparam値をに変更しますvalue="#local.UserID#"

上記をドキュメントの省略として表現しましたが、代わりにCF9のバグであると思われます。

于 2012-09-07T16:18:27.497 に答える