我有填充了一个SQL语句一个DataGridView用户可以对某些列输入数据:VB.net更新的MS Access使用的BindingSource
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是BindingSource的为grdQueryResults,在DataGridView。为的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不是简单地绑定到表。
编辑:
OK,所以我主要是大修我按照Crowcoder的博客页面的代码,并用它得到了很多进一步的,但现在在更新,我遇到了一个“并发冲突:在更新命令影响预期的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是在Form类级别上声明,不知道是否可能是问题,或者我的更新查询不匹配表中的列数?或者是其他东西?似乎无法找到正确的答案为我的情况:/
通常这是通过具有使用Update方法的Select命令的DataAdapter完成的。但在你的情况下,这是不可能的,原因有两个。 DataAdapter在保存时不存在,因为它是GetData方法中的局部变量。第二个原因是Join查询不能自动更新。因此,您只需在每行上留下一个循环,然后使用手动调用即可使用更新查询更新记录。 – Steve
不确定这是否会产生任何影响,但用户可以更改的唯一列均来自同一个表,该连接查询的其余部分旨在显示文本代码而不是ID,以及仅过滤数据属于每个用户。有没有办法将DataGridView的结果发送回数据库并进行更新?或许像传递查询一样? – MickeyPvX
我认为更新/插入的唯一方法是调用DataSource(是一个DataTable)GetChanges方法来检索在网格中更改的行的列表。然后,对于每行,您需要使用该行提取的值构建UPDATE或INSERT sql命令。这与DataAdapter Update方法使用的逻辑相同,但您需要在代码中手动执行。 – Steve