2013-04-10 92 views
0

第一篇文章在这里。我使用<CFSPREADSHEET>从Excel创建查询,然后尝试将查询结果插入到MySQL表中。这工作正常。我还需要从一列中取值,并将正确的ID号插入表中的ID列。这是我的代码。我得到的结果是在每个表格行中插入相同的ID(6)。这里的帮助肯定会被赞赏。谢谢!ColdFusion10 - 通过插入查询查询cfloop

<cfspreadsheet action="read" 
src="#myFile#" 
sheet="5" 
excludeheaderrow="true" 
headerrow="1" 
query="newQuery" /> 

<cfloop query="newQuery"> 
    <!--- set ID variables ---> 
    <cfif newQuery.Branch EQ "Army"> 
    <cfset variables.Branch_ID = 6 /> 
    <cfelseif newQuery.Branch EQ "Marine Corps"> 
    <cfset variables.Branch_ID EQ 9 /> 
    <cfelseif newQuery.Branch EQ "Navy"> 
    <cfset variables.Branch_ID EQ 7 /> 
    <cfelseif newQuery.Branch EQ "Air Force"> 
    <cfset variables.Branch_ID EQ 8 /> 
    <cfelseif newQuery.Branch EQ "Coast Guard"> 
    <cfset variables.Branch_ID EQ 10 /> 
    </cfif> 

    <cfquery name="importXLS" datasource="memorials_mysql"> 
    INSERT INTO honorees_temp(FirsttName,MName,LastName,Branch,Branch_ID,Unit) 
    VALUES 
    ('#Trim(FirstName)#', 
    '#Trim(MName)#', 
    '#Trim(LastName)#', 
    '#Trim(Branch)#', 
    #variables.Branch_ID#, 
    '#Trim(Unit)#') 
    </cfquery> 
</cfloop> 
+0

什么是ID字段? MySQL中的ID是一个字段,应该是auto_increment,但不是? – Busches 2013-04-10 14:25:33

+0

如果分支表中存在'Branch_ID',则还可以使用'INSERT/SELECT'从另一个表中选择ID并在同一语句中插入这些值,并删除if/else块。 – Leigh 2013-04-11 17:19:16

回答

0

每次循环时都将您的variables.brand_id重置为0。您的IF语句可能没有匹配,因此它保留了每个未来不匹配记录的最后匹配值。

<cfspreadsheet action="read" 
       src="#myFile#" 
     sheet="5" 
     excludeheaderrow="true" 
     headerrow="1" 
     query="newQuery" /> 
<cfloop query="newQuery"> 
    **<cfset variables.Branch_id=0>** 
     <!--- set ID variables ---> 
     <cfif newQuery.Branch EQ "Army"> 
      <cfset variables.Branch_ID = 6 /> 
     <cfelseif newQuery.Branch EQ "Marine Corps"> 
      <cfset variables.Branch_ID = 9 /> 
     <cfelseif newQuery.Branch EQ "Navy"> 
      <cfset variables.Branch_ID = 7 /> 
     <cfelseif newQuery.Branch = "Air Force"> 
      <cfset variables.Branch_= EQ 8 /> 
     <cfelseif newQuery.Branch EQ "Coast Guard"> 
      <cfset variables.Branch_ID = 10 /> 
     </cfif> 

    <cfquery name="importXLS" datasource="memorials_mysql"> 
      INSERT INTO honorees_temp(FirsttName,MName,LastName,Branch,Branch_ID,Unit) 
      VALUES 
       ('#Trim(FirstName)#', 
       '#Trim(MName)#', 
       '#Trim(LastName)#', 
       '#Trim(Branch)#', 
       #variables.Branch_ID#, 
       '#Trim(Unit)#') 
</cfquery> 
</cfloop> 
4

一个问题是您的cfset语句中有语法错误。在cfset中,您需要使用=而不是EQ

<!--- set ID variables ---> 
    <cfif newQuery.Branch EQ "Army"> 
     <cfset variables.Branch_ID = 6 /> 
    <cfelseif newQuery.Branch EQ "Marine Corps"> 
     <cfset variables.Branch_ID =9 /> 
    <cfelseif newQuery.Branch EQ "Navy"> 
     <cfset variables.Branch_ID =7 /> 
    <cfelseif newQuery.Branch EQ "Air Force"> 
     <cfset variables.Branch_ID = 8 /> 
    <cfelseif newQuery.Branch EQ "Coast Guard"> 
     <cfset variables.Branch_ID =10 /> 
    </cfif> 

你对newQuery.Branch的价值是什么?如果if语句中没有任何内容匹配,它将保留最后一个值,因为它没有被重新初始化。

您也应该在INSERT语句中使用<cfqueryparam>

此外,这是个人喜好,但使用cfswitch比使用多个else if语句更有效。

<cfswitch expression="#trim(newQuery.Branch)#"> 
    <cfcase value="Army" > 
    <cfset Branch_ID = 6 />  
    </cfcase> 
    <cfcase value="Marine Corps" > 
    <cfset Branch_ID = 9 />  
    </cfcase> 
    <cfcase value="Navy" > 
    <cfset Branch_ID = 7 />  
    </cfcase> 
    <cfcase value="Air Force" > 
    <cfset Branch_ID = 8 />  
    </cfcase> 
    <cfcase value="Coast Guard" > 
    <cfset Branch_ID = 10 />  
    </cfcase> 
    <cfdefaultcase> 
    <!--- set either a default value or throw an error, depending on your needs ---> 
    <cfset Branch_ID = 0> 
    <cfthrow message="Invalid Branch_ID"> 
    </cfdefaultcase> 
</cfswitch> 
+0

也可以提一下,这个if语句是switch语句的完美设置。另外,他在插入时修剪()'newQuery.Branch',而不是'cfif' [e]向该开关添加默认情况。 – Busches 2013-04-10 14:35:54

+0

谢谢马特!显然这解决了这个问题。我非常感谢快速帮助。希望我能在未来提供一些答案。 – RobK 2013-04-10 14:37:14

+0

@Busches我更新了这两个增强 – 2013-04-10 14:38:46