DataGridView1 und SQL-Server speichert Daten nicht

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

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von biefel.

    DataGridView1 und SQL-Server speichert Daten nicht

    Hallo Gemeinde,
    ich bin hier fast am verzweifeln. Versuche derzeit den Umstieg von VB6 auf VB.net. Beim Verwenden des DataGridView komme ich nicht weiter. Die Datensätze lassen sich perfekt anzeigen und auch ändern, jedoch die Änderungen kommen nicht in der Datenbank an. Was mache ich falsch?

    Hier der Datenzugriff:

    VB.NET-Quellcode

    1. Public SQLCon As New SqlConnection With {.ConnectionString = "Server=localhost\SQLEXPRESS01;Database=db;User=sa;Pwd=pw"}
    2. d
    3. Public SQLCmd As SqlCommand
    4. Public SQLDA As SqlDataAdapter
    5. Public SQLDataSet As DataSet
    6. Public Function HasConnection() As Boolean
    7. Try
    8. SQLCon.Open()
    9. SQLCon.Close()
    10. Return True
    11. Catch ex As Exception
    12. MsgBox(ex.Message)
    13. Return False
    14. End Try
    15. End Function
    16. Public Sub RunQuery(ByVal Query As String)
    17. Try
    18. SQLCon.Open()
    19. SQLCmd = New SqlCommand(Query, SQLCon)
    20. SQLDA = New SqlDataAdapter(SQLCmd)
    21. SQLDataSet = New DataSet
    22. SQLDA.Fill(SQLDataSet)
    23. SQLCon.Close()
    24. Catch ex As Exception
    25. MsgBox(ex.Message)
    26. If SQLCon.State = ConnectionState.Open Then
    27. SQLCon.Close()
    28. End If
    29. End Try
    30. End Sub


    und hier die Verwendung in der Form:

    VB.NET-Quellcode

    1. If dbCon.HasConnection = True Then
    2. dbCon.RunQuery("SELECT Bezeichnung,SQLScript From...")
    3. If dbCon.SQLDataSet.Tables.Count > 0 Then
    4. DataGridView1.DataSource = dbCon.SQLDataSet.Tables(0)
    5. DataGridView1.Visible = True
    6. Else
    7. DataGridView1.Visible = False
    8. End If
    9. End If


    Kann mir jemand die Augen öffnen. Warum komme ich an die Daten nur ReadOnly ran?

    Vielen Dank
    biefel ?(
    Da fehlt eine Methode zum Speichern. Bisher sehe ich nur deine Methode zum Laden...

    Das ist redundant:

    biefel schrieb:

    If dbCon.HasConnection = True Then


    Das hier reicht schon aus

    VB.NET-Quellcode

    1. If dbCon.HasConnection Then
    "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

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

    ich hab auch schon weiter gesucht und bin auf das hier gestoßen

    VB.NET-Quellcode

    1. ​dbCon.SQLDA.UpdateCommand = New SqlClient.SqlCommandBuilder(dbCon.SQLDA).GetUpdateCommand


    und hier werden die Veränderungen gespeichert.

    VB.NET-Quellcode

    1. ​dbCon.SQLDA.Update(dbCon.SQLDataSet)

    Leider funktioniert der Code nur mit Tabellen und nicht mit Views :/

    Trotzdem Danke für dein Post
    Ist ein View nicht extra dafür da, um nur lesend darauf zu zugreifen?
    "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
    Gehts dir darum, im Grid Änderungen vorzunehmen, die dann "automatisch" in Die DB gespeichert werden?

    Falls ja, dann schau hier mal rein: msdn.microsoft.com/de-de/library/ms171933.aspx
    "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
    Ja, genau darum geht es. Ich bin vielleicht durch die Funktionalität des DataGrids aus VB6 etwas verblendet. Dort konnte man einfach die Daten im Grid ändern und sie kamen automatisch in der DB an.
    So richtig will ich nicht verstehen, warum das jetzt so kompliziert gelöst wurde.
    Oder geht es wirklich nicht anders???

    biefel schrieb:

    So richtig will ich nicht verstehen, warum das jetzt so kompliziert gelöst wurde.
    Oder geht es wirklich nicht anders???
    Tja, .Net ist eben komplett anders, und einfacher ists, wennde dich drauf einlässt, und drauf vertraust, dasses in allen Punkten exorbitant besser gelöst ist, als alles was du aus vb6 kennst.
    Du musst nur den richtigen Ansatzpunkt finden, und die neuen Konzepte verstehen. Ohne dieses neue Verständnis stehste zwangsläufig wie Ochs vor Berg, weil du veraltete Konzepte umzusetzen suchst, die so nicht mehr existieren.
    Und der gegebene Link ist auch kein guter Ansatzpunkt.

    Also das neue Konzept ist ein alles erschlagendes Gesamtkonzept, bestehend aus mehreren "Unterkonzepten", es heisst: Entweder OR-Mapper (v.a. EF) oder typisiertes Dataset.

    Ich empfehle, mit typDataset anzufangen, EF verlangt noch mehr Grundkenntnisse.
    Und eines dieser Unterkonzepte ist, dass man überhaupt nicht mehr auf der Datenbank arbeitet, sondern nur noch im typDataset.
    Sondern man befüllt gelegentlich (also nicht automatisch, bei jeder Änderung!) sein Dataset aus der DB, und orgelt dann auf den Daten herum. Und wenn gut ist, kann man mit einem Befehl die Änderungen auch wieder zurückspeichern.

    Also DB-Entwicklung hat sich komplett weg-verschoben vonne DB, und was du lernen musst, ist vordringlich der Umgang mittm typDataset.
    Und darin sollteste dich sogar ganz ohen Db einarbeiten, denn das sind 2 komplett verschiedene Baustellen, und wenn du beides gleichzeitig zu lernen versuchst, potenzieren sich die Schwierigkeiten.

    Also lerne eins nach dem anderen, und mittm typDataset umgehen zu können ist die Vorraussetzung für sinnvolle und effektive Db-Zugriffe, also lern typDataset zuerst.
    Dazu diese Tutorial: codeproject.com/Articles/1030969/Relational-Datamodel

    Du kannst dir auvh paar Videos angucken, um einen Vorgeschmack zu erhalten, wie einfach es wird, und welche enormen Möglichkeiten sich auftun, wenn mans denn geschnackelt hat:

    vier Views-Videos
    Vielen Dank für die Antwort. Es gibt viel zu tun im Winter :D
    Schade, dass es keine einfachere Lösung gibt.

    Wie sinnvoll ist es, mit dem integriertem Datenquellen-Explorer zu arbeiten? In VB6 konnte man den nicht anwenden, wenn man einen nachvollziehbaren Quellcode haben wollte.
    Ich mag diese Assis nicht so, mach das gerne selber. Dann sehe ich wenigstens was passiert und kann bei Bedarf bequem eingreifen...
    "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
    Sie funktionieren, und machen keine Fehler.
    Und es kommt was bei raus, was Databinding unterstützt, und zwar mit Wysiwyg.
    Haste die 4-View-Videos mal angeguckt?
    Würdest du das mit Selbstgebastelt auch hinbekommen, dass du anschließend im DGV einen Joining-View einrichten kannst?
    Oder verwendest du auch keinen Form-Designer (ist ja auch eine Art Assistent)?

    Aber wie in post#2 gesagt: Das ist noch ühaupt nicht dran.
    Erstmal sollte man ühaupt ein Datenmodell entwerfen können, dann eine Anwendung schreiben, die designergestütztes Databinding benutzt (4 Views).
    Erst danach ist ein DB Assi dran - vorher kann man viel zu viel falsch machen, und verbaut sich die Optionen.

    ErfinderDesRades schrieb:

    Haste die 4-View-Videos mal angeguckt?


    Nein leider noch nicht, war zeitlich bisher nicht drin. Die Videos habe neulich schon gefunden und stehen auf meiner Liste.
    "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
    Vielen Dank für die Posts. Ich hab nun angefangen die 4 Videos zu gucken und so langsam dämmert es mir. Hab jetzt ne kleine Demo-Anwendung geschrieben, die schon mal sehr viel versprechend funktioniert.
    Nun meine Frage: Wenn ich die Anwendung als DB-Client ausführe muss ich mich am Anfang des Programms mit einer verfügbaren Datenbank (SQLexpress) verbinden können. Da ich jetzt die Bordmittel genutzt habe verbindet sich das Programm aber immer mit der lokalen SQL-Datenbank.
    Wie kann ich zur Laufzeit die Datenbank wechseln? Also den ConnectionString anpassen.

    Vielen Dank für eure Unterstützung .
    eine Datenbank wechselt man zur Laufzeit normalerweise nicht.
    Haupt-Intention von Datenbanken ist die Redundanz-Vermeidung, also man will die Daten an nur einem Ort vorzuhalten.

    ich weiß jetzt nicht, welche Bordmittel du genau benutzt hast, um mit dem lokalen SqlServer zu verbinden, ich weiß auch nicht, welchen anderen, nicht lokalen SqlServer du lieber benutzen tätest - also je nachdem wie man vorgeht, muss man, wenn man zum Ändern des Connectionstrings dann anders vorgehen.
    Ich glaube, er möchte wissen wie er den SQL-Server ändert um das Programm auf einem fremden PC zum laufen zu bekommen... Oder was genau meinst du @biefel ?
    "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
    Für sowas ist in entsprechenden Szenarien zB die mitzuliefernde (oder auch austauschbare) Config-Datei vorgesehen.
    Aber was genau er meint musser halt selber sagen - allgemein kann man nur sagen, dass ein Herumswitchen von Connectionstrings nicht eiglich zu den Grundkonzepten der Datenbänkerei gehört, und daher durch .Net - Bordmittel auch nur sehr "schlecht" (wenn mans denn schlecht findet) unterstützt ist.
    @mrMo: genau ich möchte beim Start der Anwendung den Server auswählen, mit dem ich ich verbinden will.
    Ich hab auch schon einen Teilerfolg erreicht. Man muss die Datei xxx.DataSet.Desingner.VB ändern. Und zwar diese Zeilen:

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Private Sub InitConnection()
    4. Me._connection = New Global.System.Data.SqlClient.SqlConnection()
    5. Me._connection.ConnectionString = General.Server <-- Diese Zeile
    6. End Sub


    Mache also folgenden Trick: Beim Start lese ich den ConnectionString aus und ersetze den Servernamen

    VB.NET-Quellcode

    1. General.Server = Replace(My.MySettings.Default.xxxConnectionString, General.Server, txtServerName.Text)


    Das ganze funktioniert sehr gut, ABER.
    Die Datei xxx.DataSet.Desingner.VB wird automatisch erzeugt, und gelegentlich wird meine modifizierte Codezeile einfach überschrieben. Ohne nachzufragen!

    Kann man das nicht eleganter lösen?

    Danke an Euch
    Hab bisher die Verbindung zum SQL-Server immer manuell, nicht über nen Assistenten, gemacht. Bei der Variante mit dem Assi kann dir der @ErfinderDesRades helfen.

    Bei der manuellen Variante musst du die Verbindungsdaten irgendwo lokal speichern (z.B. als Config-Datei). Beim Programmstart prüfst du ob es diese Datei gibt. Falls nicht öffnet sich ein Dialog zum Eingeben der Verbindungsdaten, welche dann als Config-Datei gespeichert werden. Die Daten kannst du dann bei Bedarf laden und in einem Connectionstring zusammensetzen.
    "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