2017-05-31 5 views
0

Ich habe eine Datagridview mit einer SQL-Anweisung bevölkert, dass Benutzer können Eingangsdaten auf bestimmten Spalten:VB.net aktualisieren MS Access von Datagridview mit Binding

Me.bndDataGrid.DataSource = GetData("SELECT H.InnCode, R.RSRM, " & strCols & " E.Escalation " & _ 
              "FROM (((dbo_HotelInfo AS H " & _ 
              "INNER JOIN dbo_RSRM AS R ON H.RevMgr = R.ID) " & _ 
              "INNER JOIN dbo_SrMgr AS S ON R.SrMgr = S.ID) " & _ 
              "INNER JOIN " & strHitList & " AS L ON H.FacilityID = L.FacilityID) " & _ 
              "INNER JOIN dbo_Escalation AS E ON H.FacilityID = E.FacilityID " & _ 
              "WHERE S.ID = " & cbxSrMgr.SelectedValue.ToString) 

     With Me.grdQueryResults 

      .AutoGenerateColumns = True 
      .DataSource = bndDataGrid 
     End With 

bndDataGrid ist die Binding für grdQueryResults, die Datagridview. Der Code für GetData wird allgemein auf MS-Foren gefunden:

Private Shared Function GetData(ByVal sqlCommand As String) As DataTable 

    Dim strConn As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source={MS Access DB Path Here};" 
    Dim ctnHitList As OleDbConnection = New OleDbConnection(strConn) 
    Dim tblHitList As New DataTable 

    Dim cmdHitList As New OleDbCommand(sqlCommand, ctnHitList) 
    Dim adrHitList As OleDbDataAdapter = New OleDbDataAdapter() 
    adrHitList.SelectCommand = cmdHitList 

    tblHitList.Locale = System.Globalization.CultureInfo.InvariantCulture 
    adrHitList.Fill(tblHitList) 

    Return tblHitList 

End Function 

Jetzt, sobald der Benutzer bereit sind, die Änderungen zu speichern Ich kann mich nicht für das Leben herauszufinden, wie diese richtig haben, sparen, vor allem, da die Datenquelle für Das DataGridView ist nicht einfach an eine Tabelle gebunden.

EDIT:

OK, so dass ich meistens meinen Code gemäß Crowcoder des Blog-Seite überarbeitet und bekam viel weiter mit ihm, aber jetzt an der Aktualisierung ich in eine „Concurrency Verletzung renne: die Update betroffen 0 der erwarteten 1 Datensätze "Ausnahme. Hier ist der Update-Code:

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click 

    Dim parInnCode As OleDbParameter = New OleDbParameter("@parInnCode", OleDbType.WChar) 
    Dim parNotes As OleDbParameter = New OleDbParameter("@parNotes", OleDbType.WChar) 

    parInnCode.SourceColumn = "InnCode" 
    parNotes.SourceColumn = "Notes" 

    Using ctnDataGrid As New OleDbConnection(getConnectionString()) 
     Using cmdGrid As New OleDbCommand("UPDATE (dbo_The400 AS T INNER JOIN dbo_HotelInfo AS H ON T.FacilityID = H.FacilityID) " & _ 
              "INNER JOIN dbo_RSRM AS R ON H.RevMgr = R.ID " & _ 
              "SET [Notes] = @parNotes WHERE H.InnCode = @parInnCode", ctnDataGrid) 
      Using adrDataGrid As New OleDbDataAdapter() 
       With adrDataGrid 
        .UpdateCommand = cmdGrid 
        With .UpdateCommand.Parameters() 
         .Add(parInnCode) 
         .Add(parNotes) 
        End With 
        grdQueryResults.EndEdit() 
        .Update(tblDataGrid) 
       End With 
      End Using 
     End Using 
    End Using 

End Sub 

tblDataGrid auf dem Formularklassenstufe erklärt wird, fragen, ob das das Problem sein kann, oder wenn meine Update-Abfrage nicht die Anzahl der Spalten in der Tabelle überein? Oder etwas anderes? Kann nicht die richtige Antwort für meinen Fall finden:/

+0

Normalerweise erfolgt dies über den DataAdapter, der den Select-Befehl mit der Update-Methode hat. Aber in Ihrem Fall ist das aus zwei Gründen nicht möglich. Der DataAdapter existiert zum Zeitpunkt des Speicherns nicht, da es sich um eine lokale Variable innerhalb der GetData-Methode handelt. Zweiter Grund ist die Tatsache, dass eine Join-Abfrage nicht automatisch aktualisiert werden kann. Sie bleiben also mit einer Schleife über jede Zeile und mit einem manuellen Aufruf, um den Datensatz mit einer Update-Abfrage zu aktualisieren. – Steve

+0

Nicht sicher, ob dies einen Unterschied macht, aber die einzigen Spalten, die der Benutzer ändern kann, alle aus derselben Tabelle stammen. Der Rest dieser Join-Abfrage soll einen Textcode anstelle einer ID anzeigen und nur auf die Daten filtern das betrifft jeden Benutzer. Gibt es eine Möglichkeit, die Ergebnisse von DataGridView zurück an die Datenbank zu senden und auf diese Weise zu aktualisieren? Wie eine Pass-Through-Abfrage vielleicht? – MickeyPvX

+0

Ich denke, dass die einzige Methode zum Aktualisieren/Einfügen das Aufrufen der GetChanges-Methode DataSource (ist eine DataTable) ist, um die Liste der im Raster geänderten Zeilen abzurufen. Dann müssen Sie für jede Zeile einen SQL-Befehl UPDATE oder INSERT mit den von der Zeile extrahierten Werten erstellen. Dieselbe Logik wird von der DataAdapter Update-Methode verwendet, Sie müssen sie jedoch manuell in Ihrem Code ausführen. – Steve

Antwort

0

Welp, endlich habe ich es herausgefunden. Es hat einiges an Reorganisation des Backends mit sich gebracht, um es einfacher zu machen, sich über die Frontend-.net-Anwendung mit ihm zu verbinden. Grundsätzlich habe ich alle Managereingaben in eine Tabelle geworfen und eine Spalte hinzugefügt, die der Initiative entspricht, die ihre Eingabe erforderte.

Von dort konnte ich fast alles im Dataset Designer erstellen und den Update-Befehl für diesen Tableadapter so einstellen, dass er nur diese eine Tabelle aktualisiert. Reduzieren Sie den Code im Hauptformular auf nur wenige Zeilen, die die Datenquellen für die Combobox-Spalten in der Datagridview füllen.

Keine elegante Kodierungslösung, aber es funktioniert!

Verwandte Themen