ID tematu: 25973
 |
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
|
|
|
 |
|
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
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
|
|
|
 |
|
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. |
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
|
|
|
 |
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
|
|
|
 |
|
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
|
|
|
 |
|
|
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
|
| |
| |