2010-06-23 8 views
2

QUESTION MISE À JOUR ... VOIR CI-DESSOUSAjout de données à partir d'Excel à Mysql via VBA

J'ai une feuille Excel qui accède à un DB MySQL en tant que back-end ....

-je insérer de nouveaux enregistrements dans MySql la façon suivante, mais je ne suis pas sûr si c'est le meilleur moyen.

For rowline = 1 To 50 
    strSQL = myquerystring (INSERT 5 columns per excel row)      
    rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic 
Next rowline 

Fondamentalement, la chaîne d'interrogation passe à travers chaque ligne de feuille Excel (de 1 à 50) et les données sur certaines cellules sont ajoutés à la requête SQL, puis inséré avec rs.Open .... (Chaque rangée a 5 colonnes qui sont insérées comme un enregistrement)

Tout fonctionne bien, mais je veux juste savoir s'il y a un moyen plus rapide (une seule requête INSERT), en insérant tous les 50 (et 5 colonnes sur chaque), de la rangée 1 à 50, tout à la fois.

En ce moment, il fait 50 requêtes INSERT individuelles, donc j'essaie de réduire cela à 1 mais je ne sais pas si c'est possible.

NOUVELLES INFORMATIONS:

Salut, suivant vos conseils et liens et quelques recherches sur Google, je me suis retrouvé avec le code suivant ... Il fonctionne très bien, mais pour insérer 100 lignes qu'il faut (merci!) environ 15 secondes .... c'est beaucoup trop. J'espère que je peux obtenir du code/des idées sur la façon d'exécuter la requête une fois, (en insérant toutes les 100 lignes dans un coup). S'il vous plaît noter que je suis un débutant sur ce sujet, donc si vous pouvez me mélanger dans quelques échantillons sur la façon dont il devrait être fait, il sera très apprécié.

Public Sub INSERT_to_MySQL() 

    Dim conn As ADODB.Connection 
    Dim cmd As ADODB.Command 
    Dim strSQL As String 

    app_enable_false 

    On Error GoTo no_DB_connection_error 
resume_after_connecting: 

    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = oConn 

    ' LOOP and INSERT the data 
    ' 100 rows take approx 15 seconds to INSERT 
    For rowcursor= 1 To 100 
       the_table = "`global`.`filesaved` " 
       strSQL = "INSERT INTO " & the_table & " (Client_Name, OriginCity, DestinationCity, ValidFrom, ValidTo, Quote_Number, Cost1, Cost2, Cost3) " 
       strSQL = strSQL & " VALUES ('" & esc(Range("BB" & rowcursor)) & "','" & esc(Range("BC" & rowcursor)) & "','" & esc(Range("BD" & rowcursor)) & "','" & Format(Range("BE" & rowcursor), "yyyy-mm-dd") & "','" & Format(Range("BF" & rowcursor), "yyyy-mm-dd") 
       strSQL = strSQL & "','" & esc(Range("BH" & rowcursor)) & "','" & esc(Range("BJ" & rowcursor)) & "','" & esc(Range("BK" & rowcursor)) & "','" & esc(Range("BJ" & rowcursor)) & "')" 
       cmd.CommandText = strSQL 
       cmd.Execute 
    Next rowcursor 

    app_enable_true 

    Exit Sub 

no_DB_connection_error: 

    ConnectDB 
    GoTo resume_after_connecting 

End Sub 
+0

Peut être intérêt: http: // stackoverflow.com/questions/2821718/excel-vba-écriture-à-mysql-base de données/2821911 # 2821911 – Fionnuala

+0

merci Remou/tout pour votre entrée. Je vais évidemment dans le mauvais sens et j'ai beaucoup à apprendre. – griseldas

Répondre

0

Si je lance une déclaration et ne vous attendez pas une réponse en arrière, je vais habituellement pour l'objet Command en VBA.

0

Je voudrais déplacer la commande d'ouverture en dehors de la boucle, puis utiliser la méthode Execute pour faire les insertions dans la boucle. Vous ne voulez pas ouvrir la base de données à chaque fois. Voici une bonne page de ADO methods.

Voici une question sur Batch Inserting (et Mise à jour). En regardant le lien de Remou dans son commentaire, j'ai réalisé que vous n'avez probablement même pas besoin de l'ouvrir. Utilisez simplement la méthode Execute pour les insertions.

1

Vous trouverez ci-dessous un processus qui fonctionne, au cas où quelqu'un d'autre aurait dans le futur le même problème. Peut-être pas la meilleure solution, mais 100 enregistrements sont enregistrés en une fois en moins d'une seconde, ce qui est ce que je recherchais. En outre, il n'y a qu'une seule requête d'insertion fait (au lieu de 100 types différents pour chaque ligne.

Merci à tous pour vos conseils.

Dim conn As ADODB.Connection 
    Dim cmd As ADODB.Command 
    Dim rst_recordset As ADODB.Recordset 
    Dim strSQL As String 
    Dim strSQL2 as string 


    On Error GoTo no_DB_connection_error 
resume_after_connecting: 

    Set cmd = New ADODB.Command 
    cmd.ActiveConnection = oConn 

    ' LOOP and INSERT the data 
    lastrow = Range("BB65536").End(xlUp).Row 



       the_table = "`global`.`filesaved` " 
       strSQL = "INSERT INTO `global`.`filesaved` " & " (Client_Name, OriginCity, DestCity, ValidFrom, ValidTo, Quote_Number, Cost1, Cost2, Cost3) VALUES " 
       strSQL2 = "" 
       For excel_row = 1 To lastrow 
        strSQL2 = strSQL2 & " ('" & cells(excel_row,1) & "','" & cells(excel_row,2) & "','" & cells(excel_row,3) & "','" & cells(excel_row,4) & "','" & cells(excel_row,5) & "','" & cells(excel_row,6) & "','" & cells(excel_row,7) & "','" & cells(excel_row,8) & "','" & cells(excel_row,9) & "') ," 
       next excel_row 

       strSQL = strSQL & strSQL2 
       Mid(strSQL, Len(strSQL), 1) = ";" ' gets rid of the last comma 

       cmd.CommandText = strSQL 
       cmd.Execute 
0

Ce code a fonctionné pour moi

Sub insertdata() 

Dim year As String 

Set rs = CreateObject("ADODB.Recordset") 
Database_Name = Range("b3").Value ' Name of database 
User_ID = Range("b4").Value 'id user or username 
Password = Range("b5").Value 'Password 
Server_Name =Range("b2").Value 

' Query for fetching Maximum Date 
    ' LOOP and INSERT the data 
    lastrow = Range("BB65536").End(xlUp).Row 



       the_table = "`admin`.`test` " 
       strSQL = "INSERT INTO `drawing`.`test` " & " (tests,test2) VALUES " 
       strSQL2 = "" 
       For excel_row = 1 To 100 
        strSQL2 = strSQL2 & " ('" & Cells(excel_row, 1) & "','" & Cells(excel_row, 2) & "') ," 
       Next excel_row 

       strSQL = strSQL & strSQL2 
       Mid(strSQL, Len(strSQL), 1) = ";" ' 
' ADODB connection 
Set Cn = CreateObject("ADODB.Connection") 'NEW STATEMENT 
Cn.Open "Driver={MySQL ODBC 5.1 Driver};Server=" & Server_Name & ";Database=" & Database_Name & _ 
";Uid=" & User_ID & ";Pwd=" & Password & ";" 


rs.Open strSQL, Cn, adOpenStatic 

Dim myArray() 


End Sub 
Questions connexes