none
Datenbank Wert in Textbox oder Label ablegen

    Frage

  • Als erstes möchte ich sagen ich bin noch Anfänger was Visual Basic angeht.

    Ich versuche seit einem Tag aus meiner Access Datenbank einen Wert auszulesen und diesen in einer TextBox anzuzeigen. (Der Sinn dahinter ist das ich später mit diesem wert als Filter Kriterium arbeiten kann.)

    Meine bisherige Funktion schaut so aus:

     Sub ermittleProgid()
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
            Dim cmd3 As New OleDb.OleDbCommand
            Dim readerprogid As OleDb.OleDbDataReader
            cmd3.CommandText = "SELECT Progid FROM tbProgramm WHERE tbProgramm.Datum = DatumComboBox2.Text"
            Try
                If Not con.State = ConnectionState.Open Then
                    con.Open()
                End If
                readerprogid = cmd3.ExecuteReader()
                readerprogid.Read()
                If readerprogid.HasRows Then
                    lbl_progid.Text = readerprogid("Progid")
                End If
                readerprogid.Close()
                con.Close()
            Catch ex As Exception
            End Try
        End Sub

    Wenn ich mit dem Debugger darüber geh überspringt er mir alles ab readerprogid = cmd3.ExecuteReader().

    Anschliessend kommt der Fehler: "InvalidOperationException" wurde nicht initialisiert
    ExecuteReader: Connection-Eigenschaft wurde nicht initialisiert.

    Bitte um Hilfe

    Gruss Mo

     

    Donnerstag, 8. August 2013 09:12

Antworten

  • Hi,
    ich würde das Unterprogramm so gestalten:

      Sub ermittleProgid()
        con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
        Using cmd3 As New OleDb.OleDbCommand
          Dim readerprogid As OleDb.OleDbDataReader
          cmd3.CommandText = "SELECT Progid FROM tbProgramm WHERE Datum = ?"
          cmd3.Parameters.Add("@p1", OleDb.OleDbType.Date).Value = Date.Parse(DatumComboBox2.Text)
          Try
            If Not con.State = ConnectionState.Open Then con.Open()
            readerprogid = cmd3.ExecuteReader()
            readerprogid.Read()
            If readerprogid.HasRows Then
              lbl_progid.Text = readerprogid("Progid").ToString
            End If
            readerprogid.Close()
            con.Close()
          Catch ex As Exception
            Dim msg As String = String.Empty
            Dim ex1 = ex
            While ex1 IsNot Nothing
              msg &= ex1.Message & vbNewLine
              ex1 = ex1.InnerException
            End While
            MsgBox(msg)
          End Try
        End Using
      End Sub

    --
    Peter
    • Als Antwort vorgeschlagen Peter FleischerMVP Donnerstag, 8. August 2013 10:11
    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 12:37
    Donnerstag, 8. August 2013 10:11
  • Hi Mo,

    bei Strings musst du 2 Apostrophs verwenden ( 'deinString' ).

    Was wohl bei Bezahlungsart und ProgID ein Fehler verursacht.

    Du kannst auch SQLParameter verwenden.

    Wenn du mehrere Parameter hast und nicht genau weist wo der Fehler ist, fange erst mal mit 1 an und füge dann die Anderen hinzu.

    MFG
    Björn

    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 13:03
    Donnerstag, 8. August 2013 12:58
  • Hi Mo,

    das klappt mit GroupBy und Sum, siehe Link.

    MFG

    Björn

    p.s. Google ist meist schneller als wir ;)

    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 13:18
    Donnerstag, 8. August 2013 13:14

