【问题标题】:conditional query in coldfusionColdfusion中的条件查询
【发布时间】:2015-02-06 13:21:01
【问题描述】:

我需要在表格的最后一列中提供表格中项目的一些状态。 首先,我去查询一张表,看看我是否有对该项目的确认。

<cfquery name="focnotice" datasource="******" result="FocResult">
    SELECT ecspc  
    FROM   tbl_CNR_H 
    WHERE  icsc = '#myarray[i].ICSC#' 
    AND    asr_no = '#myarray[i].ASR#'
</cfquery>

ECSPC 是我的表中的一个字段,所以逻辑是看是否有记录。如果是这样,请查看 ECSPC 值是否不同于“”。如果是,请查询另一个表以查看此 ECSPC 是否存在匹配记录。

<cfset ISUPStatus = "#focnotice.ecspc#">
<cfif ISUPStatus NEQ "">
    <cfquery name="isupStatus" datasource="******" result="ISUPResult">
        select * 
        from   tbl_ISUP 
        where  dpc = '#ISUPStatus#'
    </cfquery>

    <cfset isupcount = #ISUPResult.RecordCount#>
    <cfif #isupcount# GT 0>
        <cfset ISUPorder = "Yes">
    <cfelse>
        <cfset ISUPorder = "No">
    </cfif>

<cfelse>
    <cfset ISUPorder = "No">
</cfif>

我在调试中收到以下错误

复杂对象类型不能转换为简单值。

表达式请求了一个变量或一个中间表达式 结果作为一个简单的值。但是,结果不能转换为 简单的价值。简单值是字符串、数字、布尔值和 日期/时间值。查询、数组和 COM 对象是 复杂的价值观。错误的最可能原因是您尝试过 将复杂值用作简单值。例如,您尝试使用 cfif 标记中的查询变量。

我在这里错过了什么?

【问题讨论】:

  • 究竟是哪一行引发了错误?为什么不直接使用 sql JOIN 而不是所有的 if/else 逻辑?
  • 我正在查看您的问题,但一些明显的编码问题让我想对它们发表评论:1. (注意引号和哈希) 5. 使用 ,不要使用“*” - 而是使用列名 9. (注意哈希) 10. (注意速记和哈希)
  • 好的,我发现了问题,这是由于我这边的糟糕编码造成的。我使用了 并将新查询命名为 cfquery name="isupStatus" 这就是问题所在。原来它要么是“”,要么有一个值,但是一旦我使用相同的名称作为查询名称,它就变得复杂了,我不能再只显示它了。所以我改变了查询名称,它完成了工作并按预期工作
  • 您应该考虑改进代码的其他一些事情 1) 使用 JOIN 而不是所有 if/else 逻辑会大大简化代码 2) 始终在可变查询参数上使用 cfqueryparam .特别是在多次执行的查询上。它使用绑定变量来提高性能,更重要的是保护您的数据库免受 sql 注入。

标签: coldfusion coldfusion-10


【解决方案1】:

您将无效参数传递到查询“myarray[i].ICSC”,'#myarray[i].ASR#'。您需要指定您正在使用的数组索引。

<cfquery name="focnotice" datasource="*******" result="FocResult">
 Select ecspc
 From tbl_CNR_H
 Where icsc = <cfqueryparam cfsqltype="cf_sql_varchar" value="#myarray[1].ICSC#">
        AND
      asr_no = <cfqueryparam cfsqltype="cf_sql_varchar" value="#myarray[1].ASR#"> 
</cfquery>

【讨论】:

  • 您是否在循环中运行查询?我的意思是,您如何获得索引“i”的值?
  • 是的,它在一个循环中,我有一个数组中的表并循环遍历它,这就是为什么我在数组中的行
【解决方案2】:

我认为导致您问题的错误在于:

<cfset isupcount = #ISUPResult.RecordCount#>

快速浏览一下您的代码,尝试改用:

<cfset isUpCount = isUpStatus.recordCount>

但是另外请看上面的cmets,尤其是joins。

【讨论】:

  • 我建议转储你的变量并确定你引用的变量是一个简单的对象,实际上是一个复杂的对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多