2015-02-11 62 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