2015-02-11 35 views
-3

我正在使用两个gridviews按钮来交换两者之间的行。现在我想要做的是,对GridView进行更改,尝试将它们转换为数据表,然后使用dataadapter.update(datatable)命令更新数据库。但更改不会在数据库中发生。这是我的代码。提前致谢。无法使用adapter.update命令获取基于绑定到gridview的数据表中更改的数据库更新

Private Sub SubmitToDbButton_Click(sender As Object, e As EventArgs) Handles SubmitToDbButton.Click 
    Dim con As New SqlConnection 
    Dim dt1 As New DataTable 
    Dim dt2 As New DataTable 
    Dim ds As New DataSet 
    Dim da1 As New SqlDataAdapter("Select * from Table_1", con) 
    Dim builder1 As New SqlCommandBuilder(da1) 
    Try 
     con.ConnectionString = "Data Source=N0PCRIM9L3RYX1;Initial Catalog=RandomFormDB;Integrated Security=True" 
     con.Open() 
     da1.Fill(dt1) 
     dt1 = TryCast(DataGridView1.DataSource, DataTable) 'datatable gets new rows here 
     dt1.AcceptChanges() 
     da1.Update(dt1) 
     con.Close() 
    Catch ex As System.Data.SqlClient.SqlException 
     MsgBox(ex.Message) 
    End Try 
End Sub 

这里是完整的代码。我是vb的新手,所以这真的让我失望了。数据表和从查询返回的表具有相同的列。但不知何故,dataadapter无法理解这一点。怎么做?

Imports System.Data.SqlClient 
Public Class Form1 
    Dim L As Load_Data 
    Public Sub LoadButton_Click(sender As Object, e As EventArgs) Handles LoadButton.Click 
     L = New Load_Data() 
     L.Load() 
    End Sub 

    Private Sub LTRButton_Click(sender As Object, e As EventArgs) Handles LTRButton.Click  
     Dim dt1 As DataTable 'moves selected row from left gridview to right one 
     Dim dt2 As DataTable 
     Dim str As String = Nothing 
     dt1 = TryCast(DataGridView1.DataSource, DataTable) 
     dt2 = TryCast(DataGridView2.DataSource, DataTable) 
     Dim selecetedId As String = DataGridView1.SelectedRows(0).Cells(1).Value 
     Dim row As DataRow 
     For Each row In dt1.Rows 
      If row.Item("ID") = selecetedId Then 
       dt2.ImportRow(row) 
       dt1.Rows.Remove(row) 
       Exit For 
      End If 
     Next 
    End Sub 

    Private Sub RTLButton_Click(sender As Object, e As EventArgs) Handles RTLButton.Click   
     Dim dt1 As DataTable 'moves selected row from right gridview to left one 
     Dim dt2 As DataTable 
     Dim str As String = Nothing 
     dt1 = TryCast(DataGridView1.DataSource, DataTable) 
     dt2 = TryCast(DataGridView2.DataSource, DataTable) 
     Dim selecetedId As String = DataGridView2.SelectedRows(0).Cells(1).Value 
     Dim row As DataRow 
     For Each row In dt2.Rows 
      If row.Item("ID") = selecetedId Then 
       dt1.ImportRow(row) 
       dt2.Rows.Remove(row) 
       Exit For 
      End If 
     Next 
    End Sub 

    Private Sub SubmitToDbButton_Click(sender As Object, e As EventArgs) Handles SubmitToDbButton.Click 
     Dim con As New SqlConnection 'this sub submits changes to database 
     Dim dt1 As New DataTable  'problem lies in this function 
     Dim dt2 As New DataTable 
     Dim ds As New DataSet 
     Dim da1 As New SqlDataAdapter("Select * from Table_1", con) 
     Dim builder1 As New SqlCommandBuilder(da1) 
     Try 
      con.ConnectionString = "Data Source=N0PCRIM9L3RYX1;Initial Catalog=RandomFormDB;Integrated Security=True" 
      con.Open() 
      da1.Fill(dt1) 
      dt1 = TryCast(DataGridView1.DataSource, DataTable) 
      'dt1.AcceptChanges() 
      da1.Fill(dt1) 
      da1.Update(dt1) 
      con.Close() 
     Catch ex As System.Data.SqlClient.SqlException 
      MsgBox(ex.Message) 
     End Try 
    End Sub 
End Class 

