zwei Tabellen aus einer DB auslesen

cybergnom

Mitglied
Hallo,

da die überarbeitete Suchfunktion zum Thema Datenbanken ganze drei (!!!) Treffer zeigt, sehe ich mich gezwungen, einen neuen Thread aufzumachen.

Folgendes Problem:

Ich habe 2 Tabellen in einer Datenbank. Eine mit Benutzerdaten, eine andere mit den Titeln von Beiträgen und den Beiträgen selbst. Diese würde ich nun gerne verknüpfen (also Benutzer A (aus Tabelle 1) hat den Text B (aus Tabelle 2) geschrieben.

Die habe ich folgendermaßen versucht:


Dim user As ADODB.Recordset
Dim txt As ADODB.Recordset
Dim conn As ADODB.Connection

Set txt = New ADODB.Recordset
Set user = New ADODB.Recordset
Set conn = New ADODB.Connection
conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Data Source"

Dim username As String
Dim Text As String

txt.Open "SELECT * FROM texte", conn, adOpenStatic, adLockPessimistic

If txt.RecordCount > 0 Then

txt.MoveFirst
Do While Not rs.EOF
Text = CStr(user.Fields("text"))
Datum = CStr(user.Fields("Datum"))
username = CStr(user.Fields("Nickname"))

user.Open "SELECT email FROM user WHERE nickname = " & username, conn, adOpenStatic, adLockPessimistic
email = CStr(txt.Fields("email"))

txt.MoveNext
Loop

End IF


Wenn ich das nun so laufen lasse, bekomme ich folgenden Fehler:

Die Operation ist für ein geöffnetes Objekt nicht zugelassen

gemeint ist damit die Zeile:
user.Open "SELECT email FROM user WHERE username = " & username, conn, adOpenStatic, adLockPessimistic

Weiß einer, was falsch ist? Bzw. bräuchte ich Rat, wie es richtig geht, da ich die Fehlermeldung verstehe.
Brauche ich eventuell zwei seperate DBs???

MfG
cyber
 
Zuletzt bearbeitet:
Servus!

Schau dir mal mein Videotutorial an ... musst nur den Connection String anpassen

Code:
Dim rs As ADODB.Recordset

Private Sub Command1_Click()

Set rs = New ADODB.Recordset

With rs                 'Hier dein Connection String ...
    .ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\tutv4.mdb;Persist Security Info=False"
    .LockType = adLockOptimistic
    .CursorType = adOpenDynamic
    .CursorLocation = adUseClient
    .Open "Select * from moderator"
End With

MsgBox rs.GetString

rs.Close

End Sub

http://www.tutorials.de/tutorials93488.html

Gruss Tom
 
Hallo Tom,

wie ich nen DB-Zugriff hinbekomme, weiß ich.
Ich weiß nur nicht, wie ich zwei Tabellen gleichzeitig auslesen kann.

Ist das in VB überhaupt möglich???

In PHP würde ich es (ungefähr) so machen:


PHP:
<?
// User aussuchen
$res1 = mysql_query("SELECT * FROM table1", $db);
while ($row1 = mysql_fetch_array($res1))
{
    //zugehörige Texte ausgeben
    $res2 = mysql_query("SELECT * FROM table2 WHERE news_id = " . $row1['id'], $db);
}

?>

Kann man das mit VB auch verwirklichen?

MfG
cyber
 
Servus!

Leider kann ich aus deinem PHP Beispiel nicht erkennen, was du gerne tun willst, da die beiden Abfragen in keinerlei Beziehung zueinander stehen ...

Gruss Tom
 
Hallo,

folgendes Problem:

ich habe eine Datenbank mit den Tabellen user und texte.

In der Tabelle user sind alle user-relevanten Daten gespeichert (Name, Nickname, email, usw.). In der texte-Tabelle sind alle Texte mit Datum und Verfasser-Nickname abgelegt.

Bei der Ausgabe will ich nun zu jedem Text den entsprechenden Nickname und die zugehörige eMail-Adresse ausgeben. Da die eMail-Adresse aber in der User-Tabelle gespeichert ist, muss ich auch noch irgendwie auf diese zugreifen und nicht nur auf die Tabelle "texte".
Das soll dann quasi so aussehen:


Lese Tabelle "texte"
Für den ersten Eintrag mache:
Gib den Text mit Datum und Nick aus
Lese Tabelle "user" wo Nickname gleich dem Nickname des Verfassers
Gib aus der Tabelle "user" die entsprechende eMail-Adresse aus
Spring zum nächsten Eintrag der Tabelle "texte"


Hoffe, Du verstehst, was ich meine!?

MfG
cyber
 
Servus!

Code:
Dim rs1 as AdDb.recordset
Dim rs2 as AdDb.recordset

...

rs1.open "Select * from tblTexte"

rs1.movefirst

while not rs1.eof 

    rs2.open "Select * from tblUser where Name = '" & rs1!Name & "'"

    rs2.moveFirst

    MsgBox "" & Rs2!email
    rs2.close

rs1.moveNext 
wend

...

Gruß Tom
 
Hallo,

erstmal Dank für die schnelle Hilfe, aber

wieder die Fehlermeldung:

Die Operation ist für ein geöffnetes Objekt nicht zugelassen

in der Zeile:

rs2.open "Select * from tblUser where Name = '" & rs1!Name & "'"

noch ne Idee?

MfG
cyber
 
Servus!

Code:
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset

Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset

With rs1

    .ActiveConnection = CurrentProject.Connection 'Dein Connection String
    .CursorLocation = adUseClient
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic

End With

With rs2

    .ActiveConnection = CurrentProject.Connection 'Dein Connection String
    .CursorLocation = adUseClient
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic

End With


rs1.Open "Select * from Texte"

rs1.MoveFirst

While Not rs1.EOF
    
    rs2.Open "Select * from User where Name like '" & rs1!Name & "'"
    rs2.MoveFirst
    
    MsgBox rs2!EMail
    
    rs2.Close
    

rs1.MoveNext
Wend

...das funktioniert bei mir prima ...

Gruß Tom
 
cybergnom hat gesagt.:

Lese Tabelle "texte"
Für den ersten Eintrag mache:
Gib den Text mit Datum und Nick aus
Lese Tabelle "user" wo Nickname gleich dem Nickname des Verfassers
Gib aus der Tabelle "user" die entsprechende eMail-Adresse aus
Spring zum nächsten Eintrag der Tabelle "texte"
Da brauchst Du keinen komplizierten VB- oder PHP-Code, da musst Du einfach nur ein wenig SQL können:

Code:
SELECT texte.Text, texte.Datum, texte.Nick, user.Email FROM texte, user WHERE texte.Nick = user.Nick;

Viel Erfolg noch,


BSchlaak
 
Hallo,

das Problem in deinem als erstes geposteten Code ist ziemlich klar
zu erkennen.

Code:
Do While Not rs.EOF
    Text = CStr(user.Fields("text"))
     Datum = CStr(user.Fields("Datum"))
     username = CStr(user.Fields("Nickname"))

     user.Open "SELECT email FROM user WHERE nickname = " & username, conn,adOpenStatic, adLockPessimistic
    email = CStr(txt.Fields("email"))

     txt.MoveNext
Loop

Du durchläufst ja eine Schleife im Recorset txt. Das muss übrigens
heißen
Do while not txt.eof
sehe ich gerade.

Aber das eigentliche Problem ist das du das Recordset
User mehrmals öffnest ohne es zu schließen wenn das
Recordset txt mehrere Datensätze enthält.
Es fehlt das user.close wobei man vor dem schließen auch
noch prüfen könnte ob es wirklich geöffnet ist.
z.B.
If (rs.State And adStateOpen) = adStateOpen Then
rs.Close
End If

HTH
Jens

Ups hätte wohl mal aufs Datum schauen sollen bevor ich meinen Senf abgebe, der Thread ist ja uralt und sicher lange erledigt. :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück