Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011
-
28 juin 2010 à 12:31
Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011
-
1 juil. 2010 à 17:06
Bonjour! à TOUS.
J'ai un petit souci... comme beaucoup ici... :-(
Mais restons de bonne humeur
En fait voila, je me connecte à une bas de données MySQL je fait mon SELECT * et récupère mes données dans une "table" dans mon recordset.
Mon problème est que je veux (une fois le select exécuté) faire un INSERT avec le même recordset sur une autre base de données sur un autre serveur sur une autre machine.
Je crée donc une deuxième connexion et effectue en boucle mes INSERT sur la DB voulue... mais voila, mon recordset peut varier entre 800 000 et 8 000 000 de lignes... donc boucle infini.
Bien évidemment après chaque INSERT sur le serveur 2 je fait un DELETE de la même ligne sur le serveur 1. Boucle encore plus longue.
Y aurait il un moyen de faire un INSERT GÉNÉRAL de mon recordset???
Dim Query_In As String
Dim Query_Del As String
Dim conn_src As ADODB.Connection 'Connexion vers serveur Source
Dim conn_dst As ADODB.Connection 'Connexion vers serveur destination
Dim rs As ADODB.Recordset 'Recordset ou stocker temporairement les données à sauvegarder
bit_red = True 'Deviendra faux quand il n'y aura plus de donnée à sauvegarder dans la DB source
Set conn_src = MySQL_Conn(IP_source, "gpsdb", "gpsdb", "gpsdb") 'Ouverture connexion avec la base de données source
If conn_src.State = 0 Then 'Tests pur confirmer ouverture de la connexion
erreur_msg = erreur_msg & "_ Connection error to DB Source"
Exit Sub
End If
'Sélection des données les plus anciennes à auteur de maximum 1000 lignes sinon... surcharge au niveau de la boucle de traitement du recordset (J'ESPERE QUE CA VA PAS DURER)
Query_source = "SELECT * FROM f2e WHERE time_sys < CURRENT_DATE - INTERVAL " & Save_delay & " DAY ORDER BY 2 ASC LIMIT " & Max_row
Do While bit_red = True 'Boucle de traitement des données 1000 ligne à la fois. quand Query_source ne retournera plus rien bit_red sera Faux
Set rs = New ADODB.Recordset 'Declaration du recordset
rs.CursorLocation = adUseClient 'avec option UseClient pour ne pas surcharger le serveur source
rs.Open Query_source, conn_src 'execution de la requete Query_source Select
If rs.RecordCount > 0 Then
rs.MoveFirst
Set conn_dst = MySQL_Conn(IP_destination, "gpsdb", "gpsdb", "gpsdb") 'Ouverture connexion avec la base de données destination
If conn_dst.State = 0 Then 'Test de connexion OK
erreur_msg = erreur_msg & "_ Connection error to DB Destination"
Exit Sub
End If
Do 'A mon avis c'est la qu'il faut changer un truc mais si vous avez d'autres solutions... N'HESITEZ PAS
If rs.Fields(3) "Cnx" Or rs.Fields(3) "Pos" Then
Query_In = QuerySave_All(rs.Fields(1), rs.Fields(2), rs.Fields(3), rs.Fields(4), rs.Fields(5), rs.Fields(6) _
,rs.Fields(7), rs.Fields(8), rs.Fields(9), rs.Fields(10), rs.Fields(11), rs.Fields(12))
Else
Query_In = QuerySave_Part(rs.Fields(1), rs.Fields(2), rs.Fields(3), rs.Fields(4), rs.Fields(5), rs.Fields(6))
End If
conn_dst.Execute (Query_In) 'Exécution de l'INSERT pour 1 SEULE ligne (il y en a plusieurs MILLION)
'Suppression dans la base source de la sauvegarde effectuée précédemment
Query_Del = "DELETE FROM `f2e` WHERE `id`='" & rs.Fields(0) & "'"
conn_src.Execute (Query_Del)
rs.MoveNext
Sleep 7 'Evite au cpu de tourner comme un fou
DoEvents 'Evite à l'appli de rester bloquée
Loop Until rs.EOF = True
conn_dst.Close
Set conn_dst = Nothing
Else
bit_red = False
End If
rs.Close
Set rs = Nothing
Sleep 13 'Evite encore au cpu de devenir fou
DoEvents 'Evite encore au PC de croire que l'appli est folle
Loop
Y aurait il un moyen de faire un INSERT GENERAL de mon recordset???
Merci beaucoup à tous
Tibo
Foutez vous la paix les uns les autres.
Au lieu de nous la garder, y feraient mieux de nous la foutre.
Aldo y parle p'tetre pas pas anglais, mais lui au moins il a un bon accent.
Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011 28 juin 2010 à 14:31
Merci beaucoup pour cette reponse!
Je l'avais deja posé il y a deux semaine et j'ai toujours aucun retour... alors merci a toi Jack.
A vrai dire je suis tout nouveau en VB et je ne suis speciallement familier des commit, execute, query et nonquery.
Je crois voir ce qu'est un begin trans (debut de transaction)
mais dois je faire
conn_src.BeginTrans
conn_dst.BeginTrans
à la place de
conn_src.open()
conn_dst.open()
ou dois je le faire apres le open()?
Ensuite pour le conn_src.Committrans comment puis je associer ma connexion à ma requete (ou l'inverse?)
Merki beaucoup
Tibs
Foutez vous la paix les uns les autres.
Au lieu de nous la garder, y feraient mieux de nous la foutre.
Aldo y parle p'tetre pas pas anglais, mais lui au moins il a un bon accent.
Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011 28 juin 2010 à 15:29
Au fait je suis sur VB6 et pas sur Visual Studio en .NET (je dis ca parceque je trouve pas de tuto sur les transaction en VB6...?
Foutez vous la paix les uns les autres.
Au lieu de nous la garder, y feraient mieux de nous la foutre.
Aldo y parle p'tetre pas pas anglais, mais lui au moins il a un bon accent.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 juin 2010 à 16:02
Non, tu laisses les Open et tout le reste tel qu'il est, mais AVANT de commencer tes opérations de requète, tu fais le BeginTrans et une fois que tu as terminé, avant de faire le Close, tu fais le CommitTrans.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 juin 2010 à 16:08
Tu peux aussi penser un faire des lots de 200 requètes :
Tu les comptes (à chaque fois que tu fais un MoveNext) et quand tu en as vu 200 passer, tu fais un CommitTrans pour traiter ces 200 requètes, puis tu réouvres un BeginTrans pour le prochain lot.
Il faudra penser, de toute façon, à faire un CommitTrans en fin de traitement (si le comptage est <> de 0)
Ne sachant pas ce qu'il y a dans QuerySave_All ni dans QuerySave_Part (qui semblent être des Sub à toi), difficile de te dire si leur contenu est correct | compatible.
Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011 29 juin 2010 à 09:02
Bonjour. Et encore merci pour tes conseils.
Je n'ai pas encore eu le temps de tester ta méthode(je suis d'autres problèmes "plus urgent") mais d'ici cette aprem ou demain je test. Mes Sub QuerySave_All et QuerySave_Part ne font que construire des requêtes (s= s & "INSERT.....VALUES lalala j'ajoute les champs du recordset à une chaine de caractere) enfin QuerySave_xxx est la requete de fin(pour une seule ligne de données bien sur)
Pour les lots, je fait deja des lots de Max_Rows(10000 pour le moment, il y en a plusieurs million)
Je me demandais aussi, jusqu'ou remonte le rollback? que se passe t il si l'appli plante? avec mon code je supprime une ligne juste après l'avoir sauvegardé donc une ligne dupliqué max par problème... Je me demande aussi si avec le begin trans la connexion reste ouverte, j'utilise un recordset en adduseclient pour eviter de surcharger le serveur source(qui bosse deja ailleurs) donc normalement la connexion devrait être "plus ou moins" fermé entre deux exécution de requête. Est ce de même avec le begin trans?
Bonne journée
Tibo
Foutez vous la paix les uns les autres.
Au lieu de nous la garder, y feraient mieux de nous la foutre.
Aldo y parle p'tetre pas pas anglais, mais lui au moins il a un bon accent.
Tibo06530
Messages postés11Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention10 janvier 2011 1 juil. 2010 à 17:06
Salut à tous... surtout à toi Jack!
Merci, merci, merci beaucoup!
Ca marche pas encore aussi bien qu'un avion de chasse mais en tout cas beaucoup mieux qu'avec ma méthode. Grâce a toi mon soft est tout de meme 10 ou 12 fois plus rapide et sur 20 000 000 de lignes... ca fait une différence.
Merci encore et Bon moments à tous.
Tibo
Foutez vous la paix les uns les autres.
Au lieu de nous la garder, y feraient mieux de nous la foutre.
Aldo y parle p'tetre pas pas anglais, mais lui au moins il a un bon accent.