Alimenter une BD à partir d'un fichier de données texte

multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012 - 30 juil. 2004 à 13:20
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012 - 3 mai 2005 à 09:01
J'ai un problème lorsque je programme une interface en VB pour alimenter une table de base de données à partir d'un fichier texte normale format ascii.
1- L'écran devient tout blanc, et je n'ai plus de contrôle sur la machine.
2- ça prend énormémént de temps surtout lorsqu'il s'agit d'un fichier de taille considérable ( 30 MB par ex ).

Sachant que j'utilise la commande "Line Input #1, textline".

Y a t-il pas une méthode meilleure et optimale pour se faire.

J'aime pas utiliser l'import d'access, je veux que ce soit par programme en VB6.

Merci

7 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
30 juil. 2004 à 22:24
Salut,
Pas vu ton code mais as-tu pensé à mettre un DoEvents dans ta ou tes boucles de lecture/écriture ?
Je ne te garantis pas une rapidité d'exécution supérieure (pour ça, il faudrait que tu livres une partie de ton code pour qu'on l'optimise) mais au moins, ça devrait de laisser la main même si ton traitement n'est pas terminé.

Cordialement

CanisLupus
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
2 août 2004 à 11:34
Merci CanisLupus pour l'interêt à ma question.

Je vous transmets la procédure de code écrite.

Private Sub cmd_generer_Click()
Dim db As Database
Dim nbrec As Long

nbrec = 0
cmd_generer.Enabled = False
NomBD = "c:\VBPROJPORT\BDPORT.MDB"

MousePointer = 11

Open "c:\vbprojport\port.sdf" For Input As #1 ' Ouvre le fichier.
Set db = OpenDatabase(NomBD)

Do While Not EOF(1)

Line Input #1, textline

w_port = Mid(textline, 1, 19)
w_nom = Mid(textline, 20, 26)
w_bnq = Mid(textline, 46, 5)
w_agence = Mid(textline, 51, 5)
w_rib1 = Mid(textline, 56, 24)
'w_rib2 = Mid(textline, 80, 24)
w_finval = Mid(textline, 80, 4)
w_nom1 = Replace(w_nom, "'", " ")
db.Execute "insert into t_port" _
& "(noport,nom,bnq,agence,rib,finval) Values " _
& " ('" & w_port & "','" & w_nom1 & "','" & w_bnq & "','" & w_agence & "','" & w_rib1 & "','" & w_finval & "')", dbFailOnError

i = i + 1
Text1.Text = i ' Juste pour afficher le nombre d enregistrements écrits
Text1.Refresh
Loop

Close #1
db.Close ' Ferme le fichier.
MousePointer = 0

End Sub
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
2 août 2004 à 13:30
Salut,

D'abord, pour lire un fichier de 30 Mo c sûr que ça doit être long mais en plus, tu fais un découpage de ta chaine ds des variables que tu réécris ensuite à chaque fois (récup ds une variable --> variable ds table) tu peux faire ça en une seule fois.

D'autre part, si tu veux pouvoir faire autre chose pendant le traitement, je te déconseille le mousepointer=11 et il faut insérer un DoEvents ds la boucle.

Je te propose le code suivant :

Private Sub cmd_generer_Click()

Dim db As Database
Dim rs As Recordset
Dim nbrec As Long
Dim NomBD As String

nbrec = 0
cmd_generer.Enabled = False
NomBD = "c:\mes documents\bd2.mdb" '"c:\VBPROJPORT\BDPORT.MDB"

'MousePointer = 11

Open "c:\vbprojport\port.sdf" For Input As #1 ' Ouvre le fichier.
Set db = OpenDatabase(NomBD)

Set rs = db.OpenRecordset("select * from table1", dbOpenDynaset)

Do While Not EOF(1)

Line Input #1, textline

rs.AddNew
rs!noport = Mid(textline, 1, 19)
rs!nom = Replace(Mid(textline, 20, 26), "'", " ")
rs!bnq = Mid(textline, 46, 5)
rs!agence = Mid(textline, 51, 5)
rs!rib = Mid(textline, 56, 24)
rs!finval = Mid(textline, 80, 4)
rs.Update

nbrec = nbrec + 1
Text1.Text = nbrec ' Juste pour afficher le nombre d enregistrements écrits
Text1.Refresh
Loop

Close #1
rs.Close ' Ferme le recordset
db.Close ' Ferme le fichier.

Set rs = Nothing ' libère la mémoire occupée par le rs
Set db = Nothing ' libère la mémoire occupée par la bd

'MousePointer = 0

End Sub

Cordialement

CanisLupus
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
2 août 2004 à 13:50
Merci,

Je vais tester ce code cet après midi.

Je te ferai lire demain.

Cordialement

Multipac
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
3 août 2004 à 10:25
Bonjour CanisLupus,

Vous m'avez vraiment fait un très grand service.

J'ai essayé la nouvelle méthode et ça marche , excellent.

Ca va vraiment me résoudre pas mal de problème.

Je vous remercie cordialement.

à+

Walid
0
dorson Messages postés 2 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 15 mai 2005
3 mai 2005 à 00:13
urgent besoin de rechercher les caracteres dans un textbox dans une table access

j'utilise ado en visual basic pour connecter ma base de données access, mais j'ai un textbox
contenant des données que j'aimerais comparer avec les données dans ma table afin de voir si ce que j'ai dans le textbox se retrouve dans la table en access
0
multipac Messages postés 30 Date d'inscription jeudi 15 juillet 2004 Statut Membre Dernière intervention 7 mars 2012
3 mai 2005 à 09:01
En connaissant lequel des champs à comparer, il suffit d'utiliser la clause 'LIKE' dans la requête SQL.

exemple:
SQL_REQ = "select field_name from table where field_name like '*" & form.text1.Text & "*'"

et puis il suffit de tester l'existence du recordset.

Walid
0
Rejoignez-nous