2009-12-03 5 views
1

Je n'ai pas fait beaucoup de programmation de base de données. Je travaille à partir d'un exemple de code pour l'utilisation de MySQL Connector/C++.Exception mySql Connector (bibliothèque C++ pour mysql) lors de l'insertion d'une ligne dans une table non vide

Lorsque j'exécute le code suivant, je reçois un plantage sur la dernière ligne d'un code std :: string - mais il se bloque UNIQUEMENT lorsque la table n'est pas vide. Si la table est vide, elle insère la ligne et fonctionne correctement. Si la table n'est pas vide, elle se bloque. Je suis assez confus. Y at-il quelque chose que je fais mal avec la clé primaire ou les autres valeurs? (les noms de colonne ont été modifiés ici, mais sinon le code est verbatim)

Lorsque je regarde la variable dans le code du modèle std :: string (le peu que je peux voir), je ne vois aucune valeur familière de données que j'essayais d'insérer - donc ce n'était aucune aide du tout. Je vois quelque chose comme "HY000" comme une valeur de chaîne, mais je ne suis pas certain d'où cela vient.

Initialement, je pensais que ce pourrait être la chaîne de date, mais le code fonctionne très bien avec une table vide, puis se bloque lorsqu'il n'est pas vide. Cela indique que la chaîne de date fonctionne bien.

prep_stmt = con->prepareStatement("INSERT INTO 
    sometable(val1, val2, val3, Date, val5, val6, val7) 
    VALUES (?, ?, ?, ?, ?, ?, ?)"); 

     /* 
      `idLicenses` INT NOT NULL , 
      `val1` VARCHAR(45) NOT NULL , 
      `val2` INT NOT NULL , 
      `val3` INT ZEROFILL NULL , 
      `Date` DATETIME NOT NULL , 
      `val5` VARCHAR(45) NOT NULL , 
      `val6` VARCHAR(45) NOT NULL , 
      `val7` VARCHAR(45) NOT NULL , 
     */ 

     // val1, val5, val6 and val7 are std::strings, val2 and val3 are ints. 
     prep_stmt->setString(1, val1); 
     prep_stmt->setInt(2, val2); 
     prep_stmt->setInt(3, 0); 
     prep_stmt->setDateTime(4, /* I created some date string here*/); 
     prep_stmt->setString(5, val5); 
     prep_stmt->setString(6, val6); 
     prep_stmt->setString(7, val7); 
     prep_stmt->execute(); 

C'est sur une plate-forme MS en utilisant Visual Studio 2008.

La base de données est en cours d'exécution et je peux utiliser d'autres outils de requête de base de données pour voir les tableaux, etc.

EDIT:

Je vois regarder l'exception mysql que je reçois:

"Utilisation de type tampon non pris en charge: 4191960 (paramètre: 3)" err pas 2036

EDIT:

Je ne suis pas sûr que la réponse acceptée est exactement la bonne réponse, mais il m'a aidé à trouver une solution. Fondamentalement j'ai enlevé tous les attributs non-nulles, a enlevé le remplissage zéro et ai placé la clé primaire à l'auto-incrémentation. Maintenant, ça marche bien

+0

Pouvez-vous publier des déclarations de variables pour val1, etc. Aussi, ressemble à une faute de frappe pour vale1. – zooropa

+0

Je suppose que le "vale1" (etc) ne faisait pas partie de son code actuel, mais qu'il était juste en train de cacher ses noms de colonnes réels du monde. :) – Dolph

+0

Oui - juste cacher les vraies valeurs. le code compile et s'exécute. Les ints sont ints et les chaînes de caractères sont std :: strings. – Tim

Répondre

1

Je suppose que c'est soit votre INT rempli de zéro ou la colonne DATETIME (je ne sais pas qui est la colonne 3).

Essayez de créer votre table avec quelque chose comme:

`val3` INT(10) ZEROFILL , 

où 10 est le nombre de postes à zéro remplissage. Je ne suis pas sûr que la valeur NULL soit nécessaire, donc je l'ai exclu ci-dessus.

En outre, pouvez-vous poster la chaîne de date que vous avez créée si ce qui précède ne fonctionne pas?

+0

Merci pour la suggestion - Je vais mettre à jour. La partie curieuse est pourquoi cela fonctionne quand la table est vide, mais PAS quand la table a une rangée dedans ... – Tim

+0

Je vais essayer de laisser tomber la table et la créer différemment. – Tim

+0

Je ne sais pas si c'était exactement la bonne réponse, mais cela m'a aidé à trouver une solution. Fondamentalement j'ai enlevé tous les attributs non-nulles, a enlevé le remplissage zéro et ai placé la clé primaire à l'auto-incrémentation. Maintenant ça marche bien – Tim