Public Class Load_Data 
    Public Sub Load() 
     Dim con As New SqlConnection 
     Dim da As New SqlDataAdapter("Select * from Table_1; Select * from Table_2", con) 
     Dim ds As New DataSet() 
     Try 
      con.ConnectionString = "Data Source=N0PCRIM9L3RYX1;Initial Catalog=RandomFormDB;Integrated Security=True" 
      con.Open() 
      da.Fill(ds) 
      Form1.DataGridView1.DataSource = ds.Tables(0) 
      Form1.DataGridView2.DataSource = ds.Tables(1) 
     Catch ex As System.Data.SqlClient.SqlException 
      MsgBox(ex.Message) 
     End Try 
     con.Close() 
    End Sub 
End Class 
+0

为什么TryCast会添加一个新行? – NoChance 2015-02-11 06:09:57

+0

plz查看完整的代码,我现在已经发布。由于两个GridView之间的多次交换,数据表经历了多行更改。直接从gridview的trycasting给我改变的表。但da.update(dt1)不适用于此。如果不是这样,我该怎么做这个任务? – 2015-02-11 10:13:20

回答

0

AcceptChanges调用对这种效果ü需要填写适配器你的DataTable的行。

,有它RowState集的东西从DataRowState.Unchanged不同将被设置为DataRowState.Unchanged除了与DataRowState.Deleted行将从表中删除所有行。

如果在调用AcceptChanges后调用适配器的Update方法,那么您正在有效地移除更新数据源的任何可能性。对你的Update方法说,哪些行需要更新的属性已被重置。

因此,要解决您的问题,只需删除AcceptChanges调用。 但还有另一个问题。当SqlDataAdapter绑定到第一个表(您用SELECT * FROM Table_1加载的表)时,您创建了一个SqlCommandBuilder,现在您试图更新不同的表,并且可能会使用不同的名称和不同的列。所以你的更新命令注定了。

看来你需要重建的SqlDataAdapter或使用您用来填充DataGridView1

编辑
看你更新的代码,我可以找到两个问题之一。
第一个是简单的解决,只是删除了两个人通话在你提交代码

Dim da1 As New SqlDataAdapter("Select * from Table_1", con) 
Dim builder1 As New SqlCommandBuilder(da1) 
Try 
    con.ConnectionString = "...." 
    con.Open() 
    dt1 = TryCast(DataGridView1.DataSource, DataTable) 
    da1.Update(dt1) 
    con.Close() 
Catch ex As System.Data.SqlClient.SqlException 
    MsgBox(ex.Message) 
End Try 

第二个问题是比较复杂的,以填充。当您单击将一行从一个网格移动到另一个网格时,可以使用两种方法使数据源(数据表)保持不变。 ImportRowRemove,如果仔细观察文档,会对所涉及行的RowState产生影响,使条件中的更新不能更新任何内容。

你应该尝试使用,而不是

.... 
For Each row In dt2.Rows 
    If row.Item("ID") = selecetedId Then 
     dt1.LoadDataRow(row.ItemArray) 
     row.Delete() 
     Exit For 
    End If 
Next 
.... 

也许这种做法会导致其他问题,如果你尝试从第二电网回搬回一行到第一行,但现在我不是在条件来测试这一点。如果您在访问已删除的行时遇到一些错误,那么您应该添加一个检查来验证加载的行是否不在已删除行的集合中(使用GetChanges方法)。

+0

我认为你是对的。所以,我上面发布了完整的代码。 PLZ建议我该如何做到这一点。在两个gridviews之间可以有多个交换,这就是为什么我尝试了,但我想它不会像这样工作。 Plz提出了一条出路。 – 2015-02-11 10:16:34

+0

我猜测rowstate不会更改为'更改',当我尝试。这就是为什么它不会更新到数据库中。如何做到这一点? – 2015-02-11 10:27:27

+0

两次调用填写'SubmitToDbButton_Click'?在第二次填充之后,你没有任何改变的行的机会。 – Steve 2015-02-11 10:44:26

0

表因此被载入

 da1.Fill(dt1) 
    dt1 = TryCast(DataGridView1.DataSource, DataTable) 'datatable gets new rows here 


后应更改为

dt1 = TryCast(DataGridView1.DataSource, DataTable) 
    da1.Fill(dt1) 
+0

它没有帮助。而是在gridview中复制行。 – 2015-02-11 10:37:26