2015-05-15 7 views
0

Раньше в течение недели я спрашивал сообщество, как я могу вставить информацию из функции csvToArray, написанной Бен Наделем, однако в итоге я использовал что-то еще, которое, кажется, запускается просто как хорошо, так и лучше. Итак, вот проблема: после использования этой новой функции я могу захватить данные из массива, однако, когда я вставляю ее в базу данных, я получаю следующее сообщение об ошибке от coldfusion: «Элемент в позиции 16 измерения 2, объекта массива, используемого как часть выражения, не может быть найден. «Кто-нибудь есть опыт с этим и знает, почему я получаю это сообщение? Все остальное работает по назначению. Вот код, о котором идет речь:csvToArray и вставить в базу данных не работает должным образом

<cfif request_method is "Post" AND isDefined("form.fileUpload") EQ 1> 
     <cffile action="read" file="#form.filecontent#" variable="csvfile"> 
      <cfinvoke component="#application.path.cfc#.Organizations" method="csvToArray" returnvariable="getArraData"> 
       <cfinvokeargument name="fileContent" value="#csvfile#"> 
      </cfinvoke> 
    <!--- Loop the array starting on the 2 index to remove the header info from the insert ---> 
    <cfloop from="2" to="#arrayLen(getArraData)#" index="i"> 
    <cfset indexNum = i > <!--- Start with 2 index then increment the value by 1 on the loop ---> 
     <cfloop from="2" to="#arrayLen(getArraData[i])#" index="j"> 
      <cfset dimNum = j > <!--- Start with 2 index then increment the value by 1 on the loop ---> 
      <!--- After loop ends. nunbers are dynamically placed into position [2][2] and insert the values of the index deminsion---> 
       <cfquery datasource ="#application.dsn.name#" name="BudgetInsert"> 
        <!--- Insert Data here ---> 
         INSERT INTO sales_budget 
           (
           nOrganizationID 
           ,nLocationID 
           ,nBudgetTypeID 
           ,nBudgetYear 
           ,month1 
           ,month2 
           ,month3 
           ,month4 
           ,month5 
           ,month6 
           ,month7 
           ,month8 
           ,month9 
           ,month10 
           ,month11 
           ,month12 
           ,nActive 
           ,tCreationDate 
           ,tLastUpdate 
           ,cChangedBy 
          ) 
         VALUES 
           (
           <cfqueryparam cfsqltype="cf_sql_integer" value="#url.OrgID#"> 
           ,<cfqueryparam cfsqltype="cf_sql_integer" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_integer" value="2"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_varchar" value="#getArraData[indexNum][dimNum]#"> 
           ,<cfqueryparam cfsqltype="cf_sql_bit" value="1"> 
           ,GetDate() 
           ,GetDate() 
           ,<cfqueryparam cfsqltype="cf_sql_integer" value="#Session.Auth.UserID#"> 
          ) 
        </cfquery> 
<cfset dimNum = j +1 > 
      </cfloop> 
indexNum = i +1 
     </cfloop> 
    </cfif> 
+0

Я понял это как: Внутренний цикл должен был иметь ссылку на петлю выхода, как указано ниже: user1188254

+0

Если вы считаете, что решение поможет другим, вы должны опубликовать его как« ответ ». Ответ на ваш собственный вопрос разрешен на S.O. Тем не менее, есть причина, по которой вы должны использовать массивы, а не использовать инструменты DB для загрузки CSV, то есть «BULK INSERT» (SQL Server), «LOAD DATA INFILE» (MySQL) и т. Д. Обычно они намного эффективнее, чем петли. – Leigh

ответ

0

Вы должны быть в состоянии использовать только cfspreadsheet для чтения файла CSV и перенести его в БД. Хотя для большинства современных баз данных есть команды для непосредственного импорта CSV-файла (за комментарий Leigh), если у вас нет правильных разрешений, то это ваш лучший выбор.

<cfspreadsheet 
    action="read" 
    src = "filepath" 
    columns = "range" 
    columnnames = "comma-delimited list" 
    excludeHeaderRow = "true | false" 
    format = "CSV|HTML" 
    headerrow = "row number" 
    name = "text" 
    query = "query name" 
    rows = "range" 
    sheet = "number" 
    sheetname = "text">

Это возвращает обычный объект запроса CF, который вы можете запрограммировать для своих вставок.

Смежные вопросы