ColdFusion10 — запрос cfloop вместо запроса на вставку

Первый пост здесь. Я использую <CFSPREADSHEET> для создания запроса из Excel, а затем пытаюсь вставить результаты запроса в таблицу MySQL. Это работает нормально. Мне также нужно взять значение из одного столбца и вставить его правильный идентификационный номер в столбец идентификатора в таблице. Вот мой код. Результаты, которые я получаю, - это тот же идентификатор (6), который вставляется в каждую строку таблицы. Помощь здесь обязательно будет оценена по достоинству. Спасибо!

<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>

person RobK    schedule 10.04.2013    source источник
comment
Какое поле ID? Является ли ID полем в MySQL, которое должно быть auto_increment, но не является?   -  person Busches    schedule 10.04.2013
comment
Если Branch_ID существует в таблице базы данных, вы также можете использовать INSERT / SELECT для выбора идентификатора из другой таблицы и вставки значений в тот же оператор и устранения блоков if/else.   -  person Leigh    schedule 11.04.2013


Ответы (2)


Одна проблема заключается в том, что у вас есть синтаксическая ошибка в ваших операторах 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 ничего не совпадает, оно сохранит последнее значение, потому что оно не инициализируется повторно.

Вы также должны использовать <cfqueryparam> в своих операторах INSERT.

Кроме того, и это скорее личное предпочтение, но использование 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>
person Matt Busche    schedule 10.04.2013
comment
Можно также упомянуть, что этот оператор if является идеальной настройкой для оператора switch. Кроме того, он Trims() newQuery.Branch во вставке, но не cfif [e] Добавьте к этому переключателю регистр по умолчанию. - person Busches; 10.04.2013
comment
Спасибо, Мэтт! Очевидно, это решило проблему. Я ценю быструю помощь. Надеюсь, что смогу дать некоторые ответы в будущем. - person RobK; 10.04.2013
comment
cfswitch со строковым выражением, особенно под нагрузкой, работает значительно медленнее, чем эквивалентный блок cfif-cfelseif-cfelse. webapper.com/blog/index.php/2006/07 /27/20060727042244 Эта проблема существует в CF8 и 9. Я не удивлюсь, если она все еще существует в CF10. - person Adrian J. Moreno; 10.04.2013
comment
@iKnowKungFoo и из комментариев Good news. I got around to trying this in CF8 today and the problem seems to be resolved. Быстрое тестирование на CF9 показало, что cfswitch работает намного быстрее, используя свои собственные тестовые файлы. - person Busches; 10.04.2013
comment
... если нет совпадения для cfswitch, тогда cfif намного быстрее. - person Busches; 10.04.2013

сбрасывайте переменные.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>
person steve    schedule 10.04.2013