2017-01-08 9 views
0

Lassen Sie mich kurz mein Problem und dann zeigen Sie den Code.SQL-Datenbank mit datagridview Inhalt aktualisieren

Ich möchte Daten aus einer SQL-Datenbank extrahieren, in Visual Basic mithilfe von datagridview anzeigen, dem Benutzer ermöglichen, den Inhalt in der Datagridview zu ändern, und dann Änderungen in der Datenbank zurückgeben. Ich habe mehrere Ansätze mit Ratschlägen von Stackoverflow und anderen Foren ausprobiert, aber nichts funktioniert. Hier ist der Ansatz, der für mich am sinnvollsten war, aber wenn es einen besseren oder einfacheren Weg gibt, bin ich ganz Ohr.

Ich habe andere Teile des Codes entfernt, die irrelevant sind. Der Code erhält ordnungsgemäß Daten aus der Datenbank. fügt es in datagridview ein und zeigt es an. Wenn ich eine Zelle betrete, um den Inhalt zu ändern, und dann versuche, die Ergebnisse in der Datenbank zu speichern, bekomme ich den Laufzeitfehler.

Imports System.IO 
Imports System.Data.OleDb 
Imports System.Data.SqlClient 
Public Class FrmRunTerm 

    Private connectionString As String 
    Private ControlResultsConnection As New SqlConnection 
    Private ReadDS As New SqlDataAdapter 
    Private ControlResultsDS As New DataSet 


    Private Sub FrmRunTerm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 


     CboWeek.Items.Add("Week 1 - Tuesday, November 15, 2016") 
     CboWeek.Items.Add("Week 2 - Tuesday, November 22, 2016") 
     CboWeek.Items.Add("Week 3 - Tuesday, November 29, 2016") 
     CboWeek.Items.Add("Week 4 - Tuesday, December 6, 2016") 
     CboWeek.Items.Add("Week 5 - Tuesday, December 13, 2016") 
     CboWeek.Items.Add("Week 6 - Tuesday, December 20, 2016") 
     CboWeek.Items.Add("Week 7 - Tuesday, December 27, 2016") 
     CboWeek.Items.Add("Week 8 - Tuesday, January 3, 2017") 
     CboWeek.Items.Add("Week 9 - Tuesday, January 10, 2017") 
     CboWeek.Items.Add("Week 10 - Tuesday, January 17, 2017") 
     CboWeek.Items.Add("Week 11 - Tuesday, January 24, 2017") 
     CboWeek.Items.Add("Week 12 - Tuesday, January 31, 2017") 

     If CboWeek.Text = "" Then 
      MessageBox.Show("Please select a week to process.", "Termination Control Utility Set", MessageBoxButtons.OK) 
     End If 
    End Sub 

    Private Sub Btn_CWA_Click(sender As Object, e As EventArgs) Handles Btn_CWA.Click 

     If CboWeek.Text <> "" Then 
      ListBox1.Items.Add("Processing continuation of weekly analysis...") 
      Application.DoEvents() 

      connectionString = "<a lot of stuff – but it works>" 
      Dim strControlResultsSql As String = "SELECT * FROM dbo.RG_Control_Results_Cumulative" 

      Using ControlResultsConnection As New SqlConnection(connectionString) 
       ControlResultsConnection.Open() 
       Using ReadDS As New SqlDataAdapter(strControlResultsSql, ControlResultsConnection) 
        ReadDS.Fill(ControlResultsDS) 
       End Using 
      End Using 
      Dim SQLCommandBlder As New SqlCommandBuilder(ReadDS) 

      DataGridView1.DataSource = ControlResultsDS.Tables(0) 
      Application.DoEvents() 

     End If 

    End Sub 

    Private Sub Btn_InterimSave_Click(sender As Object, e As EventArgs) Handles Btn_InterimSave.Click 

     ListBox1.Items.Add("Saving data...") 
     Application.DoEvents() 

     Dim SQLCB As New SqlCommandBuilder(ReadDS) 
     ReadDS.Update(ControlResultsDS) 
     ControlResultsDS.AcceptChanges() 
     SQLCB.Dispose()   
     ControlResultsConnection.close() 

    End Sub 

