Problème d'insertion de données

FabriceGuezennec Messages postés 2 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 25 septembre 2007 - 23 sept. 2007 à 21:25
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 25 sept. 2007 à 20:47
Bonjour,

Comment allez vous ?

J'aurais besoin d'un coup de main sur un problème d'insertion de données.

Je développe une routine qui ouvre un fichier texte (séparateur: tabulation), récupère les données des différents champs dans une variable tableau et doit insérer chaque enregistrement dans une table SQL Server Express intégrée à mon projet. Je précise que tous les champs de la table sont des champs texte.

Le code VB 2005 de ma routine est le suivant:




Imports




System.IO


Imports

System.Data.SqlClient




Public





Sub


lirefichier()





Dim


chemin

As





String

Dim
ligne

As





String

Dim
Enregistrement()

As





String

Dim
StrSQL

As





String

Dim
connectionString

As





String

Dim
cmd1

As



New


SqlCommand





chemin =


"D:\VB 2005\data\Customer_Mvt.txt"



connectionString =





"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Test.mdf;Integrated Security=True;User Instance=True"








Using
cnn1

As



New

SqlConnection(connectionString)

cnn1.Open()




Dim


sr

As
StreamReader =

New


StreamReader(chemin)






Do



While


sr.Peek() >= 0


ligne = sr.ReadLine()



Enregistrement = Split(ligne, vbTab)







If
Enregistrement(5) =

""



Then



Enregistrement(5) = Enregistrement(4)








End



If








' MsgBox(Enregistrement(0) + vbCrLf + Enregistrement(1) + vbCrLf + Enregistrement(2) + vbCrLf + Enregistrement(3) + vbCrLf + Enregistrement(4) + vbCrLf + Enregistrement(5) + vbCrLf + Enregistrement(6) + vbCrLf + Enregistrement(7) + vbCrLf + Enregistrement(8) + vbCrLf + Enregistrement(9) + vbCrLf + Enregistrement(10) + vbCrLf + Enregistrement(11) + vbCrLf + Enregistrement(12) + vbCrLf + Enregistrement(13))



StrSQL =




"INSERT INTO Test.Table1(Entite,Code,Compte,Piece,DateEmission,DateEcheance,Doc,FactureProjet,Montant1,Devise,Montant2,Montant3,Description,Livre) values (''"

StrSQL = StrSQL + Enregistrement(0)
StrSQL = StrSQL +

"'',''"    
'Je précise que j'insère ici deux single quotes, une virgule puis deux single quotes


StrSQL = StrSQL + Enregistrement(1)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(2)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(3)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(4)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(5)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(6)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(7)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(8)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(9)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(10)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(11)
StrSQL = StrSQL +
"'',''"

StrSQL = StrSQL + Enregistrement(12)
StrSQL = StrSQL +

"'',''"

StrSQL StrSQL + Enregistrement(13)StrSQL StrSQL +

"'')"   'Je précise que j'insère ici deux single quotes puis une parenthèse








' MsgBox(StrSQL)





cmd1.CommandText = StrSQL
cmd1.Connection = cnn1
cmd1.ExecuteNonQuery()











Loop



sr.Close()








End




Using




MsgBox(


"Fini"
)




End




Sub



La répupération des valeurs se passe bien et il semble que ce soit de même pour la construction de la chaîne SQL.

Par contre, à l'exécution de cette chaîne, je reçois le message d'erreur "Incorrect syntax near '001001' " où
'001001' correspond à la valeur devant être insérée dans le premier champ.

J'ai vérifié et revérifié mon code, je ne trouve pas la faille et j'y perd le (peu) de latin binaire que je connaisse.

 
Je serais vraiment très reconnaissant à celle ou celui qui m'aidera à lever cet obstacle.

Merci et a +

Fabrice

4 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
23 sept. 2007 à 22:52
Salut,

Le probleme est peu etre du au type de données.
Ta requete semble fausse, mais peut être sur le site il semble avoir un doublage de ' alors que cela n'est pas nécéssaire.

Une solution est de mettre ta requete dans l'anayseur de requete SQL SERVER,
sans management studio express (par exemple) ou un autre outil.
Il y a des chances que l'erreur sera levée.

Met un point d'arret pour choper la valeur de ta requete ca sera mieux que des messagebox.

Sinon le top, c'est de mettre en place des parametres nommés, au niveua type et sécurité du programme.

Bon courage
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 sept. 2007 à 00:24
Salut
Vérifie le type de donnée de chacun de tes champs dans la base de données, ce sont ces types qui dictent le format d'insertion :
- Type chaine : La donnée doit être encadré par des apostrophes '
- Type date : La donnée doit être encadré par des dièses #
- Type Numérique : Pas d'encadrement

Il va donc surement revoir tes 
   StrSQL = StrSQL + "'',''"
systématiques
De plus, en remettant en forme cette ligne, je m'aperçois qu'il y a des apostrophes en trop : à corriger :
   StrSQL = StrSQL + "','"
Pourquoi veux-tu les doubler ?
Le seul cas où il faut les doubler, c'est quand la chaine que tu veux insérer contient elle-même un apostrophe. Voir les milliers de réponses à cette question dans le forum

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
FabriceGuezennec Messages postés 2 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 25 septembre 2007
25 sept. 2007 à 20:14
Rebonjour



Tout d'abord, je dois des excuses à tout le monde ...

J'ai lu les réponses avec intérêt, je me suis penché sur mon code et j'ai trouvé deux raisons pour lesquelles ce message d'erreur apparaît:

1. Il y a effectivement trop d'apostrophes. J'aurais pu y penser.

2. Les erreurs proviennent du fait que des apostrophes sont incluses dans les valeurs d'un des champ texte, d'où la nécessité de prévoir un traitement avant d'exécuter la chaîne SQL. Là aussi, j'aurais du y penser



Bref, ma boucle fonctionne sauf que ... je suis allé vérifier par après si les données étaient effectivement insérées, ce qui n'est pas le cas, tous les champs sont en valeur null.



Je ne dirais pas que je désespère mais je suis pour le moins frustré



A l'aide !




Fabrice
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
25 sept. 2007 à 20:47
Salut,

En exécutant la requete dans studio management express.
Les données s'inserent-t-elles.

Si oui il y a un probleme de code dotnet.
Probleme de connexion? Je ne sais le code a l'air correct.
Il faut fermer la connexion quand meme?

Si non il y a un probleme de requete ce qui est fort probable.

Bon courage
0
Rejoignez-nous