2

CF がエラーをスローするたびに、すべての例外情報が記載された電子メールを受け取ります。データベース エラーが発生するたびに、SQL、WHERE、QueryError の情報を取得できます。

SQL  SELECT FooID FROM FooTable WHERE FooID = (param 1)
WHERE    (param 1) = [type='IN', class='java.lang.Integer', value='47', sqltype='CF_SQL_INTEGER'] 
Error   [Macromedia][SQLServer JDBC Driver][SQLServer]Insufficient clearance to break temporal directive.

ただし、それが複数の cfqueryparams を持つ特定の長い複雑なクエリである場合、MSSQL を介して同じクエリを実行するために params を検索して置換するのは面倒です。私は常に、クエリ ウィンドウからすばやく実行できるように、コピー可能なクエリ行をプログラムでインクルードできるようにしたいと考えていました。

4

1 に答える 1

2

コピー可能なクエリ行を作成するために、このヘルパー関数を最終的に作成しました。

<cffunction name="limnSQLDump" output="no" access="public" returntype="string">
        <cfargument name="sql" required="yes" type="string">
        <cfargument name="params" required="yes" type="string">
        <cfset var arrParam = ListToArray(arguments.params, ' , ', false, true)> <!--- Arrayify Dat Param String --->
        <cfset var sub = StructNew()>
        <cfset var objParam = StructNew()>

        <cfloop from="1" to="#ArrayLen(arrParam)#" index="i"> <!--- Loop through each param string --->
            <cfset arrParam[i] = REReplace(arrParam[i], '\(param \d+\) = \[([^\]]+)\]', '\1', 'all')> <!--- Scoop out the meat --->
            <cfset sub = REFind("([^=, ]+)='([^']*)'", arrParam[i], 1, true)> <!--- Prep For Surgery --->
            <cfset objParam = StructNew()> <!--- Preheat oven --->

            <cfloop condition="#sub.pos[1]#"> <!--- Surgically get Key/Value --->
                <cfset objParam[Mid(arrParam[i], sub.pos[2], sub.len[2])] = Mid(arrParam[i], sub.pos[3], sub.len[3])>
                <cfset sub = REFind("([^=, ]+)='([^']*)'", arrParam[i],  sub.pos[1]+sub.len[1], true)>
            </cfloop>

            <!--- Serve (Feeds 3) --->
            <cfset sql = REReplace(sql, '\(param '&i&'\)', (objParam.class NEQ 'java.lang.Integer' ? "'"&objParam.value&"'" : objParam.value))>
        </cfloop>

        <cfreturn sql>
    </cffunction>

これに落ち着く前に、無数のさまざまなルートを自分自身で経験したので、フィードバックをいただければ幸いです(具体的なものから抽象的なものへ、またその逆へ)。最後に、param 文字列全体を配列に分割し (基本的には配列です)、正確なパラメーターを正規表現し、文字列全体をそれで置き換えてから、パラメーターをループしてオブジェクトを同等にすることにしました。 SQL 文字列を置換するときに、REReplace で明確に参照できます。

<cfset arrParam[i] = Evaluate("{"&arrParam[i])&"}">個人的には、括弧を除いて、param の内容が基本的にインライン オブジェクトであることを考えると、単純に似たようなことができればよかったのにと思います。

于 2013-08-08T18:58:17.610 に答える