End Class 

Der Fehler, den ich bekommen, ist auf der Linie ReadDS.Update (ControlResultsDS). Der Fehler ist:

Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' aufgetreten in System.Data.dll

Zusätzliche Informationen: Die DataAdapter.SelectCommand Eigenschaft muss initialisiert werden.

Jeder Rat würde sehr geschätzt werden. Vielen Dank im Voraus!


Per Rahul Vorschlag, veränderte ich den Code wie folgt:

Dim SQLCB As New SqlCommandBuilder(ReadDS) 
ReadDS.SelectCommand = New SqlCommand("Select * From dbo.RG_Control_Results_Cumulative") 
ReadDS.SelectCommand.Connection = New SqlConnection(connectionString) 
ReadDS.Update(ControlResultsDS) 
ControlResultsDS.AcceptChanges() 
SQLCB.Dispose() 

Und bekam die folgende Laufzeitfehler bei der ReadDS.Update Zeile: '

Eine nicht behandelte Ausnahme des Typs System.InvalidOperationException 'in System.Data.dll aufgetreten

Weitere Informationen: Dynamic SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand tha unterstützt t gibt keine wichtigen Spalteninformationen zurück.

Vielen Dank und nochmals Entschuldigung für die Fragen des Newbie.

Antwort

0

Welchen Vorschlag brauchen Sie? Vorschlag ist in der Fehleranweisung selbst vorhanden. Sie verwenden SQLCommandBlder Klasse und es generiert UPDATE Befehl automatisch zur Verfügung gestellt, wenn Sie den SELECT Befehl daran gebunden haben und das ist, was die Fehlermeldung tatsächlich sagt Die DataAdapter.SelectCommand Eigenschaft muss initialisiert werden.

Sie sollten den Befehl select Ihren Datenadapter initialisieren sagte

ReadDS.SelectCommand = new SqlCommand("SELECT * FROM dbo.RG_Control_Results_Cumulative"); 
+0

Danke Rahul. Bitte verzeih, dass ich hier ein Noob bin. Ich gebe zu, immer noch verwirrt zu sein. Konzeptionell habe ich bereits, was ich will, aus der Datenbank in den ControlResultsDS-Datensatz geladen. Ich habe dann die einzelne Tabelle in diesem Dataset mit Datagridview1 angezeigt. Der Benutzer nimmt dann Änderungen an datagridview1 vor und möchte diese zurück in die Datenbank stellen. Sollte ich eine andere Klasse benutzen? Ich habe so viele verschiedene Lösungen ausprobiert und keine funktioniert. Wieder entschuldige ich mich für das, was für viele von euch eine so einfache Frage ist. – OldEngineer

+0

Also hier ist was ich versucht habe basierend auf Ihren Kommentar. – OldEngineer

+0

Argh sorry über die vorherige Zeile - versuchen, den eingestellten Code zu zeigen, aber Probleme mit der Schnittstelle - mein Fehler, nicht vertraut mit dieser Schnittstelle; lass es mich herausfinden und poste dann den aktualisierten Code. Im Grunde habe ich hinzugefügt, was Sie vorgeschlagen, aber einen neuen Fehler bekommen - wird in Kürze veröffentlichen. Vielen Dank für Ihre Geduld! – OldEngineer

0

ö.K. habe es zur Arbeit gebracht - danke nochmal Rahul für deine Anleitung! Das Problem, das ich schließlich herausgefunden hatte, war, dass meine Tabelle eine Primärschlüsselspalte fehlte, weshalb das Adapater-Update versagte; Sobald ich eine Spalte hinzugefügt habe (die ich "Sequence_Number" nannte), sie als ID-Spalte mit einfacher fortlaufender Nummerierung gekennzeichnet und sie als Primärschlüssel bezeichnet habe, funktionierte alles perfekt. Es tut mir leid, dass ich so ein Noob bin, aber es war sicherlich eine Lernerfahrung. Selbst alte Programmierer haben diese!

Verwandte Themen