2017-02-06 5 views
0

J'ai une requête cfquery que je suis en boucle sur les valeurs pour insérer plusieurs lignes dans la base de données. Je dois le faire de cette façon, au lieu de générer plusieurs requêtes INSERT dans une boucle, car j'ai besoin d'une liste des generatedKeys après le INSERT. Cependant, ma requête lance maintenant l'erreur ci-dessous. Je sais ce que signifie l'erreur, mais cela n'a aucun sens en raison de ma requête.Erreur de requête d'insertion: le nombre de colonnes ne correspond pas au nombre de valeurs de la ligne 1

Requête:

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

Erreur:

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

Jetez un oeil à votre produit clause VALUES. Ce n'est pas valide sql. Vous avez trop de parenthèses. Lors de la génération dynamique de SQL, je produis souvent la chaîne générée en premier, ' INSERT INTO ....', pour repérer plus facilement ce type d'erreur de syntaxe. De plus, je peux copier et coller le sql dans un IDE si nécessaire. – Leigh

+0

@Leigh pouvez-vous élaborer – Charles

+0

Copiez la partie sql du message d'erreur dans un éditeur de texte et formatez-la afin que vous puissiez voir le problème avec des parenthèses. –

Répondre

0

code corrigé:

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