sql-server - 可复制的 Coldfusion SQL 异常

标签 sql-server coldfusion

每当 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 运行相同查询会变得很麻烦。我一直希望能够以编程方式包含可复制的查询行,以便我可以通过查询窗口快速运行它。

最佳答案

我终于创建了这个辅助函数来构建可复制的查询行:

<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>

任何反馈都将不胜感激,因为在我解决这个问题之前,我自己经历了无数不同的路线(从具体到抽象,然后再返回)。最后,我决定将整个参数字符串分解为一个数组(毕竟基本上是一个数组),正则表达式精确的参数并用它替换整个字符串,然后循环遍历参数并使对象等效,以便在对 SQL 字符串进行替换时,可以使用 REReplace 清楚地引用它。

我个人希望能够做类似 <cfset arrParam[i] = Evaluate("{"&arrParam[i])&"}"> 的事情考虑到,除了括号之外,参数内容基本上是一个内联对象。

关于sql-server - 可复制的 Coldfusion SQL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18133942/

相关文章:

sql - 检查选择查询在 SQL Server 存储过程中是否有结果

SQL 服务器 : SELECT rows using ROW_NUMBER and CASE statement

c# - 我可以从 InvalidConstraintException 中检索受影响的约束吗?

coldfusion - 当我们在 ColdFusion 中使用 API 调用(POST 请求)将参数数量传递到服务器时,如何修复 'POST request Exceeded' 错误?

amazon-web-services - 如何为 AWS 签名版本 4(在 ColdFusion 中)派生登录 key ?

java - 在 Windows 服务器上使用 Coldfusion\Java 创建 TAR 文件 (tarball)

svn - Coldfusion 部署的最佳实践

sql-server - 合并名字和姓氏并更新为每行的全名列

sql-server - 如何理解SQL Server中的Principal?

coldfusion - 多个 ColdFusion 应用程序使用同一个客户端变量存储是不是一个坏主意?