VB.net/Visual Studio 2010 - Lokale Datenbank abfragen

embi

Grünschnabel
Hallo liebes Tutorials.de-Forum!

Ich hab bei mir die Visual Studio 2010 Ultimate Demo laufen um mal ein bisschen in die Anwendungsentwicklung reinzuschnuppern (es gibt doch aber auch ne kostenlose Visual Studio Version, oder?). Bisher war ich recht intensiv mit PHP und MySQL unterwegs.

Eines Tages hab ich mir eine kleine "Bibliothek" in PHP geschrieben, in der ich meine ganzen BluRays eingetragen habe (mit Filminformationen und anzeige, ob und an wen ich den Film verliehen hab usw.).
Das ganze lief dann für mich allein auf meinem Webserver.

Nun hatte ich bei einer der Buch-Aktionen ein C++ Buch gewählt und bin nun auf den Trichter gekommen, mir diese Bibliothek noch mal neu als Windows Anwendung zu schreiben.
Da C++ aber vielleicht noch etwas sehr fremd für mich ist und ich schon bei mir auf Arbeit ein bisschen mit Excel/VBA zu tun hatte, dachte ich mir ich probiers in VS2010 mal mit Visual Basic.

(puh, soweit zur Vorgeschichte :-D)

Habe mich jetzt mal mit der Studio Benutzeroberfläche vertraut gemacht und ein bisschen herumgespielt. Nun wollte ich herausfinden, wie ich das mit der Datenbank anstellen könnte.
Nach ner weile Google habe ich dann auch die "Lokale Datenbank" gefunden und denke, dass das das Richtige für mich ist, oder? (Hab das da so verstanden, dass ich eine Anwendungseigene Datenbank habe wo ich beliebig Datensätze einfügen, abrufen und löschen kann, zu der ich eigentlich nichts installiert haben muss ausser halt das .net Framework für die Anwendung selber).

Ich bin schonmal soweit, dass ich das Dataset im Designer offen habe, dort meine Tabelle drin habe und auch ein TableAdapter mit dabei ist.
Nachdem ich aus "Datenquellen" meine Tabelle in die Form ge"drag'n'droped" hab, sind da die Label mit den Spaltennamen, die Eingabefelder für neue Einträge bzw. zum Anzeigen der Tabelleninhalte und oben ist der BindingNavigator.

Soweit so gut zum Probieren.

Nun habe ich mir vorgestellt dass ich die Bibliothek im Stile des Explorer-Formulars darstelle:
In der Linken spalte eine Auflistung der einzelnen Filme (Sammelboxen sind quasi ein Ordner mit untergeordneten Einträgen der beinhalteten Filme). Wenn ich dann einen Film anklicke, kann ich in der rechten Spalte dann die Filminfos sehen bzw. bearbeiten.

Und endlich kommen wir zum Problem:
Ich weiss nicht, wie ich meine Filme auflisten lassen kann :(

Im Code des Explorerformulars isses ja aktuell so
Code:
    Private Sub LoadTree()
        ' TODO: Code zum Hinzufügen von Elementen in der Strukturansicht hinzufügen

        Dim tvRoot As TreeNode
        Dim tvNode As TreeNode

        tvRoot = Me.TreeView.Nodes.Add("Root")
        tvNode = tvRoot.Nodes.Add("TreeItem1")
        tvNode = tvRoot.Nodes.Add("TreeItem2")
        tvNode = tvRoot.Nodes.Add("TreeItem3")
    End Sub

Wär das ganze PHP, hätte ich das so gemacht (grob zusammengefasst):

Code:
    Private Sub LoadTree()
        ' TODO: Code zum Hinzufügen von Elementen in der Strukturansicht hinzufügen

        Dim tvRoot As TreeNode
        Dim tvNode As TreeNode
        
        select * from movies where ID
        while list results ID each {
        if produkt = sammelbox{     
        
        tvRoot = Me.TreeView.Nodes.Add("SAMMELBOXNAME")
        
        }elseif produkt = film{
  
       tvNode = tvRoot.Nodes.Add("FILMNAME")
      } }

   End Sub

Also dass die Abfrage gemacht wird und er jeden Eintrag einzeln bearbeitet und je nachdem was in der Spalte "Produkt" steht er den Filmnamen als Ordner (Sammelbox) oder Datei (eiznelner Film) darstellt und alles auflistet.

Konnte man das soweit gut verstehen? Wie mach ichn das?
Also wie verbinde ich zu meiner Datenbank und wie lautet der richtige code für diese while schleife?
Hat da einer Lust mir das zu erklären/zeigen?

Vielen Dank schonmal im Vorraus!

Gruß,
Maik
 

Shakie

Erfahrenes Mitglied
Ja es gibt kostenloste IDEs von Microsoft, die heißen dann "Microsoft Visual Basic Express" oder "Microsoft Visual C# Express". Siehe hier.
Zur While-Schleife:
Ich kann kein PHP, die Where- und Results-Ausdrücke verstehe ich nicht.
Aber du willst vermutlich etwas in dieser Art machen:
C#:
foreach (MovieType item in movies.Where<Deine PHP-Bedingung in C#-Syntax>)
{
    if (item.Product == "sammelbox")
    {Me.TreeView.Nodes.Add("SAMMELBOXNAME");}
    else if (item.Product == "film")
    {tvNode = tvRoot.Nodes.Add("FILMNAME");}
}
Das funktioniert natürlich nur, wenn movies ein Type ist, der IEnumerable<MovieType> implementiert (eine List<> tut das zum Beispiel) und wenn MovieType der Type ist der deine Objekte darstellt.
 
Zuletzt bearbeitet:

embi

Grünschnabel
Ah das sieht wirklich so aus wie ich das brauche. Das heisst ich deklariere vorher noch dass movietype eine liste ist.
ausserdem muss ich sicher auch noch angeben dass diese liste eine liste der Ergebnisse der SQL abfrage meines Adapters ist, oder? Wie muss das aussehen? Und wie sag ich ihm,dass er meinen Adapter ansprechen soll? (Schreiben mit dem Handy ist echt ******** :D)
 

Shakie

Erfahrenes Mitglied
Der Code in meinem vorherigen Post war C#. Ich hoffe das hat dich nicht verwirrt.
Das heisst ich deklariere vorher noch dass movietype eine liste hat.
Nein. Du deklarierst movies als Liste, wobei die Liste Elemente vom Typ movietype ist. Was movietype ist, musst du natürlich auch noch definieren. Zum Beispiel so:
Code:
Public Class movietype
Public Product As String
Public WasWeißIch As Integer
End Class
Code:
Dim movies As List(Of movietype)
ausserdem muss ich sicher auch noch angeben dass diese liste eine liste der Ergebnisse der SQL abfrage meines Adapters ist, oder?
Ja. Hab' aber keine Ahnung von SQL in .Net
 

embi

Grünschnabel
Okay, vielen Dank Shakie! :)

Ich habe jetz VB2010 Express und werd von nun an damit weiterarbeiten.
Das Where ist SQL und besagt in der Zeile, dass alle Daten ausgelesen werden sollen wo ein Wert in der Spalte ID steht. Man hätte auch noch WHERE ID = 12 nehmen können, dann hätter den Datensatz ausgelesen, der in der ID eine 12 zu stehen hat :)

