簡體   English   中英

VB.net使用BindingSource從DataGridView更新MS Access

[英]VB.net Update MS Access from DataGridView with BindingSource

我有一個用SQL語句填充的DataGridView,用戶可以在某些列上輸入數據:

    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是grdQueryResults(DataGridView)的BindingSource。 GetData的代碼通常在MS論壇上找到:

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

現在,一旦用戶准備好保存更改,我就無法終生思考如何正確保存此更改,這主要是因為DataGridView的數據源不只是綁定到表上。

編輯:

是的,所以我主要按照Crowcoder的博客頁面對代碼進行了全面檢查,並進行了進一步的改進,但是現在在更新時,我遇到了“並發沖突:UpdateCommand影響了預期1條記錄中的0條”異常。 這是更新代碼:

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是在表單類級別聲明的,想知道這可能是問題還是我的更新查詢與表中的列數不匹配? 或者是其他東西? 似乎找不到適合我的情況的正確答案:/

威爾普,終於我想通了。 它涉及大量的后端重組,以使其更容易通過前端.net應用程序連接到該后端。 基本上,我將所有經理的投入都放在一個表中,並添加了一列,該列對應於需要他們投入的計划。

從那里,我可以在“數據集設計器”中構建幾乎所有內容,並在該表適配器上設置“更新”命令以僅更新該表。 將主窗體上的代碼縮減為僅幾行,這些行填充了datagridview中組合框列的數據源。

這不是一個優雅的編碼解決方案,但是它有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM