Coldfusion:执行包含cfqueryparam的动态查询

Coldfusion:执行包含cfqueryparam的动态查询,coldfusion,refactoring,cfquery,cfqueryparam,Coldfusion,Refactoring,Cfquery,Cfqueryparam,首先是代码。我正在生成一个查询结构: <cfset myQueryStruct = { qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>", qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value

首先是代码。我正在生成一个查询结构:

<cfset myQueryStruct = { 
qone = "select * from t1 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>",
qtwo = "select * from t2 where column = <cfqueryparam cfsqltype='cf_sql_varchar' value='#arguments.a1#'>"
}>

我知道我们可以通过在内部使用梯形图来实现这一点,但我的问题是,我们可以像我提到的那样来实现吗?EDI肯定遗漏了什么,还是在CFML中不可能?

问题是,您传递的字符串带有必须由ColdFusion处理的标记。但是你太晚了。CF已经解析了模板,因此字符串仍然未翻译,因此抛出SQL错误

我不确定,您到底想在这里完成什么,也许类似于以下代码的东西可以工作:

<cfscript>
dsn = "myDatabase";
criteria = "something";
myQueryStruct = {
    qone = "select * from t1 where column = ( :a1 ) ",
    qtwo = "select * from t2 where column = ( :a1 ) "
};

result1 = getQueryResult( queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn );
result2 = getQueryResult( queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn );

public function getQueryResult( queryString, filterValue, dsn ){
    var qry = new Query();
    var qryString = arguments.queryString;
    var queryResult = "";
    qry.setDatasource( arguments.dsn );
    qry.setSQl( qryString );
    qry.addParam( name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar" ); 
    queryResult = qry.execute().getResult();
    return queryResult;
}
</cfscript>

问题是,您传递的字符串带有必须由ColdFusion处理的标记。但是你太晚了。CF已经解析了模板,因此字符串仍然未翻译,因此抛出SQL错误

我不确定,您到底想在这里完成什么,也许类似于以下代码的东西可以工作:

<cfscript>
dsn = "myDatabase";
criteria = "something";
myQueryStruct = {
    qone = "select * from t1 where column = ( :a1 ) ",
    qtwo = "select * from t2 where column = ( :a1 ) "
};

result1 = getQueryResult( queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn );
result2 = getQueryResult( queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn );

public function getQueryResult( queryString, filterValue, dsn ){
    var qry = new Query();
    var qryString = arguments.queryString;
    var queryResult = "";
    qry.setDatasource( arguments.dsn );
    qry.setSQl( qryString );
    qry.addParam( name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar" ); 
    queryResult = qry.execute().getResult();
    return queryResult;
}
</cfscript>

您可以使用cfparam首先建立arguments.a1和数据类型,然后在查询中仅引用变量作为“arguments.a1”。它至少可以帮助您确定是否是cfqueryparam标记导致了问题。

您可以使用cfparam先建立arguments.a1和数据类型,然后在查询中引用变量作为“arguments.a1”。它至少可以帮助您确定是否是cfqueryparam标记导致了问题。

您可能需要查看cfqueryparam的cfscript版本。无法确定,但它看起来可能适用于您正在尝试的操作。使用CFQUERYPARAM是值得称赞的,但是在动态查询中使用它们是困难的。有关解决方案,请参见下面的答案。同时,考虑简单地在CFQueX标签之间输出代码。这就是cfquery的设计目的,也是我实际上更喜欢标记而不是脚本的地方之一,这使得从SQL manager简单地复制并添加绑定变得很容易。您可能需要查看cfqueryparam的cfscript版本。无法确定,但它看起来可能适用于您正在尝试的操作。使用CFQUERYPARAM是值得称赞的,但是在动态查询中使用它们是困难的。有关解决方案,请参见下面的答案。同时,考虑简单地在CFQueX标签之间输出代码。这就是cfquery的设计目的,也是我实际上更喜欢标记而不是脚本的地方之一,这使得简单地从SQL manager复制并添加绑定变得容易。谢谢,Andreas。您认为使用CFML标记可以吗?@Binod为什么不使用脚本?项目没有使用脚本。这就是为什么。我不熟悉CF生态系统。。您对标签和脚本这两种变体有何看法?每个人都有自己的优势,还是一个更优越?谢谢你,安德烈亚斯。您认为使用CFML标记可以吗?@Binod为什么不使用脚本?项目没有使用脚本。这就是为什么。我不熟悉CF生态系统。。您对标签和脚本这两种变体有何看法?每个人都有自己的优势,还是一个更优越?
Invalid CFML construct found on line 1 at column 15.
ColdFusion was looking at the following text:

t1
<cfscript>
dsn = "myDatabase";
criteria = "something";
myQueryStruct = {
    qone = "select * from t1 where column = ( :a1 ) ",
    qtwo = "select * from t2 where column = ( :a1 ) "
};

result1 = getQueryResult( queryString = myQueryStruct[ "qone" ], filterValue = criteria, dsn = dsn );
result2 = getQueryResult( queryString = myQueryStruct[ "qtwo" ], filterValue = criteria, dsn = dsn );

public function getQueryResult( queryString, filterValue, dsn ){
    var qry = new Query();
    var qryString = arguments.queryString;
    var queryResult = "";
    qry.setDatasource( arguments.dsn );
    qry.setSQl( qryString );
    qry.addParam( name="a1", value= arguments.filterValue, cfsqltype="cf_sql_varchar" ); 
    queryResult = qry.execute().getResult();
    return queryResult;
}
</cfscript>