none
Datenbank Listbox RRS feed

  • Frage

  • Hallo

    Ich möchte gerne aus meiner Datenbank(ID, Start, Stop, Zeit) 3 ListBoxen(Start,Stop,Zeit) machen, welche immer beim Laden des Forms den gesammten Inhalt der Datenbank anzeigen. Ausserdem möchte ich, dass wenn man Button1 anklickt, das Programm in Start das Aktuelle Datum einschreibt und wenn Button2 angeklickt das Programm in Stop das dann Aktuelle Datum reinschreibt und automatisch in Zeit die Differenz einträgt.

    Beispiel:
    Button1.Click
    db1 mach neuen Datensatz Start = Date Now

    Button2.Click
    db1 letzter Datensatz Stop = Date Now, Zeit = start - stop

    LG Yves Riedener
    Sonntag, 7. März 2010 17:26

Antworten

  • Hallo Yves,

    Roberts Beitrag geht davon aus, dass Du eine relationale Datenbank verwendest -
    im Beispiel eine Access Datenbank (.mdb). Solange Du die nicht hast, wird nicht
    viel passieren.

    Ein DataSet (Dein mzDataSet1) ist nur eine Speicherdatenbank und "verflüchtigt" sich
    beim Programmende wieder. Die Daten werden deshalb aus einer externen Datenbank
    geladen und dort wieder gespeichert.

    Wenn Du Dich jetzt nicht mit der Datenbankprogrammierung beschäftigen willst,
    wäre eine Alternative, die Daten Deines DataSets als XML-Datei zu speichern.
    Die DataSet Klasse bietet dazu die Methoden WriteXml (Schreben) und ReadXml (Lesen) an,
    siehe auch: Schreiben von 'DataSet'-Inhalt als XML-Daten (ADO.NET)

    Gruß Elmar
    Dienstag, 9. März 2010 09:22
    Beantworter
  • Hallo,

    mit FTP und SQL geht da gar nichts. Da scheint dann auch wieder der Mangel an Grundlagen durch.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 9. März 2010 12:45
    Moderator

