2011-03-23 2 views
1

J'ai un problème lors de l'insertion de données dans une table.Sql Server CE L'insertion échoue sans erreur

J'ai fait un programme avec un DB simple. J'utilise

  • C#
  • Framework 3.5
  • sql server mobile
  • L'exécution du programme sur un périphérique GPRS. Chaque jour, il reçoit un fichier zip, l'extraire et insérer les lignes dans certaines tables.

Quelques citations

ouvrir la connexion:

SqlCeConnection conn = new SqlCeConnection("DataSource = " + file); 
conn.Open();     

Ecrire une rangée:

String sql = "INSERT INTO Mercati(id,descr) VALUES(643,'SHAMPOO')" 
SqlCeCommand execute = conn.CreateCommand(); 
execute.CommandText = sql; 
int result = execute.ExecuteNonQuery(); 
execute.Dispose(); 

Le tableau de données est comme ça:

CREATE TABLE Mercati(id int PRIMARY KEY,descr nvarchar(40)); 

Ceci est à l'intérieur d'un essai/catch. Et chaque fois que le résultat est 1 (j'ai coupé le code de débogage). Je répète cela sur des tables différentes, avec des données différentes.

Mais PARFOIS (1 fois 4/5 transmissions) avec une table les données ne sont pas insérées, avec le résultat = 1 et aucune exception.

  • Chaque fois que je transmets, je réinitialise le périphérique et redémarre mon programme.
  • Les tables sont vidées chaque fois (SUPPRIMER DE Mercati)
  • Les données sont chaque fois les mêmes (ceux sont la base pour un travail, mais ils pourraient parfois changer un mois)

Je suis vraiment à court d'idées. Je ne comprends pas quel est le problème. Ou simplement comment puis-je résoudre ce problème. Une solution ou un conseil?

Merci beaucoup Daniele

Répondre

0

J'ai résolu.

Après les INSERT, je fais quelques sauvegardes, puis je réinitialise le périphérique. MAIS je n'ai pas fermé la DB.L'étrange est que j'ai fait le conseil de SeaDrive, et après mes insertions la table contient le nombre exact de rangées. J'ai fait 9 INSERT et mon select retour 9 lignes.Après réinitialisation j'ai seulement 1 ligne.

Je pense qu'il y a une sorte de cache, qui est transparent pendant l'exécution, mais qui laisse inchangé le fichier fisical, sauf si le DB est fermé.

J'espère que cela aidera à d'autres pauvres developpeur comme moi de fermer leur DB: D

+0

Lire sur le contrôle des transactions. Il semble que vous ayez supposé que votre base de données était configurée pour AUTOCOMMIT, mais ce n'est pas le cas. – SeaDrive

2

La seule chose que je peux penser à qui faire disparaître les données insérées est le contrôle des transactions. Avez-vous une programmation COMMIT/ROLLBACK?

Y a-t-il une chance que la chaîne de connexion soit modifiée en un autre DB? En tant que stratégie de débogage, ma première approche serait de lire les données de la table après l'insertion pour être sûr que les données sont là. Regardez la ligne spécifique et le nombre total de lignes. Je pourrais essayer de le lire à différents moments du programme pour voir quand la rangée disparaîtra.

+0

Je n'utilisez pas COMMIT/ROLLBACK, ou je ne sais pas si le cadre utiliser. Je n'utilise que les lignes de code indiquées. Je pense que je peux écrire et lire, puis réécrire ... mais combien de fois? Comment puis-je être sûr que, après ... 3 fois ... les données seront écrites. Je vais essayer quand même –

+0

Ça devrait marcher à chaque fois, sans faute. Continuez à chercher l'erreur. – SeaDrive