# [VB6][MySQL] Loop Fehler



## CrimeTime (18. November 2007)

Hallo Leute,
ich habe im Moment folgendes Problem,
ich greife mit meinem Programm auf eine MySQL Datenbank zu, das Funktioniert auch alles gut, aber dann habe ich eine Loop Schleife einbauen müssen weil er sonst nur die Erste Spalte anzeigt.

nun habe ich das Problem das er immer wieder nur die Erste Spalte abfragt von der Datenbank, ich möchte aber das er Jede abholt.

Jemand ne Idee?

Gruß CrimeTime


----------



## IT-Nobby (19. November 2007)

Hallo,
vor dem Loop Befehel
Recordset.MoveNext setzen.
Damit wird der Zeiger auf den nächsten Datensatz gestellt.
mfg
Nobby


----------



## CrimeTime (20. November 2007)

Funktioniert leider nicht so wie es sollte, hier die Loop Schleife;


```
Do While Not PrUpdater
    GetLinkId
    GetLinkUrl
    GetPreviousPR
    

    Chrlinkid = txt_linkid.Text
    Chrlinkurl = txt_linkurl.Text
    Chrpreviouspr = txt_previouspr.Text
    Chrnewpr = txt_newpr.Text
             
ListView1.ListItems.Add , , Chrlinkid
    With ListView1.ListItems(ListView1.ListItems.Count)
        .SubItems(1) = Chrlinkurl
        .SubItems(2) = Chrpreviouspr
        .SubItems(3) = Chrnewpr
        .SubItems(4) = Chrnewpr
        .EnsureVisible 'scroll
    End With

    GetLinkIdNext
    GetLinkUrlNext
    GetPreviousPRNext
    
    GoTo nextone
Loop
If MoveNext = True Then
GoTo Endone
            Else
                rs.MoveNext
                
Endone:
End if
```


----------



## Alex F. (21. November 2007)

abgesehen von den Gotos (schlechter Stil) ist dein Code jetzt auch nicht wirklich selbsterklärend da man nicht erkennen kann was du eigentlich machst  oder machen willst deswegen hier ein kurzes beispiel für den umgang mit recordsets:


```
set res = db.Openrecordset("Select Felda, Feldb From myTable") ' ich gehe davon aus die Db ist bereits geöffnet ( ado weicht beim Zugriff leicht ab!!) 

while not res.eof ' man kann es auch mit do loop machen while finde ich schöner
'auslesen Recordset
Listbox1.Items.add(res!Felda)
'erste alternative 
Listbox1.Items.add(res.Fields("Felda").value)
'zweite alternative 
Listbox1.Items.add(res.Fields(0).value) ' denkbar schlecht man weiss nicht was der Prog wollte 

res.movenext 
wend
```

Grüsse bb


----------



## CrimeTime (21. November 2007)

das wäre ja eine Geniale Lösung, nur damit komm ich nicht klar:


```
Set rs = db.OpenRecordset("Select ID, URL, PAGERANK From PLD_LINK")
```

bzw. kommt meine MySQL connection nicht mit db.OpenRecordset Klar, hier der code der mdl.*


```
Public Mysql_Connection As New adodb.Connection
Private rs As New adodb.Recordset

Public Server As String
Public Username As String
Public password As String
Public Database As String
Public Last_Query As String
Public Array_Query As Variant



Function Connect() As Boolean
 Connect = True
 
 'On Error GoTo Err
 
   If Mysql_Connection.State = adStateOpen Then Mysql_Connection.Close
      
   Mysql_Connection.Open "driver={MySQL ODBC 3.51 Driver};server=" & Server & ";uid=" & Username & ";pwd=" & password & ";database=" + Database
'     Form1.StatusBar1.SimpleText = "                                                            Mysql Status: Succsefully logged in!"
 Exit Function
  
Err:
 Connect = False
' Form1.StatusBar1.SimpleText = "                                                            Mysql Status: Connecting Failed!"
End Function


Function Query(SQL As String) As Boolean
'On Error Resume Next
        rs.Open SQL, Mysql_Connection
Do While Not rs.EOF
        MySQL.Last_Query = rs.GetString
        

            Call rs.MoveNext
        Loop
        rs.Close
    Set rs = Nothing
    
'rs.Close
End Function

Function Fetch_Array(Str As String) As Boolean
    MySQL.Array_Query = Split(Str, vbTab)
End Function

Function CloseConnection()
 Mysql_Connection.Close
 frmMain.StatusBar1.SimpleText = "                                                            Mysql Status: Disconnected!"
End Function
```


