0

我正在尝试通过 CFLOOP 将变量动态设置为结构。我已阅读Ben Nadal 的博客文章,但似乎无法正确完成作业。我想使用点表示法并使 VIN 成为值的子结构。

这是我的代码:

<cfloop query="VINs">
    <cfquery name="carsQue" datasource="carsData">
      SELECT VIN, MODEL, MAKE, etc
      FROM CarsDB
      WHERE (VIN = #VIN#)
    </cfquery>

     <cfset carsStruct= StructNew()>
     <cfset carsStruct.[VIN].MAKE = '#carsQue.MODEL#'>
     <cfset carsStruct.[VIN].MODEL = '#carsQue.MAKE#'>
</cfloop>

任何指导将不胜感激,

谢谢

4

3 回答 3

4

在循环外创建结构并在循环内设置变量可以解决问题。在当前场景中,每次循环运行它都会创建一个新结构。

你可以做这样的事情

 <cfset carsStruct= StructNew()>
 <cfloop query="VINs">
   <cfquery name="carsQue" datasource="carsData">
   SELECT VIN, MODEL, MAKE, etc
   FROM CarsDB
   WHERE VIN = <cfqueryparam cf_sql_type="cf_sql_varchar" value="#VINs.VIN#">
   </cfquery>

   <cfset carsStruct[VINs.VIN].MAKE = carsQue.MODEL>
   <cfset carsStruct[VINs.VIN].MODEL = carsQue.MAKE>
 </cfloop>
于 2013-04-21T06:12:10.807 回答
4

在循环中运行查询几乎总是一个坏主意。在您的情况下,更好的选择是:

<cfif ListLen(valuelist(vins.vin)) gt 0>
<cfquery name=CarsQue datasource = "carsData">
select vin, model, make, etc
from carsDB
where vin in (<cfqueryparam cfsqltype="cf_sql_varchar"
value="#valuelist(vins.vin)#" list="true">)
</cfquery>

<cfset carsStruct = StructNew()>

<cfloop query="carsQue">
code for your struct
</cfloop>

<cfelse>
code for vins query returning no data
</cfif>

更好的是通过一次查询获取所有数据。您没有提供足够的信息来确定这是否可行,但通常是这样。

于 2013-04-21T11:49:45.747 回答
2

根据您提供的有限信息,您应该能够运行一个查询并循环通过该查询以添加到您的结构中。

<cfset carsStruct= {}> //new struct
<cfif VINs.RecordCount> //your VINs query has records
  <cfquery name="carsQueue" datasource="carsData">
  SELECT VIN, MODEL, MAKE, etc
  FROM CarsDB
  // Quoted list of all your VINs. cfqueryparam prevents against SQL injection 
  WHERE VIN IN (<cfqueryparam cf_sql_type="cf_sql_varchar" value="#ValueList(VINs.VIN)#" list="true">
  </cfquery>


  <cfloop query="carsQueue">
    <cfset carsStruct.[carsQueue.VIN].MAKE = carsQueue.MODEL>
    <cfset carsStruct.[carsQueue.VIN].MODEL = carsQueue.MAKE>
  </cfloop>
<cfelse>
   // if VINs query return nothing a blank struct will be returned.
   //You do NOT need this <cfelse> unless you are returning something when the query is blank
</cfif>
于 2013-04-21T12:36:54.080 回答