2017-02-06 18 views
0

У меня есть cfquery, что я перебираю значения, чтобы вставить несколько строк в базу данных. Я должен сделать это таким образом, вместо того, чтобы генерировать несколько запросов INSERT в цикле, потому что мне нужен список generatedKeys после INSERT. Однако мой запрос теперь бросает ошибку ниже. Я знаю, что означает ошибка, но это не имеет смысла, основываясь на моем запросе.Вставить ошибку запроса: количество столбцов не соответствует количеству значений в строке 1

Запрос:

<cfquery datasource="#OLMSdatasourceWrite#" result="myResult"> 
    INSERT INTO OLMS_Data_RatioScenarios 
    (
     OLMS_Account_ID, 
     OLMS_RatioScenario_Name 
    ) 
    VALUES 
    (
    <cfset numItems = ListLen(AccountListWithSettings)> 
    <cfset i = 1> 

    <cfloop list="#AccountListWithSettings#" index="CurrentAccount"> 
     (<cfqueryparam cfsqltype="cf_sql_numeric" value="#CurrentAccount#" maxlength="255"> 
     , <cfqueryparam cfsqltype="cf_sql_clob" value="#requestBody.value#" maxlength="255"> 
     ) 
     <cfif i lt numItems> 
      , 
     </cfif> 

     <cfset i++> 
    </cfloop> 
    ) 
</cfquery> 

<cfoutput>Inserted ID is: #myResult.generatedkey#</cfoutput> 

Ошибка:

Root Cause:java.sql.SQLException: Column count doesn't match value count at row 1 
SQL: INSERT INTO OLMS_Data_RatioScenarios (OLMS_Account_ID, OLMS_RatioScenario_Name) 
VALUES (((param 1) , (param 2)) , ((param 3) , (param 4)) , ((param 5) , (param 6))) 
+0

Посмотрите на вашу генерируемой статье VALUES. Недействительно sql. У вас слишком много скобок. При генерации SQL динамически я часто выводя сгенерированную строку сначала, ' INSERT INTO ....', чтобы легче распознать эту синтаксическую ошибку. Кроме того, я могу скопировать и вставить sql в IDE, если это необходимо. – Leigh

+0

@ Вы можете подробно рассказать – Charles

+0

Скопируйте часть сообщения об ошибке в текстовый редактор и отформатируйте его так, чтобы вы могли видеть проблему с круглыми скобками. –

ответ

0

Исправленный код:

<cfquery datasource="#OLMSdatasourceWrite#" result="myResult"> 
    INSERT INTO OLMS_Data_RatioScenarios 
    (
     OLMS_Account_ID, 
     OLMS_RatioScenario_Name 
    ) 
    VALUES 
    <cfset numItems = ListLen(AccountListWithSettings)> 
    <cfset i = 1> 
    <cfloop list="#AccountListWithSettings#" index="CurrentAccount"> 
     (
      <cfqueryparam cfsqltype="cf_sql_numeric" value="#CurrentAccount#" maxlength="255"> 
     , <cfqueryparam cfsqltype="cf_sql_clob" value="#requestBody.value#" maxlength="255"> 
     ) 
     <cfif i lt numItems> 
      , 
     </cfif> 

     <cfset i++> 
    </cfloop> 
</cfquery>