----------



## Alex F. (21. November 2007)

Ja wie ich schon geschrieben habe ich habe die Lösung mit der Dao gepostet die mit der ado ist in deinem Code

```
Mysql_Connection.Open "driver={MySQL ODBC 3.51 Driver};server=" & Server & ";uid=" & Username & ";pwd=" & password & ";database=" + Database

rs.Open SQL, Mysql_Connection

 ' und nun die schleife
' wie bei mir oben beschrieben.
```
wobei ich das problem sehe, das du dein sql in deine Funktion Query übergibst und somit in der Funktion nicht weisst welche Felder du im Zugriff hast. Das macht das auslesen schwierig.

Grüsse bb


----------



## CrimeTime (21. November 2007)

wie kann ich das denn verbessern, und ich weiß immer noch nicht wie ich dies: 

Set rs = db.OpenRecordset("Select ID, URL, PAGERANK From PLD_LINK")

Machen soll (rote)


edit:

nun habe ich es so:
Dim rs As New ADODB.Recordset
Dim db As Database
Set rs = New ADODB.Recordset

Set rs = db.OpenRecordset("Select ID,URL, PAGERANK From PLD_LINK")

nun kommt nur noch dieser fehler :

Object variable or With block variable not set.

(db ist nun gesetzt.) und der makiert das Set rs = db.OpenRecordset("Select ID,URL, PAGERANK From PLD_LINK")

Edit2:

nun ist es so

```
Public Sub GetMysqlData()
Dim PAGERANK As String
Dim ID As String
Dim URL As String
Dim rs As New ADODB.Recordset
Set rs = New ADODB.Recordset
Dim SQL As String

If SQL = "" Then
SQL = "Select ID, URL , PAGERANK From PLD_LINK"
End If

rs.Open SQL, Mysql_Connection
While Not rs.EOF
MySQL.Last_Query = rs.GetString
MsgBox (rs!ID)
Wend
Set rs = Nothing
End Sub
```

nun kommt der EOF und BOF fehler wieder ...


----------



## Alex F. (21. November 2007)

dein fehler liegt hier glaube ich


```
MySQL.Last_Query = rs.GetString
```

wobei mir gerade noch aufgefallen ist :


```
Dim rs As New ADODB.Recordset
Set rs = New ADODB.Recordset
```
das erste New also "Dim rs as ...."Solltest du aus Performance gründen weglassen.

Die If Abfrage ist ebenfalls überflüssig da SQL immer = "" ist .

Grüsse bb


----------



## CrimeTime (22. November 2007)

MySQL.Last_Query = rs.GetString 
kann ich zu
MySQL.Arary_Query = rs.GetString
oder so machen. aber NVM.

hast mir immer noch nicht meine frage beantwortet ^^


Edit:

nun ist der code so:


```
Public Sub GetMysqlData()
Dim PAGERANK As String
Dim ID As String
Dim URL As String
Dim rs As New ADODB.Recordset
Dim SQL As String

SQL = "Select ID, URL , PAGERANK From PLD_LINK"

rs.Open SQL, Mysql_Connection
While Not rs.EOF
MySQL.Array_Query = rs.GetString
MsgBox (rs!ID)
Wend
Set rs = Nothing
End Sub
```

das Gelbe wird Makiert, und dann kommt halt wieder der BOF und EOF fehler.


----------



## DrMueller (22. November 2007)

ich würd sowieso immer ein 

```
if rs.bof <> rs.eof then
```
vor der while Schleife dreinbasteln.
Sag doch mal den genauen Fehler beschrieb.


----------



## CrimeTime (22. November 2007)

Er Makiert das vom letzten Post

Run-time error '3021':

Entweder BOF oder EOF is True, oder der aktuelle Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen aktuellen Datensatz.

- das die Tabel/spalte nicht da is können wir sofort ausschliesen.!


----------



## ronaldh (22. November 2007)

bb hat Dir doch eigentlich alles schon ganz richtig geschrieben:


