查询在coldfusion上下文中返回零记录,但在Navicat中工作正常

时间:2012-09-12 19:03:55

标签: mysql coldfusion

我有一个查询,当我加载页面时返回零记录。如果我将相同的查询(从调试输出)复制并粘贴到navicat中,我会返回行(正如我所期望的那样)。有没有人见过这个?它在我们的登台服务器(CF10)上本地(CF9)和远程发生。甚至更奇怪,这是一个以前工作正常的查询 - 我只是在where子句中添加了一个if语句,并且突然间......

以下是查询:

    SELECT
        a.EncounterProductID,
        a.DateTime AS ServiceDate,
        aa.CartItemID,
        aaa.CartID,
        aaaaa.CartStatus,
        b.ProductID,
        b.ProductName,
        b.CPTCode,
        b.Price,
        c.EncounterID,
        c.DateTimeClosed AS EncounterClosedDate,
        d.FirstName,
        d.LastName
    FROM
        EncounterProducts a
            LEFT JOIN CartItemProduct aa ON (a.EncounterProductID = aa.EncounterProductID AND aa.Active = 1)
            LEFT JOIN CartItem aaa ON (aa.CartItemID = aaa.CartItemID)
            LEFT JOIN Cart aaaa ON (aaa.CartID = aaaa.CartID)
            LEFT JOIN CartStatus aaaaa ON (aaaa.CartStatusID = aaaaa.CartStatusID),
        Product b,
        Encounters c,
        Contacts d,
        EncounterStatuses e
    WHERE
        1 = 1
        AND (aa.CartItemID IS NULL OR aaaaa.CartStatus = 'Deleted')
        AND a.Active = 1
        AND a.ProductID = b.ProductID
        AND a.EncounterID = c.EncounterID
        AND c.PatientID = d.ContactID
        AND c.EncounterStatusID = e.EncounterStatusID
        AND e.EncounterStatus = 'Closed'
      <CFIF IsDefined("ARGUMENTS.encounter") AND IsObject(ARGUMENTS.encounter)>
             AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">
     <CFELSE>
            AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
            AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">
       </CFIF>
        AND c.LocationID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.locationID#">
        AND c.CustomerID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.customerID#">
    </CFQUERY>

在我添加这些行之前,所有这些都运行得很好:

<CFIF IsDefined("ARGUMENTS.encounter") AND IsObject(ARGUMENTS.encounter)>
    AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">
<CFELSE>
    AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
    AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">
</CFIF>

以前,它刚刚出现过:

AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">

没有IF / ELSE声明。

之前有人见过这样的事吗?有任何想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我看到你问题的两个不同部分。

第1部分您说:

  

它是一个以前工作正常的查询 - 我只是在where子句中添加了一个if语句,并且突然间......

显然,这让我相信你的新if条件是查询的罪魁祸首,不再返回之前返回的结果。

该查询正在使用:

AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">

所以现在我假设它正在传递你的新if条件,而代码正在运行这个没有返回结果:

AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">

#ARGUMENTS.encounter.getID()#是否会返回您的期望? Encounters表是否实际包含具有遇到id的记录?

第2部分您说:

  

如果我将相同的查询(从调试输出)复制并粘贴到navicat中,我会返回行(正如我所期望的那样)。

我怀疑你无法直接复制和粘贴调试输出,并且无需进行一些修改即可使用。您必须至少输入参数化输入的值。那么当您从navicat运行查询时,您输入的是什么值?那些与ColdFusion运行时产生的值相同吗?

答案 1 :(得分:0)

尝试替换它:

#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00

用这个:

#createODBCDateTime(DateAdd('d', 1, ARGUMENTS.endDate))#