[英]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.