Alle Antworten

  • Hallo Yves,

    Als Startpunkt wir haben zum Beispiel eine Access Datenbank mit folgender Struktur: Tabelle GeneralData mit Felder (ID – AutoNumber, Start – Date/Time, Stop – Date/Time und Zeit – Text)

    Folgender Code Schnipsel bindet die Drei ListBoxen an die Felder Start, Stop und Zeit beim Laden des Forms.

    Knopf Start zeigt das StartDatum in TextBox1 an.

    Knopf Stop zeigt die Zeitdifferenz in TextBox2 und schreibt die drei Felder (Start, Stop und Zeit) in die Datenbank.

    Die Differenz wird als String geschrieben wie folgt: “Tagen:Stunden:Minuten:Sekunden:Millisekunden“

    Im Projekt hab ich noch ein Verweis auf C:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll gemacht.

    Imports System.Data
    Imports System.Data.OleDb
    
    Public Class Form1
        Dim startTime, endTime As DateTime
        Dim span As TimeSpan
        Dim connString As String
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            startTime = DateTime.Now
            TextBox1.Text = startTime.ToString
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            endTime = DateTime.Now
            span = endTime.Subtract(startTime)
            TextBox2.Text = String.Format("{0}:{1}:{2}:{3}:{4}", span.Days, span.Hours, span.Minutes, span.Seconds, span.Milliseconds)
    
            '//schreiben in die Datenbank
            Dim CNtemp As ADODB.Connection
            Dim strSQL As String
    
            strSQL = "INSERT INTO GeneralData (Start,Stop,Zeit) VALUES (#" + Convert.ToString(startTime) + "#,#" + Convert.ToString(endTime) + "#,'" + TextBox2.Text + "')"
            CNtemp = New ADODB.Connection
            With CNtemp
                .Mode = ADODB.ConnectModeEnum.adModeReadWrite
                .CursorLocation = ADODB.CursorLocationEnum.adUseClient
                .Open(connString)
            End With
    
            CNtemp.Execute(strSQL)
            CNtemp.Close()
            '//
    
           
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim conn As OleDbConnection
            connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\Zeiten.mdb"
            conn = New OleDbConnection(connString)
    
            Dim dt As New DataTable("GeneralData")
    
            Dim adapter As OleDbDataAdapter = New OleDbDataAdapter
            Dim selectQuery As String = "SELECT * FROM GeneralData"
    
            adapter.SelectCommand = New OleDbCommand(selectQuery, conn)
            conn.Open()
            adapter.Fill(dt)
            conn.Close()
    
            ListBox1.DataSource = dt
            ListBox1.DisplayMember = "Start"
            ListBox1.ValueMember = "Start"
    
            ListBox2.DataSource = dt
            ListBox2.DisplayMember = "Stop"
            ListBox2.ValueMember = "Stop"
    
            ListBox3.DataSource = dt
            ListBox3.DisplayMember = "Zeit"
            ListBox3.ValueMember = "Zeit"
    
    
        End Sub
        
    End Class

     




    Grüße,

    Robert

    Montag, 8. März 2010 10:13
    Moderator
  • Hallo Robert,

    um Daten einzufügen, sollte man auf ADODB verzichten,  und dies auch mit dem OleDb Client erledigen.
    Zumal es Yves leichter fallen sollte, wenn er nur eine Technik lernen muß.

    Codeschnippsel (ungetestet) fürs Einfügen in Button2_Click:
            Try
                Using connection As New OleDbConnection(connString)
                    Using command As New OleDbCommand("INSERT INTO GeneralData (Start,Stop,Zeit) VALUES (?, ?, ?)", connection)
                        command.Parameters.Add("@Start", OleDbType.DBTimeStamp).Value = startTime
                        command.Parameters.Add("@Stop", OleDbType.DBTimeStamp).Value = endTime
                        command.Parameters.Add("@Zeit", OleDbType.VarWChar, 255).Value = TextBox2.Text
    
                        connection.Open()
                        command.ExecuteNonQuery()
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try
    
    Weitere Lektüre: Befehle und Parameter (ADO.NET)

    Gruß Elmar
    Montag, 8. März 2010 10:39
    Beantworter
  • Ja, da stimme ich Elmar zu. ADODB sollte man wirklich nicht mehr einsetzen. Access als Datenbank wäre auch nicht meine erste Wahl. Wenn's eine ganz einfache Dateibasierte Datenbank sein soll kann man da inzwischen SQL Server Compact gut einsetzen, ansonsten SQL Server Express.

    Yves: Für den Datenbankzugriff gibt es etliche verschiedene Möglichkeiten in .NET. Da wäre z.B. der direkte Einsatz von ADO.NET Connection / Command wie es Elmar hier gezeigt hat, DataSets, LINQ to SQL, das Entity Framework, NHibernate usw.

    Für so ein einfaches kleines Beispiel reicht ADO.NET vollkommen aus. Wenn Deine Anwendung aber komplexer wird, solltest Du Dich mit den anderen Alternativen beschäftigen. Mein persönlicher Favorit für .NET 3.5 / 3.5 SP1 ist LINQ to SQL, ab .NET 4 das Entity Framework.

    Grüße,
    Mathias

    Mathias Raacke - freiberuflicher .NET Trainer und Berater - Blog http://www.outofcoffeeexception.de Twitter oocx
    Montag, 8. März 2010 11:31
  • Also iwie verstehe ich das nicht, ich habe bereits eine Datenbank(mzDataSet1) mit der Tabelle Zeiten(Zeit) und jetzt habe ich folgenden code:
    Imports System.Data
    Imports System.Data.OleDb
    
    Public Class Form1
        Dim startTime, endTime As DateTime
        Dim span As TimeSpan
        Dim connString As String
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            startTime = DateTime.Now
            TextBox1.Text = startTime.ToString
        End Sub
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim conn As OleDbConnection
            connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\Zeiten.mdb"
            conn = New OleDbConnection(connString)
    
            Dim dt As New DataTable("GeneralData")
    
            Dim adapter As OleDbDataAdapter = New OleDbDataAdapter
            Dim selectQuery As String = "SELECT * FROM GeneralData"
    
            adapter.SelectCommand = New OleDbCommand(selectQuery, conn)
            conn.Open()
            adapter.Fill(dt)
            conn.Close()
    
            ListBox1.DataSource = dt
            ListBox1.DisplayMember = "Start"
            ListBox1.ValueMember = "Start"
    
            ListBox2.DataSource = dt
            ListBox2.DisplayMember = "Stop"
            ListBox2.ValueMember = "Stop"
    
            ListBox3.DataSource = dt
            ListBox3.DisplayMember = "Zeit"
            ListBox3.ValueMember = "Zeit"
    
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            endTime = DateTime.Now
            span = endTime.Subtract(startTime)
            TextBox2.Text = String.Format("{0}:{1}:{2}:{3}:{4}", span.Days, span.Hours, span.Minutes, span.Seconds, span.Milliseconds)
            Try
                Using connection As New OleDbConnection(connString)
                    Using command As New OleDbCommand("INSERT INTO GeneralData (Start,Stop,Zeit) VALUES (?, ?, ?)", connection)
                        command.Parameters.Add("@Start", OleDbType.DBTimeStamp).Value = startTime
                        command.Parameters.Add("@Stop", OleDbType.DBTimeStamp).Value = endTime
                        command.Parameters.Add("@Zeit", OleDbType.VarWChar, 255).Value = TextBox2.Text
    
                        connection.Open()
                        command.ExecuteNonQuery()
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try
    
        End Sub
    End Class
    
    Doch bei folgendem code passiert nichts... Es wird nur TextBox1 & TextBox2 beschrieben und eine MsgBox angezeigt:
    Der Microsoft Provider ist nicht auf dem lokalen Computer registriert


    Was muss ich ändern?
    LG Yves Riedener
    • Bearbeitet Yves Riedener Montag, 8. März 2010 13:53 Gestaltung
    Montag, 8. März 2010 13:31
  • Hallo Yves,

    entwickelst Du unter einem 64 Bit Betriebssystem und kompilierst Deine Anwendung zu AnyCPU (Standard)? Der Jet DB Provider steht nur als 32 Bit Version zur Verfügung, folglich muss Deine Anwendung explizit als x86 Assembly kompiliert werden. Dies stellst Du entweder in den Projekt Eigenschaften unter Kompilieren => Erweitert ein oder unter VB Express über den Konfigurationsmanager.

    Siehe unter anderem:
    http://social.msdn.microsoft.com/Forums/de-DE/visualbasicde/thread/9a963dc8-c5d2-4d24-b31e-92f2d95cdc2a
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Montag, 8. März 2010 16:20
    Moderator
  • Hallo Yves,

    Roberts Beitrag geht davon aus, dass Du eine relationale Datenbank verwendest -
    im Beispiel eine Access Datenbank (.mdb). Solange Du die nicht hast, wird nicht
    viel passieren.

    Ein DataSet (Dein mzDataSet1) ist nur eine Speicherdatenbank und "verflüchtigt" sich
    beim Programmende wieder. Die Daten werden deshalb aus einer externen Datenbank
    geladen und dort wieder gespeichert.

    Wenn Du Dich jetzt nicht mit der Datenbankprogrammierung beschäftigen willst,
    wäre eine Alternative, die Daten Deines DataSets als XML-Datei zu speichern.
    Die DataSet Klasse bietet dazu die Methoden WriteXml (Schreben) und ReadXml (Lesen) an,
    siehe auch: Schreiben von 'DataSet'-Inhalt als XML-Daten (ADO.NET)

    Gruß Elmar
    Dienstag, 9. März 2010 09:22
    Beantworter
  • Also eigentlich würd ichs gerne via FTP mit SQL machen, aber ich habe keine Ahnung wie das geht...
    LG Yves Riedener
    Dienstag, 9. März 2010 10:45
  • Hallo,

    mit FTP und SQL geht da gar nichts. Da scheint dann auch wieder der Mangel an Grundlagen durch.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 9. März 2010 12:45
    Moderator