```
If rs.bof and rs.eof then
       Msgbox "Daten nicht gefunden", vbCritical
Else
       while not rs.eof ' man kann es auch mit do loop machen while finde ich schöner
            Listbox1.Items.add(rs!Felda)
           rs.MoveNext
      wend
End If
```




> bb schrieb auch:
> 
> dein fehler liegt hier glaube ich
> 
> ...



Das meine ich auch. Warum probierst Du denn nicht mal die Punkte, die man Dir hier vorschlägt?

Grüsse
ronaldh


----------



## CrimeTime (22. November 2007)

MySQL.Last_Query = rs.GetString  ist in
MySQL.Array_Query geändert worden.
und der fehler ist auch mit dem code nach wie vor der selbe!


----------



## Alex F. (23. November 2007)

Was SOLL DAS 


```
MySQL.Last_Query = rs.GetString
```



> MySQL.Array_Query geändert worden.


macht auch keinen Sinn

was möchtest du damit erreichen ? 

Willst du deine Daten auslesen ? Dann halte dich an unsere Ratschläge willst du was ganz anderes dann *präzisiere* bitte dein Problem. 

Grüsse bb


----------



## CrimeTime (23. November 2007)

ja bb das könnte aus dem code, aber fehler wäre dann immer noch da.#

der Aktuelle Code


```
Public Sub GetMysqlData()
Dim PAGERANK As String
Dim ID As String
Dim URL As String
Dim rs As New adodb.Recordset
Dim SQL As String

SQL = "Select ID, URL , PAGERANK From PLD_LINK"
rs.Open SQL, Mysql_Connection
Do While Not rs.EOF

txt_linkid.Text = (rs!URL)
rs.MoveNext
Set rs = Nothing
Loop
End Sub
```

dann makiert er das gelbe und schreibt folgenden fehler:

Run-time error '3704':

Der Vorgang ist für ein geschlossenes OBjekt nicht zugelassen.


----------



## Alex F. (24. November 2007)

Jetzt hast du den Fehler definitiv hier

```
Set rs = Nothing
```
das muss *nach* der Schleife erfolgen.

Grüsse bb


----------



## CrimeTime (24. November 2007)

danke brain, das funktioniert nun wie geschmiert, aber nun macht der immer nur eine URL, und die is dann im Loop. der soll ja alle machen, nun sind wir soweit wie beim Ersten Post von diesem Thread hier der code von dem Loop :


```
Do While Not PrUpdater
GetMysqlData
    

    Chrlinkid = txt_linkid.Text
    Chrlinkurl = txt_linkurl.Text
    Chrpreviouspr = txt_previouspr.Text
    Chrnewpr = txt_newpr.Text
             
ListView1.ListItems.Add , , Chrlinkid
    With ListView1.ListItems(ListView1.ListItems.Count)
        .SubItems(1) = Chrlinkurl
        .SubItems(2) = Chrpreviouspr
        .SubItems(3) = Chrnewpr
        .SubItems(4) = Chrnewpr
        .EnsureVisible 'scroll
    End With

Loop
            
            
    Set PrUpdater = Nothing
```


----------



## Alex F. (26. November 2007)

Ich glaube das liegt daran, dass du 2 Schleifen hast. In der ersten läufst du durch dein Recordset hier schreibst du die Daten in eine Textbox ( aber nur einen Datensatz ). Dann liest du die Daten aus deiner Textbox in ein Listview und zwar so lange bis prUpdater true liefert.
Demnach hast du hier irgendwie einen logischen Fehler. Wieso lässt du nicht in der Funktion  in der du dein Recordset öffnest direkt deine Listbox befüllen ? Du brauchst nur eine Schleife.

Grüsse bb


----------



## ronaldh (27. November 2007)

Crimetime,

mit jedem neuem Tipp, den Du hier bekommst, baust Du neue Fehler ein. An Deiner Stelle würde ich das ganze nochmal neu machen, denn an und für sich ist dies eine wirklich simple Schleife. Deine Programmlogik ist so unnötigerweise kompliziert, dass Du selbst den Überblick nicht mehr hast. Und wenn wir versuchen Dir zu helfen, müssen wir durch alle Posts blättern, um zu sehen, welche Funktion nun was macht.

Schau Dir doch mal diesen Tipp an. Da ist eine ähnliche Schleife, die Grid oder Listview befüllt, beschrieben. 

Viele Grüsse
ronaldh


----------



## CrimeTime (2. Dezember 2007)

Das Loop Problemchen habe ich nun mit Splitit gelöst, somit Splitte ich nun alle Datensätze richtig.

Doch nun ist ein neuer Fehler aufgetreten mit Update Table, ich benutze Folgenden Code:


```
'Erklärung: PRSetting = Die Spalte wo der Alte PR drinne ist, und Chrnewpr ist der wert der geändert werden soll.

rs.Fields(PRSetting).Value = Chrnewpr
rs.Update
```

Das Gelbe Teil des Codes wird Markiert, und diese Fehlermeldung kommt:


```
Run-time error '3251':

Das aktuelle Recordset unterstützt keine Aktualisierung. Hierbei handelt es sich möglicherweise um eine Einschränkung seitens des Providers oder des gewählten LockTypes.
```

Ausgeschlossen werden kann das die Einschränkungen vom Provider sind.

Code des Recordset's:

```
Do While Not rs.EOF
'zwischen Code entfernt, schon in vorherigen Posts, hat sich nichts ran geändert.
Loop
Set rs = Nothing
```

Hoffe jemand hat eine Idee wie wir das noch beheben können um diesen Thread endlich als Erledigt zu Markieren 

Gruß CrimeTime


----------



## Alex F. (3. Dezember 2007)

*Ja*

Du hast das Recordset ReadOnly geöffnet


----------



## CrimeTime (4. Dezember 2007)

und wie muss ich es ändern das er auch die Table bzw Spalte Updaten kann?


----------



## Alex F. (4. Dezember 2007)

Vielleicht so 

*adocon.Mode = adModeReadWrite*


----------



## CrimeTime (5. Dezember 2007)

mi dem code kommt der nicht klar, auch nicht mit : 
	
	
	



```
rs.Mode = adModeReadWrite
```

wäre nett von dir wenn du mir ein kleines Update beispiel schreiben könntest, da ich das bissher noch nicht gemacht habe.


Gruß CrimeTime


----------



## Alex F. (5. Dezember 2007)

der mode bezieht sich auf die *Connection* und nicht auf das Recordset

Grüsse bb

PS: Ich hatte gehofft man erkennt es an der benennung der Variablen ;-)


----------



## CrimeTime (6. Dezember 2007)

habe da nun etwas mit rum gedoktort, aber komme da absolut nicht weiter. hier der End code den ich bissher habe.


```
Public Function UpdatePageRank()
Dim i As Integer
Dim DBPR As String
Dim PRSettingx As String
Dim TabelSettingx As String
Dim Chrnewpr As String
Dim rs As New adodb.Recordset
TabelSettingx = txttabel.Text
PRSettingx = txtcpr.Text

If UpdatePR = "" Then
UpdatePR = " "
Else
End If

UpdatePR = Chrnewpr
previouspr = "SELECT PAGERANK FROM PLD_LINK"
rs.Open previouspr, Mysql_Connection
Do While Not rs.EOF

     rs.Fields(txtcpr.Text).Value = Chrnewpr
     rs.Update
  rs.Close
  
  Set rs = Nothing
Loop
End Function
```

hoffe es ist nicht alt so viel falsch 

Gruß CrimeTime


Edit: habe grade noch ein wenig rum probiert, sieht aus als ob das gehen würde, aber auch irgendwie nicht

hier der bissherige code:


```
Private Sub CmdUpdate_Click()
Dim Conn As ADODB.Connection
Dim rs As ADODB.Recordset
Set Conn = New ADODB.Connection
MySQL.Connect
Set rs = New ADODB.Recordset
   rs.CursorType = adOpenStatic
   rs.CursorLocation = adUseClient
   rs.LockType = adLockPessimistic
   rs.Open "SELECT " & txtcpr.Text & " FROM " & txttabel.Text & "", Mysql_Connection

rs.AddNew
rs.Fields(txtcpr.Text).Value = Chrnewpr
rs.Update
Set rs = Nothing

End Sub
```

weil ich denke der hat ka welche ID es ist, aber es kommt kein fehler, und änderungen werden glaube auch nicht vorgenommen.


----------

