ExecuteReader gibt keine Daten aus

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Zaunkonig.

    ExecuteReader gibt keine Daten aus

    Servus zusammen,

    mittlerweile bin ich ziemlich am verzweifeln.
    Bin gerade dabei ein Programm zu schreiben, dass auf eine MS-SQL-Datenbank zugreift. Und ich bin mir 1000%tig sicher, dass das vor ein paar Tagen schon gefunzt hat.
    Heute wollte ich weiter programmieren und schwups, es ging nicht mehr.

    Hier mal der Code.

    VB.NET-Quellcode

    1. Public Function NeuenIndex_ermitteln()
    2. Dim command As New SqlCommand("SELECT dummy FROM einsatz", _conn)
    3. Dim reader As SqlDataReader = Nothing
    4. reader = command.ExecuteReader
    5. reader.Read()
    6. Dim _neuerIndex = reader.Item("dummy") + 1
    7. 'Füge die neuen Index in die Tabelle Einsatz ein
    8. SQL_abfrage("UPDATE einsatz SET DUMMY='" & _neuerIndex & "'")
    9. reader.Close()
    10. Return _neuerIndex
    11. End Function


    HasRows = true und FieldCount = 1

    Also müßten Daten abgerufen und im SqlDataReader drinnen sein, aber es heißt nunmehr "Ungültiger Leseversuch, wenn keine Daten vorhanden sind."

    Hat vielleicht jemand eine Idee, an was es liegen könnte. Wie gesagt, ich bin mir 1000%tig sicher, dass das schon mal gefunzt hat.


    Vielen Dank für Eure Unterstützung.

    Gruß Zaunkonig

    VB1963 schrieb:

    Schaue hier einmal rein, da wird der Umgang mit DataReader mit Codebeispiele beschrieben...


    Guten Morgen VB1963,

    vielen Dank für deine schnelle Antwort.

    Anhand von diesen Beispielen habe ich meinen Code erstellt.
    Es funzt ja, wenn ich die Daten mit dem DataAdapter abrufe und in ein DataGrid schreibe. Der Abruf mit reder.ExecuteScalar bring mir die entsprechenden Daten. Was auch in diesem oben genannten Fall ausreichend ist.
    Aber was mache ich, wenn ich später im Verlauf komplexere SQL-Aufrufe habe?

    Das macht mich im Moment a bisserl kierrie. ;)
    Guten Morgen,

    jetzt ist es schon meine Frage. Zuerst hätte mich interessiert an was da liegt, dass ich keine Werte zurückbekommen.
    Inzwischen weiß ich, dass dies an der VisualStudio-Version liegt.

    Dieser Code funktioniert in VisualStudio2013 einwandfrei.

    VB.NET-Quellcode

    1. Public Function NeuenIndex_ermitteln()
    2. Dim command As New SqlCommand("SELECT dummy FROM einsatz", _conn)
    3. Dim reader As SqlDataReader = Nothing
    4. Try
    5. reader = command.ExecuteReader
    6. reader.Read()
    7. Dim _neuerIndex = reader.Item("DUMMY") + 1
    8. 'Füge die neuen Index in die Tabelle Einsatz ein
    9. SQL_abfrage("UPDATE einsatz SET DUMMY='" & _neuerIndex & "'")
    10. reader.Close()
    11. Return _neuerIndex
    12. Catch ex As Exception
    13. MessageBox.Show("Fehler: " & ex.Message & " Nummer: " & ex.HResult)
    14. End Try
    15. Return Nothing
    16. End Function
    In VisualStudio2017 funktioniert er nur bedingt.

    VS2017 fordert, anscheinend, die Bearbeitung mit Parameter. Also ran an die Bulleten. ;)

    Folgende Aufgabe habe vor mir.
    Im ersten Schritt brauche ich den Index des Standardprojektes.

    VB.NET-Quellcode

    1. Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
    2. Try
    3. _conn.ConnectionString = "Server=LAPTOP\MSHOME ;Database=BÜRO-BÄRBEL;User Id=sa;Password=m.x.x.x.x.x;"
    4. _conn.Open()
    5. Dim command As SqlCommand = New SqlCommand("SELECT stdprojektIDX from [global]", _conn) With {
    6. .CommandType = CommandType.Text}
    7. Dim parameter As SqlParameter = command.Parameters.Add("@Rückgabe", SqlDbType.Int)
    8. parameter.Direction = ParameterDirection.Output
    9. Try
    10. command.ExecuteScalar()
    11. Dim Wert = CInt(command.Parameters("@Rückgabe").Value)
    12. MsgBox(Wert)
    13. Catch ex As Exception
    14. MessageBox.Show("Fehler: " & ex.Message & " Nummer: " & ex.HResult)
    15. End Try
    16. Catch ex As Exception
    17. MsgBox(ex.Message)
    18. End Try
    19. _conn.Close()
    20. End Sub


    Im weiteren Schitt brauche ich die Felder die hinter dem Standardprojekt liegen.
    Zur Zeit liefert mir der oben genannte Code nur ein
    Nothing
    .
    Hab das Prinzip von den Parameterangaben noch nicht zu 100% verstanden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Zaunkonig“ ()

    Servus,

    nach ein bisschen herum probieren bin ich mir zu 99% sicher, dass dies ein Problem in VS2017 ist.

    Dieser Beispielcode

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public _conn As New SqlConnection
    3. Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
    4. Try
    5. _conn.ConnectionString = "Server=LAPTOP\MSHOME ;Database=BÜRO-BÄRBEL;User Id=sa;Password=m.x.x.x.x.x.x;"
    6. Dim command As SqlCommand = New SqlCommand With {
    7. .Connection = _conn,
    8. .CommandText = "SELECT vorname, name1, strasse, plz, ort from adressen where name1=@name1",
    9. .CommandType = CommandType.Text
    10. }
    11. Dim parameter As New SqlParameter With {
    12. .ParameterName = "@Name1",
    13. .SqlDbType = SqlDbType.NChar,
    14. .Direction = ParameterDirection.Input,
    15. .Value = TextEdit1.EditValue
    16. }
    17. command.Parameters.Add(parameter)
    18. _conn.Open()
    19. Try
    20. Dim reader As SqlDataReader = command.ExecuteReader
    21. If reader.HasRows Then
    22. reader.Read()
    23. MsgBox(reader(0) & reader(1) & reader(2) & reader(3) & reader("ort"))
    24. End If
    25. Catch ex As Exception
    26. MessageBox.Show("Fehler: " & ex.Message & " Nummer: " & ex.HResult)
    27. End Try
    28. Catch ex As Exception
    29. MsgBox(ex.Message)
    30. End Try
    31. _conn.Close()
    32. End Sub
    33. End Class

    funzt in VB2013 einwandfrei und auf anhieb. In VS2017 mittlerweile bedingt.
    Nach einem Update von
    • ReadyRoll for VS2017
    • SQLPromptCore
    • SQLSearch
    werden mir zur Laufzeit die entsprechenden Daten angezeigt. Im Debugger und im Einzelschritt nicht.
    Naja, zumindest bekomme ich nun Daten raus und ich kann weiter machen.

    Vielen Dank für Eure Unterstützung besonders für Deine @VB1963.

    Gruß Zaunkonig

    P.S. Werde das Thema vorerst als erledigt kennzeichnen.
    fertig: 99%

    doppel try-catch ist sinnlos und msgbox ist veraltet und kommt aus VB 6
    Bitte berichtigen :D
    daher empfehle ich dir

    VB.NET-Quellcode

    1. Option Strict On
    zu benutzen

    und beim verweis den Microsoft.VisualBasic zu löschen. :D
    @Zaunkonig
    Was hast du eigentlich vor?
    "SELECT dummy FROM Einsatz" und dann "UPDATE einsatz SET DUMMY='" & _neuerIndex & "'"...
    Willst du in einer Tabelle ein AutoIncrement bei der Spalte dummy nachbilden?
    Und dummy ist vlt. noch dazu ein Primärschlüssel?
    Da solltest du dir dein Datenmodel nocheinmal anschauen und korrigieren...
    Dein Code ist der blanke horror. Solch ein wirrwar beim DB Zugriff hab ich hier schon lange nicht mehr gesehen. Klar, du hast da viel rum experimentiert, also räum das erstmal auf.

    Bitte schreib dir eine separate Klasse, die den DB Zugriff regelt. Das ganze Zeug gehört überall hin, nur nicht in die GUI ->Trenne Daten und GUI
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Servus zusammen,

    @VB1963:

    VB1963 schrieb:

    @Zaunkonig
    Was hast du eigentlich vor?
    "SELECT dummy FROM Einsatz" und dann "UPDATE einsatz SET DUMMY='" & _neuerIndex & "'"...
    Willst du in einer Tabelle ein AutoIncrement bei der Spalte dummy nachbilden?
    Und dummy ist vlt. noch dazu ein Primärschlüssel?
    Da solltest du dir dein Datenmodel nocheinmal anschauen und korrigieren...

    Es handelt sich hierbei um keinen Primärschlüssel. Ich hab da eine bestehende SQL-AnyWhere-Datenbank. Und in dieser wird der Dummy-Wert als Indexwert für alles genutzt. Deshalb das Auslesen des Werts, um eins erhöhen und wieder abspeichern. Hab schon überlegt, ob es nicht vielleicht besser ist, dies in eine Datenbankfunktion zu verlagern.

    @mrMo:
    Dein Code ist der blanke horror. Solch ein wirrwar beim DB Zugriff hab ich hier schon lange nicht mehr gesehen. Klar, du hast da viel rum experimentiert, also räum das erstmal auf.

    Bitte schreib dir eine separate Klasse, die den DB Zugriff regelt. Das ganze Zeug gehört überall hin, nur nicht in die GUI ->Trenne Daten und GUI

    Stimmt, ich hab viel probiert. Kann aber auch daran liegen, dass ich das programmieren nicht von der pieke auf gelernt habe, sondern mir alles selber "beigebracht" habe. Da lasse ich es gerne zu, dass nicht alles in geordneten Bahnen abläuft. Meist läuft es so ab. Man hat Problem oder möchte was um setzen, dann probert man herum. Irgendwann funzt es und man freut sich darüber. ;) Ob es dann zu 100% richtgi ist, ist erstmal egal. Aber irgendwie behält man dies dann bei.

    Hab eh schon alle globalen Datenbankfunktionen in ein Modul ausgelagert. Mit dem Thema Klassen habe ich mich noch nicht beschäftigt. Werde ich mir genauer ansehen.

    @Facebamm
    Die separate klasse könnte so aussehen

    pastebin.com/auVrRuKZ

    vielen Dank für das Beispiel der separaten Klasse.



    Das ganze hat sich im Moment eh erledigt. Bin in einer Tabelle auf ein LongBinary-Feld gestoßen, wo die Daten im Binary-Format 0x436f6d705a6c696273000000789c8b76cbcf2b298ee572ce2f2ac82f4a5408ae2c2e49cdb53634b4368042aee890c424a00a73036b4320c72d27311dc803720c0d80d27ae6e6464008561790995c525a941acb650d04608da91525b15cd536c626d696d6101db58e0c009dec1fbd0abgespeichert sind und vermutlich auch noch comprimiert sind. Muß erstmal dieses Problem lösen, dass ich sie im Klartext anzeigen lassen kann.

    Vielen Dank für Eure zahlreichen Tipps. Werde sie mir nach und nach zu Gemüte führen.