Das while list results blabla heisst, dass er in der while-schleife die Resultate der Abfrage je ID auflistet.

Ok... bin nebenbei auch dabei, mir die Galilio Computing Sachen reinzuziehen ;) (Werd mir das auch Bestellen, denk ich)
Da gibts ja nun auch ein gutes (sehr gutes) Beispiel für ne lokale Datenbank. Die ist aber aus Access. Soweit ich das ausm Code rauslese, wird ja da auber auch nur die mdf Datei eingelesen. So wirds doch bei der Lokalen Datenbank die ich in VB 2010 express erstellen kann auch nur gemacht, oder?

Gibts denn da im Code für die Verbindung große Unterschiede zwischen der Access und der SQL Compact DB? Ich hab das Gefühl dass nur der Provider anders heisst. Also statt OleDB SQL oder sowas.. kann mir da einer Hintergrundinfo geben? Das wär echt klasse und ich denke, auch mein Durchbruch endlich weiter zu kommen :D

Edit:
Aaahh okay.. ich hab ein bisschen rumgespielt und raus gekommen ist, dass das Beispiel in dem Galileo Buch nahezu 1 zu 1 funktioniert. Lediglich der Provider muss geändert werden: Statt "Provider=Microsoft.Jet.OLEDB.4.0;" also "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" :) so, ich hoffe damit, dass ich nun erstmal allein weiterkomm. Das buch müsste übermorgen auch bei mir eintreffen :p Vielleicht wird ja aus meinem Projekt ein kleines Tutorial ;)
Wenns klappt, poste ich morgen Abschliessend mal den Explorer-Code um den Thread abzuschliessen.

Edit2:

So und hier der Code. So funktionierts aktuell bei mir, wie ich es mir vorgestellt hatte. Aber ich glaube ich werde für das Projekt dann doch ein schöneres Design wählen :D

Ganz ganz oben im Code der Form:
Code:
Imports System.Data.OleDb

Und später dann:
Code:
    Private Sub LoadTree()
        ' TODO: Code zum Hinzufügen von Elementen in der Strukturansicht hinzufügen

        Dim tvRoot As TreeNode
        Dim tvNode As TreeNode
        Dim con As New OleDbConnection
        Dim cmd As New OleDbCommand
        Dim cmd2 As New OleDbCommand
        Dim reader As OleDbDataReader
        Dim reader2 As OleDbDataReader
        con.ConnectionString =
            "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" &
            "Data Source=movies.sdf"
        cmd.Connection = con
        cmd2.Connection = con
        cmd.CommandText = "select * from filme"
        Try
            con.Open()
            reader = cmd.ExecuteReader()
            Do While reader.Read()
                If (reader("Produkt") = "Sammelbox") Then
                    tvRoot = Me.TreeView.Nodes.Add(reader("name"))
                    cmd2.CommandText = "select * from filme where Gruppe = '" & reader("Gruppe") & "' AND Produkt = 'Sammelboxfilm'"
                    Try

                        reader2 = cmd2.ExecuteReader()
                        Do While reader2.Read()
                            tvNode = tvRoot.Nodes.Add(reader2("name"))
                        Loop
                        reader2.Close()

                    Catch ex2 As Exception
                        MessageBox.Show(ex2.Message)
                    End Try
                ElseIf (reader("Produkt") = "Einzelfilm") Then
                    tvNode = Me.TreeView.Nodes.Add(reader("Name"))
                End If
            Loop
            reader.Close()
            con.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try
    End Sub

Dankeschön und bis bald :)
 
Zuletzt bearbeitet:

Neue Beiträge