Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: MYSQL A ADODB

Witam,

Mam problem z pobraniem danych z serwera MySql przez ADODB w Excelu. Poniższy kod zwraca dane w dziwnej postaci. Pierwsza kolumna jest ok (kompletna) dla wszystkich rekordów. Dla wszystkich pozostałych rekordów tylko w rekordzie nr 257 są dane dla wszystkich kolumn. Reszta jest pusta, choć w bazie faktycznie jest inaczej.

Wygląda to mniej więcej tak:


lp pracownik cel1 cel1zaliczony
1 nr1
2 nr2
3 nr3

257 nr257 cel1 1
258 nr258
259 nr259



Kolumny 1,2,3...258,259... w bazie nie są puste. Co jest nie tak?

Kod wygląda tak:


Sub sJoomla()
Dim wksZeszyt As Worksheet
Dim rngStartowa As Range
Dim strSql As String

Set wksZeszyt = ThisWorkbook.Worksheets("cele_joomla")
Set rngStartowa = wksZeszyt.Range("A1")
strSql = "select pracownik, cel1, cel2, cel3, cel4, cel1zaliczony, cel2zaliczony, cel3zaliczony, cel4zaliczony from jos_gti_cele where okres = '201109' order by pracownik"
wksZeszyt.Cells.Clear
fKopiujRekordsetDoKomorki rngStartowa, fDajRekordset(enuTekst, strSql, , fDajPolaczenie(enuJoomla), adOpenStatic), True, True

MsgBox "Gotowe!"
End Sub



Function fDajPolaczenie(Optional enuPolaczenie As enuPolaczenia = 1) As ADODB.Connection
Dim strLancuch As String
Dim adodbPolaczenie As New ADODB.Connection


'If blnUkryjBledy Then On Error GoTo regionBlad

If enuPolaczenie = enuJoomla Then strLancuch = "Driver={MySQL ODBC 5.1 Driver};Server=xxx;Database=gti_joomla;User=xxx;Password=xxx;Option=3"

With adodbPolaczenie
.ConnectionString = strLancuch
.Open
End With

Set fDajPolaczenie = adodbPolaczenie
Exit Function

regionBlad:
MsgBox "Uwaga! Wystąpił błąd przy utworzeniu połączenia.", vbCritical
Set fDajPolaczenie = Nothing
End Function



Function fDajRekordset(enuKomenda As enuKomendy, strTekst As String, _
Optional varParametry As Variant, Optional adodbPolaczenie As ADODB.Connection, _
Optional enuTypKursora As CursorTypeEnum = adOpenForwardOnly, Optional enuLokacjaKursora As CursorLocationEnum = adUseServer) As ADODB.Recordset
Dim adodbRekordset As New ADODB.Recordset
Dim adodbKomenda As New ADODB.Command
Dim adodbParametr As ADODB.Parameter
Dim i As Integer

'If blnUkryjBledy Then On Error GoTo regionBlad

If adodbPolaczenie Is Nothing Then
Set adodbPolaczenie = fDajPolaczenie
End If

With adodbRekordset
.CursorType = enuTypKursora
.CursorLocation = enuLokacjaKursora
End With

With adodbKomenda
.ActiveConnection = adodbPolaczenie
If enuKomenda = enuProcedura Then .CommandType = adCmdStoredProc
If enuKomenda = enuTabela Then .CommandType = adCmdTable
If enuKomenda = enuTekst Then .CommandType = adCmdText
.CommandText = strTekst
.CommandTimeout = mintLimitCzasu

.Parameters.Refresh
If Not IsMissing(varParametry) Then
For i = LBound(varParametry, 1) To UBound(varParametry, 1)
.Parameters(varParametry(i, 0)).Value = varParametry(i, 1)
Next i
End If

Set adodbRekordset = .Execute
End With

Set fDajRekordset = adodbRekordset
GoTo regionCzysc

regionBlad:
MsgBox "Uwaga! Wystąpił błąd przy pobraniu rekordsetu.", vbCritical
regionCzysc:
Set adodbRekordset = Nothing
Set adodbPolaczenie = Nothing
Set adodbKomenda = Nothing
Set adodbParametr = Nothing
End Function



Function fKopiujRekordsetDoKomorki(rngKomorka As Range, adodbRekordset As ADODB.Recordset, Optional blnCzyNaglowki As Boolean, Optional blnCzyDopasowac As Boolean = True) As Boolean
Dim adodbPole As ADODB.Field
Dim intIle As Integer
Dim varNaglowki As Variant
Dim i As Integer
Dim j As Integer

'If blnUkryjBledy Then On Error GoTo regionBlad

j = 1
If blnCzyNaglowki Then
With adodbRekordset
intIle = .Fields.Count
ReDim varNaglowki(intIle - 1)

i = -1
For Each adodbPole In .Fields
i = i + 1
If Len(adodbPole.Name) > 0 Then
varNaglowki(i) = adodbPole.Name
Else
varNaglowki(i) = "Pole" & i
End If

Next adodbPole
End With

rngKomorka.Cells(j, 1).Resize(, intIle).Value = varNaglowki
j = j + 1
End If

With rngKomorka
.Cells(j, 1).CopyFromRecordset adodbRekordset
If blnCzyDopasowac Then .Worksheet.Columns.EntireColumn.AutoFit
End With

fKopiujRekordsetDoKomorki = True
Exit Function

regionBlad:
MsgBox "Uwaga! Nie można skopiować rekordsetu do komórki.", vbCritical
fKopiujRekordsetDoKomorki = False
End Function

konto usunięte

Temat: MYSQL A ADODB

Witam,

poeksperymentuj z cursorType i cursorLocation.
Miałem podobne problemy przy MS Access i CopyFromRecordset i jeśli dobrze pamiętam to pomogło cursorType=adOpenForwardOnly.
Jutro odświeżę pamięć, to potwierdzę dokładnie.

pozdr.

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: MYSQL A ADODB

Wojciech Gardziński:
http://afin.net/artykuly/controlling/Art_ADO4Excel.htm
Panie Wojciechu, proszę o podpowiedź :)
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: MYSQL A ADODB

Jarosław G.:
Witam,

poeksperymentuj z cursorType i cursorLocation.
Miałem podobne problemy przy MS Access i CopyFromRecordset i jeśli dobrze pamiętam to pomogło cursorType=adOpenForwardOnly.
Jutro odświeżę pamięć, to potwierdzę dokładnie.

pozdr.
Domyślnie mam właśnie na adOpenForwardOnly.

konto usunięte

Temat: MYSQL A ADODB

Bartosz Borczyk:
Jarosław G.:
Witam,

poeksperymentuj z cursorType i cursorLocation.
Miałem podobne problemy przy MS Access i CopyFromRecordset i jeśli dobrze pamiętam to pomogło cursorType=adOpenForwardOnly.
Jutro odświeżę pamięć, to potwierdzę dokładnie.

pozdr.
Domyślnie mam właśnie na adOpenForwardOnly.

Ale w wywołaniu ustawiasz na adOpenStatic.
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: MYSQL A ADODB

Jarosław G.:
Bartosz Borczyk:
Jarosław G.:
Witam,

poeksperymentuj z cursorType i cursorLocation.
Miałem podobne problemy przy MS Access i CopyFromRecordset i jeśli dobrze pamiętam to pomogło cursorType=adOpenForwardOnly.
Jutro odświeżę pamięć, to potwierdzę dokładnie.

pozdr.
Domyślnie mam właśnie na adOpenForwardOnly.

Ale w wywołaniu ustawiasz na adOpenStatic.
Faktycznie. Ale w pierwszej kolejności próbowałem z wartością domyślną. Z nią nie wyszło, to zacząłem kombinować ze statikiem.

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: MYSQL A ADODB

Ale ale. Przecież ja używam CopyFromRecordset. Biegam tylko po nazwach pól, aby wrzucić sobie nagłówki. Mnie chodzi o bebechy, które średnio mi się chcą pokazać.

konto usunięte

Temat: MYSQL A ADODB

jedyne co mi przychodzi do głowy to mapowanie typów danych między MySQL a ADO - tu może być problem. mogło by pomóc użycie CAST po stronie MySQL-a

konto usunięte

Temat: MYSQL A ADODB

Ok,
po odświeżeniu:
używałem forwardOnly i dynamic i oba działały ok.
Może spróbuj z dynamic i ewentualnie dodaj:

recordSet.MoveLast
recordSet.MoveFirst

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora

Następna dyskusja:

ORACLE VB EXCEL ADODB




Wyślij zaproszenie do