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:/
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
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
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