Alle Antworten

  • Mo,

    Du musst dem OleDbCommand noch das OleDbConnection object zuweisen. Dies machst Du am besten über die Connection Eigenschaft:

    cmd3.Connection=con


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    My Forum Threads

    Donnerstag, 8. August 2013 09:23
  • Vorerst vielen dank für die rasche Antwort.

    Ich habe dies nun angepasst aber es läuft leider immer noch nicht.

    mit dem Debuggen überspringt es mir nach wie vor diesen Teil...

    readerprogid = cmd3.ExecuteReader()
                readerprogid.Read()
                If readerprogid.HasRows Then
                    lbl_progid.Text = readerprogid("Progid")
                End If
                readerprogid.Close()
                con.Close()
            Catch ex As Exception

    ... und landet bei  Catch ex As Exception.

    Hast du eine Idee was an diesem abschnitt falsch ist?

    zusätzlich ist der neue Fehler "OledbException" wurde aufgefangen.
    Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.

    Gruss Mo


    • Bearbeitet Moneedshelp Donnerstag, 8. August 2013 09:35
    Donnerstag, 8. August 2013 09:33
  • Was hat
    tbProgramm.Datum
    für einen Datentyp in der Datenbank ?

    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    My Forum Threads

    Donnerstag, 8. August 2013 09:48
  • In der Datenbank ist der Datentyp Datum/Uhrzeit.

    Donnerstag, 8. August 2013 09:50
  • Hi Mo,

    die Zeilen werden übersprungen weil der Aufruf von cmd3.ExecuteReader() eine Exception wirft.

    Das wird daran liegen, das ein erforderlicher Parameter keinen Wert hat, bei der SQL Anweisung.

    Wenn ich mir deine Anweisung anschaue:

     "SELECT Progid FROM tbProgramm WHERE tbProgramm.Datum = DatumComboBox2.Text"
           

    Würde ich sagen das es daran liegt, das DatumComboBox2.Text mit in den Anführungszeichen steht und du so nicht den Wert in der Combobox übergibst sondern den String " DatumComboBox2.Text".

    MFG

    Björn


    Donnerstag, 8. August 2013 09:51
  • Hallo Björn

    Danke für den Tipp das hat mich ein wenig weitergebracht, nun sehe ich in der neuen Fehlermeldung wenigstens das er mir das Datum erkennt :). Es wird leider immer noch übersprungen aber mit der neuen Fehlermeldung:

    "OledbException" wurde aufgefangen.
    Syntaxfehler in Zahl in Abfrageausdruck 'tbProgramm.Datum = 14.09.2012'.

    Donnerstag, 8. August 2013 09:59
  • Hi,
    ich würde das Unterprogramm so gestalten:

      Sub ermittleProgid()
        con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
        Using cmd3 As New OleDb.OleDbCommand
          Dim readerprogid As OleDb.OleDbDataReader
          cmd3.CommandText = "SELECT Progid FROM tbProgramm WHERE Datum = ?"
          cmd3.Parameters.Add("@p1", OleDb.OleDbType.Date).Value = Date.Parse(DatumComboBox2.Text)
          Try
            If Not con.State = ConnectionState.Open Then con.Open()
            readerprogid = cmd3.ExecuteReader()
            readerprogid.Read()
            If readerprogid.HasRows Then
              lbl_progid.Text = readerprogid("Progid").ToString
            End If
            readerprogid.Close()
            con.Close()
          Catch ex As Exception
            Dim msg As String = String.Empty
            Dim ex1 = ex
            While ex1 IsNot Nothing
              msg &= ex1.Message & vbNewLine
              ex1 = ex1.InnerException
            End While
            MsgBox(msg)
          End Try
        End Using
      End Sub

    --
    Peter
    • Als Antwort vorgeschlagen Peter FleischerMVP Donnerstag, 8. August 2013 10:11
    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 12:37
    Donnerstag, 8. August 2013 10:11
  • Danke viel mal Peter du hast mich gerettet ;D es funktioniert

    tausend Dank

    Donnerstag, 8. August 2013 11:24
  • Mon,

    dann markiere doch bitte auch den Post von Peter als die Antwort.


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    My Forum Threads

    Donnerstag, 8. August 2013 11:30
  • Hey tut mir echt leid das ich nochmals stören muss, aber ich muss das Projekt heute Abend fertig kriegen und zum Schluss kommen mir noch ein paar fragen. die erste wäre:

    - Ich verstehe nicht was dabei falsch ist... Dachte man kann mehrere Bedingungen mit AND vereinen?
      Die Fehlermeldung ist die gleiche die ich schon einmal hatte:

    zusätzlich ist der neue Fehler "OledbException" wurde aufgefangen.
    Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.

    Er überspringt auch wieder ab der Position readerprogid = cmd3.ExecuteReader() bis nach Catch

    Sub anzahlKat1()
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
            Using cmd3 As New OleDb.OleDbCommand
                cmd3.Connection = con
                Dim readerprogid As OleDb.OleDbDataReader
                cmd3.CommandText = "SELECT AnzahlKat1 FROM tbTicketDaten WHERE Bezahlungsart = ak AND UserGroupId = 2 AND Status = 2 AND ProgId =" & lbl_progid.Text
                Try
                    If Not con.State = ConnectionState.Open Then
                        con.Open()
                    End If
                    readerprogid = cmd3.ExecuteReader()
                    readerprogid.Read()
                    If readerprogid.HasRows Then
                        lbl_Kat1.Text = readerprogid("AnzahlKat1").ToString
                    End If
                    readerprogid.Close()
                    con.Close()
                Catch ex As Exception
                    Dim msg As String = String.Empty
                    Dim ex1 = ex
                    While ex1 IsNot Nothing
                        msg &= ex1.Message & vbNewLine
                        ex1 = ex1.InnerException
                    End While
                    MsgBox(msg)
                End Try
            End Using
        End Sub

    Ich danke im Voraus

    Guss Mo

    Donnerstag, 8. August 2013 12:42
  • Hi,
    die SQL Anweisung kann falsch sein:

    cmd3.CommandText = "SELECT AnzahlKat1 FROM tbTicketDaten WHERE Bezahlungsart = ak AND UserGroupId = 2 AND Status = 2 AND ProgId =" & lbl_progid.Text

    Es werden alle Datensätze gesucht, wo der Inhalt des Feldes Bezahlungsart gleich dem Inhalt des Feldes ak ist und der Feldinhalt von UserGroupId den Wert 2 hat und der Feldinhalt von Status den Wert 2 hat und der Inhalt von ProgId ??? hat. Da solltest Du zur Vermeidung von Injection mit Parameterobjekten arbeiten.

    Ich vermute, dass da eine Spalte fehlt oder ein Verschreiber vorliegt, z.B. bei der Spalte ak.

    --
    Peter
     

    Donnerstag, 8. August 2013 12:56
  • Hi Mo,

    bei Strings musst du 2 Apostrophs verwenden ( 'deinString' ).

    Was wohl bei Bezahlungsart und ProgID ein Fehler verursacht.

    Du kannst auch SQLParameter verwenden.

    Wenn du mehrere Parameter hast und nicht genau weist wo der Fehler ist, fange erst mal mit 1 an und füge dann die Anderen hinzu.

    MFG
    Björn

    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 13:03
    Donnerstag, 8. August 2013 12:58
  • Danke vielmals für die rasche Antwort bin wieder einmal meinem Ziel einen kleinen schritt näher gekommen.

    hab nur noch eine kleine Frage...

    Die Spalte AnzahKat1 hat nachdem ich es gefiltert habe immer noch 4 Zeilen (Die Zeilen sind immer unterschiedlich im Beispiel hier sind es jetzt 4)diese muss ich zusammenrechnen und das ist dann die Lösung die in dem Label stehen soll.

    Ich habe es schon probiert jedoch fehlt mir das "know How" eine Schleife in der Abfrage zu machen, die mir die verschiedenen Zeilen zusammenrechnet bevor die erste bereits drinsteht.

    Beispiel:

    in der ersten Zeile steht 2
    in der zweiten 1
    in der dritten 2
    und in der vierten wieder 1

    nun soll im Label die Zahl 6 stehen

    Wäre froh wenn mir jemand da noch einen Tipp hat.

    Gruss Mo

    Donnerstag, 8. August 2013 13:11
  • Hi Mo,

    das klappt mit GroupBy und Sum, siehe Link.

    MFG

    Björn

    p.s. Google ist meist schneller als wir ;)

    • Als Antwort markiert Moneedshelp Donnerstag, 8. August 2013 13:18
    Donnerstag, 8. August 2013 13:14
  • Danke Björn für die Antwort trotz der dummen Frage :)

    Ich werde es das nächste mal berücksichtigen, jedoch hab ich bei Google auch schon viele krumme Sachen gefunden die mir anschliessend das Genick gebrochen haben.

    Freundliche Grüsse

    Mo

    Donnerstag, 8. August 2013 13:18
  • Hab doch noch eine Frage i weiss nicht wo ich das hineinschreiben soll (also an welcher stelle) egal wo ich das hineinschreibe überall bekomme ich eine Fehlermeldung das es SUM nicht gibt und es funktioniert auch nicht. Kannst du mir bitte den Code im Code vom Peter einfügen oder zumindest sagen wo das genau hinkommt.

    PS: Ich habe mich auch schon im Google schlau gemacht jedoch nichts gefunden :)

    Gruss Mo

    Donnerstag, 8. August 2013 13:52
  • Hi Mo,

    ich schreib es jetzt einfach mal in einen Teil deines SQL Commandos (Behobene Fehler bitte anpassen).

    "SELECT 
    SUM(AnzahlKat1)
    FROM tbTicketDaten 
    WHERE Bezahlungsart = ak AND UserGroupId = 2
    GROUP BY UserGroupID"
    Hab ich jetzt natürlich nicht ausprobiert.

    MFG

    Björn

    Donnerstag, 8. August 2013 14:46
  • Funktioniert Leider nicht. Zur Sicherheit zeig ich dir mal wie ich es gemacht habe.

    Sub anzahlKat1()
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
            Using cmd3 As New OleDb.OleDbCommand
                cmd3.Connection = con
                Dim readerprogid As OleDb.OleDbDataReader
    
                cmd3.CommandText = "SELECT SUM(anzahlKat1) FROM(tbTicketDaten) WHERE(Bezahlungsart = 'ak' AND ProgId =" & lbl_progid.Text & " ) GROUP BY UserGroupID"
    
                Try
                    If Not con.State = ConnectionState.Open Then
                        con.Open()
                    End If
                    readerprogid = cmd3.ExecuteReader()
                    readerprogid.Read()
                    If readerprogid.HasRows Then
                        lbl_Kat1.Text = readerprogid("AnzahlKat1").ToString
                    End If
                    readerprogid.Close()
                    con.Close()
                Catch ex As Exception
                    Dim msg As String = String.Empty
                    Dim ex1 = ex
                    While ex1 IsNot Nothing
                        msg &= ex1.Message & vbNewLine
                        ex1 = ex1.InnerException
                    End While
                    MsgBox(msg)
                End Try
            End Using

    Er sagt mir das minestens ein Parameter fehlt...

    Kannst du mir bitte schnell die richtige Lösung präsentieren in einer Stunde muss ich es abgeben :(

    Ich habe irgendwo gelesen das es die Funktion SUM() gar nicht mehr gibt im vb express 2010??

    Gruss Mo

    Donnerstag, 8. August 2013 14:58
  • Hi MO,

    SUM() ist hier ein SQL Statment, das hat jetzt nichts mit VB zu tun.

    Du hast AnzahlKat1 einmal mit kleinem a und einmal mit großen A geschrieben. Da kommt es jetzt darauf an was für eine Datenbank du verwendest.

    Bei ProgID könnte auch noch ein Fehler sein, ich weiß jetzt nicht was für ein Datentyp dahinter liegt.

    Benutzt hier mal die Parameter.  Dürfte grob so aussehen.

    cmd3.CommandText = "SELECT SUM(anzahlKat1) FROM(tbTicketDaten) WHERE(Bezahlungsart = 'ak' AND ProgId = @MyProgID ) GROUP BY UserGroupID"
    
    cmd3.Parameters.Add(new SqlParameter("MyProgID",lbl_progid.Text));
    

    MFG

    Björn

    Donnerstag, 8. August 2013 15:19
  • Danke für die Antwort jedoch ist es gleich...

    Ich habe nie mit SQL gearbeitet das zeigt es bei mir als falsch an. es steht "Der Typ SQLParameter ist nicht definiert".

    gibt es keine andere Möglichkeit wie ich das machen kann (Oledb?)

    Komischerweise gibt er mir einfach in einer MSGBox AnzahlKat1 aus.

    Gruss Mo

    Donnerstag, 8. August 2013 15:27
  • Bitte Poste mal den aktuellen Code.
    Donnerstag, 8. August 2013 15:29
  • Sub anzahlKat1()
            con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
            Using cmd3 As New OleDb.OleDbCommand
                cmd3.Connection = con
                Dim readerprogid As OleDb.OleDbDataReader
                cmd3.CommandText = "SELECT SUM(AnzahlKat1) FROM(tbTicketDaten) WHERE(Bezahlungsart = 'ak' AND ProgId = @MyProgID )"
                cmd3.Parameters.Add(New OleDbParameter("MyProgID", lbl_progid.Text))
                Try
                    If Not con.State = ConnectionState.Open Then
                        con.Open()
                    End If
                    readerprogid = cmd3.ExecuteReader()
                    readerprogid.Read()
                    If readerprogid.HasRows Then
                        lbl_Kat1.Text = readerprogid("AnzahlKat1").ToString
                    End If
                    readerprogid.Close()
                    con.Close()
                Catch ex As Exception
                    Dim msg As String = String.Empty
                    Dim ex1 = ex
                    While ex1 IsNot Nothing
                        msg &= ex1.Message & vbNewLine
                        ex1 = ex1.InnerException
                    End While
                    MsgBox(msg)
                End Try
            End Using
        End Sub
    Das ist die Ganze funktion das grouped by Groupid brauch ich ned das war nur um zu testen ob ich eines der 4 ausgeben kann die groupid ist kein filter.
    Donnerstag, 8. August 2013 15:30
  • Mach mal einen Import auf den Namespace " System.Data.SqlClient"


    Donnerstag, 8. August 2013 15:35
  • Das Group By machst du um die Summe zu bilden wenn die GroupID kein Filter ist dann kannst du z.B. Bezahlungsart verwenden.
    Donnerstag, 8. August 2013 15:38
  • neue Fehlermeldung:

    OleDbParameterCollection akzeptiert nur Nicht-Null OleDbParameter-Typenobjekte, nicht SqlParameter-Objekte.

    Donnerstag, 8. August 2013 15:39
  • SqlParameter in OleDbParameter umändern.

    Und schau dir mal das Beispiel an.

    • Bearbeitet Palin Donnerstag, 8. August 2013 15:42
    Donnerstag, 8. August 2013 15:40
  • tut mir leid aber ich versteh nicht was du meinst?
    Donnerstag, 8. August 2013 15:45
  • das gibt bei mir 56 Fehler wenn ich das einbinde:

    'Declaration
    Public NotInheritable Class OleDbParameter
    	Inherits DbParameter
    	Implements ICloneable, IDbDataParameter, IDataParameter
    'Usage
    Dim instance As OleDbParameter
    

    Donnerstag, 8. August 2013 15:48
  • Hi ich hatte nicht genau hin geschaut, du kannst keine SQLParameter verwenden sondern musst OleDbParameter verwenden.

    In dem Link wird gezeigt wie es geht.

     
    Donnerstag, 8. August 2013 15:50
  • Du hast dir auch einfach die Klassen deklaration Kopiert und in dein Projekt kopiert. Das kann nicht funktionieren.

    Weiter unten siehst du wie die Klasse verwendet wird.

    Donnerstag, 8. August 2013 15:53
  • ich glaube ich weiss was du meins aber ich muss das leider in ca. einer halben stunde abgeben und habe keine zeit mehr lange auszuprobieren. Kannst du mir den Gefallen tun und mir den Code anpassen weil meine ersten 2 versuche sind fehlgeschlagen.

    Ich versuche es natürlich weiter.

    Gruss Mo

    Donnerstag, 8. August 2013 15:56
  • Ich habe den ganzen Code und die Datenbank nicht da. Es ohne Fehler anzupassen ist Recht schwer.

    Geh mal hin und führe einen String als Variable ein. Den weist du erst mal das Command zu.

    Dahinter eine Brakepoint setzen und mal Schauen und Posten was das steht.

    Und Poste mal welchen Datentyp die Spalte ProgID hat.

    MFG

    Björn

    Donnerstag, 8. August 2013 16:01
  • kann man das auch mit Team Viewer machen?? ich bin momentan gerade echt überfordert bin schon seit 2 Wochen am Projekt dran und komm nicht wirklich vom fleck.
    Donnerstag, 8. August 2013 16:04
  • Ja muss mir TV mal eben runter laden.
    Donnerstag, 8. August 2013 16:09
  • Danke
    Donnerstag, 8. August 2013 16:09
  • Schreib mir mal ID und Kennwort.

    (Hab mal meine Mail Adresse wieder entfernt ;) )
    • Bearbeitet Palin Donnerstag, 8. August 2013 20:05
    Donnerstag, 8. August 2013 16:12
  • Soll ich dir meine ID und das Kennwort geben?
    Donnerstag, 8. August 2013 16:12
  • Ja fals die Mail noch nicht los ist.
    Donnerstag, 8. August 2013 16:14
  • Hier ist noch die Lösung für die die es einmal brauchen:

    Sub anzahlKat1()
                con.ConnectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source = C:\Temp\Datenbank.mdb"
                Using cmd3 As New OleDb.OleDbCommand
                    cmd3.Connection = con
    
                Dim strstring As String = "SELECT SUM(AnzahlKat1) AS SumKat1 FROM tbTicketDaten WHERE Bezahlungsart LIKE 'ak' AND ProgId = " + lbl_progid.Text + " Group By Bezahlungsart"
                Dim command As OleDbCommand = New OleDbCommand(strstring, con)
                con.Open()
                Dim reader As OleDbDataReader = command.ExecuteReader()
    
                reader.Read()
                lbl_Kat1.Text = reader("SumKat1").ToString
    
                
            End Using
            End Sub

    Dies hab ich nur dank Björn hinbekommen und will hiermit nochmal meinen Dank aussprechen ;D
    • Als Antwort vorgeschlagen Palin Donnerstag, 8. August 2013 20:04
    Donnerstag, 8. August 2013 16:38