繁体   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