Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 25973 Skopiuj do schowka Zasilenie danymi z XLSa bazy SQL Server 2005 (64bit) z Excel
Autor Wiadomość
OShon 
Excel Expert



Zaproszone osoby: 41
Pomógł: 620 razy
Posty: 2037
Wysłany: 2011-12-12, 12:33   

W połączeniu masz jeszcze jedno oznaczenie schematu, po za tym skoro I% jest nazwą adresu komórki to należy to w kodzie określić zakresem.
Kod:
czyszczenie = "DELETE FROM CSR.dbo.sales WHERE Month_v='" & range("I5").value & "'"
_________________
MVP Office System, moderator Outlook.pl|WSS.pl|CodeGuru.pl, praca: Business Developer, blog: VBATools
ID posta: 140459 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

shyha
Starszy Forumowicz


Posty: 50
Wysłany: 2011-12-12, 12:47   

Dzięki! Działa!

Wracając do przyśpieszenia ładowania danych do SQL Server (w tej chwili trwa to ponad godzinę) chciałem zaimplementowac kod kolegi @tkuchta1.

Zastanawiam się tylko jak to ma się łączyć z moim DSN ?


tkuchta1 napisał/a:
słuchajcie..
Ja może, jeżeli chodzi o mySQL, to raczej teoretyk jestem bo tematowi poświęciłem może kilka godzin w życiu :-P

ale moja procedura do której link podałem wyżej:
może i cięższa bo trzeba parametryzować zapytanie, określić tablicę parametrów, podać odpowiednie typy dla każdej kolumny, (...)
Sama procedura Exportująca przykładowe dane XL'a do mySQL wygląda u mnie
Kod:
Sub InsertIntoTableSQL_ADO()
    On Error GoTo InsertIntoTableSQL_ADO_Error

    Dim objConnection As Object    'ADODB.Connection
    Dim objCommand As Object    'ADODB.Command
    Dim bTrans As Boolean
    Dim strSQL_CreateTable As String
    Dim strSQL As String

    Set objConnection = CreateObject("ADODB.Connection")
    With objConnection
        .CursorLocation = adUseClient
        .Mode = adModeWrite
        .Open fConnString
        .BeginTrans
        bTrans = True
    End With

    Set objCommand = CreateObject("ADODB.Command")
    With objCommand
        .ActiveConnection = objConnection
        .CommandType = adCmdText

        .CommandText = "INSERT INTO `" & strTblName & "` (`ID`, `pole1`, `pole2`, " & _
                                                         "`pole3`, `pole4`, `pole5`, " & _
                                                         "`pole6`,`pole7`, `pole8`, `pole9`) " & _
                       "VALUES (?,?,?,?,?,?,?,?,?,?);"
        .Prepared = True
        .Parameters.Append .CreateParameter(Name:="F1", _
                                            Type:=adInteger, _
                                            Direction:=adParamInput)
        .Parameters.Append .CreateParameter(Name:="F2", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F3", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F4", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F5", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F6", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F7", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F8", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F9", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
        .Parameters.Append .CreateParameter(Name:="F10", _
                                            Type:=adVarChar, _
                                            Direction:=adParamInput, _
                                            Size:=10)
     
        Dim xlWks As Excel.Worksheet, tbl As Variant, i As Long, j  As Integer
        Dim tblParam(0 To 9) As Variant
        Set xlWks = ThisWorkbook.Worksheets("Arkusz1")
        tbl = xlWks.[A1:K15000]
 
        For i = 1 To 15000
            For j = 1 To 10
                tblParam(j - 1) = tbl(i, j)
            Next

            .Execute Parameters:=tblParam, Options:=adExecuteNoRecords
        Next
       
        Set xlWks = Nothing
    End With

    MsgBox "INSERT INTO przeszło :-)", vbInformation

    objConnection.CommitTrans
    bTrans = False

InsertIntoTableSQL_ADO_Exit:
    On Error Resume Next
    Set objCommand = Nothing
    CloseConObject objConnection
    Exit Sub

InsertIntoTableSQL_ADO_Error:
    If bTrans Then
        objConnection.RollbackTrans
    End If
    MsgBox "Unexpected error - " & Err.Number & vbCrLf & vbCrLf & _
           Err.Description, vbExclamation, "VBAProject - InsIntMDBADO"
    Resume InsertIntoTableSQL_ADO_Exit

End Sub

(fConnString, CloseConObject, stałe i cała reszta na mojej stronie)

Exportuje zakres A1:K15000 do bazy mySQL w ~15sek.


poprawcie mnie jeżeli się mylę ale może wydajniej wykorzystywać
"ADODB.Command" .Execute
niż
"ADODB.Recordset" .Open

?? :-)
ID posta: 140462 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

zbiniek 
ExcelSpec



Pomógł: 160 razy
Posty: 725
Wysłany: 2011-12-12, 13:33   

shyha napisał/a:
Dzięki! Działa!


Całkiem niedawno
zbiniek napisał/a:
Potem ewentualnie sprawdź czy Month_v jest równe I5.Value.
:talk

Ale dobrze, że w końcu wszystko zadziałało.
_________________
pzdr
zbiniek

Prawdopodobieństwo otrzymania satysfakcjonującej odpowiedzi jest proporcjonalne do właściwego sformułowania problemu (popartego załącznikiem)

Jest załącznik - jest impreza

http://rtfm.killfile.pl/
ID posta: 140467 Skopiuj do schowka
 
 
 
shyha
Starszy Forumowicz


Posty: 50
Wysłany: 2011-12-12, 14:01   

Zapomniałem o RANGE. VBA się dopiero uczę od podstaw :P
ID posta: 140469 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

OShon 
Excel Expert



Zaproszone osoby: 41
Pomógł: 620 razy
Posty: 2037
Wysłany: 2011-12-12, 14:44   

shyha napisał/a:
poprawcie mnie jeżeli się mylę ale może wydajniej wykorzystywać
"ADODB.Command" .Execute
niż
"ADODB.Recordset" .Open

Standardowo:
Otwierasz połączenie 1 raz
W pętli przetwarzasz dane pchasz je do bazy rekordsetem (tutaj ilość parametrów, procek, sieć mają kluczowe znaczenie).
Zamykasz połączenie.

W metodzie jaką podał Tomek to
jest identycznie - jednakże on pcha to do tablicy względem parametrów w nie wywołuje za każdym razem rs, ale jednorazowa wciska tam tabele.
Jest to efektywniejsze przy większej ilościach danych.

Ja jako dinozaur lobię jednak standardowa metodę bo mogę przypisać stan exportu pod pasek postępu. a zamknięcie połączenia nic nie trwa, u tomka to jest odwrotnie zbieranie do tablicy może być krótsze nić zatwierdzenie rs. Z drugiej strony ja mam inne bazy bo działam na Oraclu- może MySQL lub MSSQL jest inaczej z wydajnością względem VBA.
_________________
MVP Office System, moderator Outlook.pl|WSS.pl|CodeGuru.pl, praca: Business Developer, blog: VBATools
ID posta: 140478 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum