zwei Formulare - eine DB-Verbindung

Andreas Dunstheimer

Erfahrenes Mitglied
Hi,

ich bin gerade dabei, eine kleine Datenbankanwendung zu programmieren.

Zuerst öffne ich im Formular frmHaupt die Verbindung zur DB:
Code:
Private Sub Form_Load()
    Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cn.ConnectionString = "Data Source=D:\vb_projekte\xxx\kundendatei.mdb"
    Cn.CursorLocation = adUseClient
    Cn.Open
    With RsT
        .ActiveConnection = Cn
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .Source = "SELECT * FROM Kunden ORDER BY Name,Vorname"
        .Open
        .MoveFirst
        For i = 0 To .RecordCount - 1
            cboKundenauswahl.AddItem (.Fields("Name") + ", " + .Fields("Vorname"))
            .MoveNext
        Next i
    End With

End Sub

Die Daten aus dem Recordset zeige ich dann in frmHaupt an:
Code:
Private Sub cmdKundenauswahl_Click()
    If cboKundenauswahl.ListIndex >= 0 Then
        With RsT
            .MoveFirst
            .Move (cboKundenauswahl.ListIndex)
            If IsNull(.Fields("Name")) And IsNull(.Fields("Vorname")) Then lblName.Caption = "" Else lblName.Caption = " " + .Fields("Vorname") + " " + .Fields("Name")
            If IsNull(.Fields("Strasse")) Then lblStrasse.Caption = "" Else lblStrasse.Caption = " " + .Fields("Strasse")
            If IsNull(.Fields("Postleitzahl")) And IsNull(.Fields("Ort")) Then lblOrt.Caption = "" Else lblOrt.Caption = " " + .Fields("Postleitzahl") + " " + .Fields("Ort")
            If IsNull(.Fields("Telefon")) Then lblTelefon.Caption = "" Else lblTelefon = " " + .Fields("Telefon")
            If IsNull(.Fields("Mobil")) Then lblMobil.Caption = "" Else lblMobil = " " + .Fields("Mobil")
            If IsNull(.Fields("Email")) Then lblEmail.Caption = "" Else lblEmail = " " + .Fields("Email")
            If IsNull(.Fields("Bemerkung1")) Then lblBemerkung1.Caption = "" Else lblBemerkung1 = " " + .Fields("Bemerkung1")
            If IsNull(.Fields("Bemerkung2")) Then lblBemerkung2.Caption = "" Else lblBemerkung2 = " " + .Fields("Bemerkung2")
            If IsNull(.Fields("Bemerkung3")) Then lblBemerkung3.Caption = "" Else lblBemerkung3 = " " + .Fields("Bemerkung3")
        End With
    Else
        i = MsgBox("Bitte einen Kunden zum Anzeigen auswählen!", vbCritical, "Hinweis")
    End If
        
End Sub

Nun will ich diese Daten in einem zweiten Formular dlgEditkunde bearbeiten und Änderungen direkt in die DB schreiben.
Dummerweise habe ich, da ich nun ja in einem anderen form bin, die Verbindung zur DB und auch das Recordset nicht mehr. :(
Kann ich diese Werte irgendwie übergeben, oder muss ich die Verbindung neu machen?

Und gleich noch eine Frage zu DB-Verbindungen:
muss man mit .open gemachte auch wieder schliessen? Ich vermute mal, dass das das Programm beim Beenden selbst macht, aber solange ich im Programm bin und immer wieder Verbindungen öffne könnte dies irgendwann zu einem Problem werden?


Dunsti
 
Hi!

Auch schon so früh wach? ;-]

Also, zum Thema:

Du kannst genrell auf Variablen und Steuerelemente in einer anderen, aktiven Form zugreifen...

Je nachdem, könntest du testen, ob er die cbo-Box(was immer das auch ist) aus der anderen Form ausliest.
Hiermit siehst du, nachdem du das Label erstellt hast, ob er erkennt, wieviele Einträge sich in der Box befinden:
Code:
Code für die 2. Form
Private Sub Form_Load()
Label1.Caption = frmHaupt.cboKundenauswahl.Listcount
End Sub

Gruß
daDom
 
hallo,

du kannst aber auch ein modul in dein projekt einfügen. da deklarierst du das objekt.
bsp:
public bla as connection

und zagg, du kannst es überall benutzen ohne es neu zu instanzieren.
am anfang musst du natürlich das irgendwo bei form_load oder so instanzieren.

das mit close sollte man schon machen, wenn man mit dem db-zugriff fertig ist
 
Hi,

danke für eure Hilfe. :)

hab es jetzt so gelöst, daß ich in einem Modul folgende zwei Subs habe:

Code:
Public Sub ADO_Cmd(SQL_String As String)
    Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cn.ConnectionString = "Data Source=" + DB_Name
    Cn.CursorLocation = adUseClient
    Cn.Open
    With Cmd
        .ActiveConnection = Cn
        .CommandType = adCmdText
        .CommandText = SQL_String
        .Execute 1
    End With
    Cn.Close
End Sub

Public Sub ADO_Rst(SQL_String As String)
    Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cn.ConnectionString = "Data Source=" + DB_Name
    Cn.CursorLocation = adUseClient
    Cn.Open
    With RsT
        .ActiveConnection = Cn
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .Source = SQL_String
        .Open
        If .RecordCount > 0 Then
            ReDim arrRst(.RecordCount, .Fields.Count)
            .MoveFirst
            For i = 0 To .RecordCount - 1
                For x = 0 To .Fields.Count - 1
                    arrRst(i, x) = CStr(.Fields(x))
                Next x
                .MoveNext
            Next i
        Else
            ReDim arrRst(0, 0)
        End If
        .Close
    End With
    Cn.Close
End Sub

das funktioniert super, aber noch eine Frage dazu: ist das ein Problem, daß im laufenden Programm immer wieder DB-Verbindungen auf und zu gemacht werden?
 

Neue Beiträge

Zurück