2017-05-31 87 views
0

我有填充了一个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类级别上声明,不知道是否可能是问题,或者我的更新查询不匹配表中的列数?或者是其他东西?似乎无法找到正确的答案为我的情况:/

+0

通常这是通过具有使用Update方法的Select命令的DataAdapter完成的。但在你的情况下,这是不可能的,原因有两个。 DataAdapter在保存时不存在,因为它是GetData方法中的局部变量。第二个原因是Join查询不能自动更新。因此,您只需在每行上留下一个循环,然后使用手动调用即可使用更新查询更新记录。 – Steve

+0

不确定这是否会产生任何影响,但用户可以更改的唯一列均来自同一个表,该连接查询的其余部分旨在显示文本代码而不是ID,以及仅过滤数据属于每个用户。有没有办法将DataGridView的结果发送回数据库并进行更新?或许像传递查询一样? – MickeyPvX

+0

我认为更新/插入的唯一方法是调用DataSource(是一个DataTable)GetChanges方法来检索在网格中更改的行的列表。然后,对于每行,您需要使用该行提取的值构建UPDATE或INSERT sql命令。这与DataAdapter Update方法使用的逻辑相同,但您需要在代码中手动执行。 – Steve

回答

0

韦尔普,终于我想通了。它涉及到很多后端重组,以便通过前端的.net应用程序更容易地连接到它。基本上我把所有经理人投入都放在一张桌子上,并添加了一个与需要他们输入的计划相对应的栏目。

从那里,我可以构建数据集设计器中的所有内容,并在该表适配器上设置更新命令以更新该表。将主窗体上的代码减少为填充datagridview中组合框列的数据源的几行代码。

不是一个优雅的编码解决方案,但它的工作原理!