none
刪除DataSet記錄的問題 RRS feed

  • 問題

  • 1.假設我配合 A 資料庫作業,A 資料庫使用「學號」欄作主索引,並應用DataGridView處理記錄。
    2.假設我使用 BindingSource.RemoveCurrent() 刪除 0001 學號,這筆記錄會被刪除,沒什問題。
    3.問題出在 0001 學號被刪除之後,它僅是在 DataSet 內被標註刪除,但它並沒有消失。
    4.因此,只要我再次輸入相同學號  0001,VB 就會提示記錄重覆,糟糕,現在這個學號我須要用到它。

    5.請問,我該如何將刪除的記錄真實移除掉,以便排除上列錯誤?。
    6.不要使用存檔,再讀檔的過程,這會使畫面跑到起始頁。

    敬請指導。

    chian
    2009年3月10日 上午 08:05

解答

  • 我的習慣是每做一筆就會執行刪除
    如果你要用Batch的話,有一種方法是利用自訂SqlDataAdapter的insertCommand,UpdateCommand和DeleteCommand
    底下有一個範例你可以試試
    Public Class Form1  
        Dim strConn As String = "Server=Localhost\SQLEXPRESS;Database=TestDB;USER ID=Test;Password=Test" 
        Dim sBindingSource As New BindingSource  
        Dim myDataset As New DataSet  
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  
            BuildDGV()  
           
        End Sub  
        Private Sub BuildDGV()  
     
            Dim MyConn As SqlConnection  
     
            MyConn = New SqlConnection(strConn)  
            CreatDataAdapter(MyConn).Fill(myDataset) '呼叫Select   
            MyConn.Close()  
            MyConn.Dispose()  
            sBindingSource.DataSource = myDataset.Tables(0)  
            DataGridView1.DataSource = sBindingSource 
     
        End Sub  
          
        Private Function CreatDataAdapter(ByVal MyConn As SqlConnection) As SqlDataAdapter  
            Dim adapter As SqlDataAdapter = New SqlDataAdapter()  
            Dim MyCmd As SqlCommand  
            '========Select Command  
            Dim SQLStr As String = " Select A,B,C from TBXX  " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            adapter.SelectCommand = MyCmd 
            '=========================================  
     
            '========Delete Command========  
            SQLStr = "Delete TBCard Where A=@A " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            adapter.DeleteCommand = MyCmd 
            '============================  
     
            '========Update Command========  
            SQLStr = "Update TBCard Set Card_B=@B,C=@C Where A=@A " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@B", SqlDbType.VarChar, 10, "B")  
            MyCmd.Parameters.Add("@C", SqlDbType.TinyInt, 2, "C")  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            adapter.UpdateCommand = MyCmd 
            '========================================  
     
            '======= insert Command====================  
            SQLStr = "Insert Into TBCard (A,B,C) " 
            SQLStr = SQLStr & " Values (@A,@B,@C)"  
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            MyCmd.Parameters.Add("@B", SqlDbType.VarChar, 10, "B")  
            MyCmd.Parameters.Add("@C", SqlDbType.TinyInt, 2, "C")  
            
            adapter.InsertCommand = MyCmd 
     
            Return adapter  
        End Function  
     
        Private Sub 儲存SToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 儲存SToolStripButton.Click  
            Dim MyConn As SqlConnection  
            MyConn = New SqlConnection(strConn)  
            CreatDataAdapter(MyConn).Update(myDataset.Tables(0)) '依狀況呼叫Delete,update,insert  
     
        End Sub 
    End Class
    • 已標示為解答 chian 2009年3月11日 上午 01:26
    2009年3月11日 上午 12:45
    版主

所有回覆

  • 你再次輸入學號的程式是去比對資料庫裡的資料表吧?
    你用BindingSource.Remove移掉的是在記憶體的資料
    如果重讀,那筆資料一定還在
    就像我們把資料讀到DataTable的物件以後,如果沒別的處置
    把DataTable改來改去,資料庫的資料表依然還是你讀取時的狀態一樣
    這樣的話,你應該在BindingSouce Remove之後去執行SQL delete,真的將這筆資料移除
    也不用再讀資料庫的資料表,因為你的DataGridView基本上會跟著Binding Source走
    所以兩邊都會移除了
    2009年3月10日 上午 09:00
    版主
  • 1.感謝說明。
    2.依您的說明,是否表示每刪除一筆記錄,就應執行一次 Update ? (為了要執行 SQL delete)。
    3.但配合DataGridView處理記錄,應以成批處理記錄為主,適合不斷的 Update 嗎?

    敬請再指導,謝謝。
    chian
    2009年3月10日 下午 12:37
  • 我的習慣是每做一筆就會執行刪除
    如果你要用Batch的話,有一種方法是利用自訂SqlDataAdapter的insertCommand,UpdateCommand和DeleteCommand
    底下有一個範例你可以試試
    Public Class Form1  
        Dim strConn As String = "Server=Localhost\SQLEXPRESS;Database=TestDB;USER ID=Test;Password=Test" 
        Dim sBindingSource As New BindingSource  
        Dim myDataset As New DataSet  
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  
            BuildDGV()  
           
        End Sub  
        Private Sub BuildDGV()  
     
            Dim MyConn As SqlConnection  
     
            MyConn = New SqlConnection(strConn)  
            CreatDataAdapter(MyConn).Fill(myDataset) '呼叫Select   
            MyConn.Close()  
            MyConn.Dispose()  
            sBindingSource.DataSource = myDataset.Tables(0)  
            DataGridView1.DataSource = sBindingSource 
     
        End Sub  
          
        Private Function CreatDataAdapter(ByVal MyConn As SqlConnection) As SqlDataAdapter  
            Dim adapter As SqlDataAdapter = New SqlDataAdapter()  
            Dim MyCmd As SqlCommand  
            '========Select Command  
            Dim SQLStr As String = " Select A,B,C from TBXX  " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            adapter.SelectCommand = MyCmd 
            '=========================================  
     
            '========Delete Command========  
            SQLStr = "Delete TBCard Where A=@A " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            adapter.DeleteCommand = MyCmd 
            '============================  
     
            '========Update Command========  
            SQLStr = "Update TBCard Set Card_B=@B,C=@C Where A=@A " 
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@B", SqlDbType.VarChar, 10, "B")  
            MyCmd.Parameters.Add("@C", SqlDbType.TinyInt, 2, "C")  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            adapter.UpdateCommand = MyCmd 
            '========================================  
     
            '======= insert Command====================  
            SQLStr = "Insert Into TBCard (A,B,C) " 
            SQLStr = SQLStr & " Values (@A,@B,@C)"  
            MyCmd = New SqlCommand(SQLStr, MyConn)  
            MyCmd.Parameters.Add("@A", SqlDbType.Int, 8, "A")  
            MyCmd.Parameters.Add("@B", SqlDbType.VarChar, 10, "B")  
            MyCmd.Parameters.Add("@C", SqlDbType.TinyInt, 2, "C")  
            
            adapter.InsertCommand = MyCmd 
     
            Return adapter  
        End Function  
     
        Private Sub 儲存SToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 儲存SToolStripButton.Click  
            Dim MyConn As SqlConnection  
            MyConn = New SqlConnection(strConn)  
            CreatDataAdapter(MyConn).Update(myDataset.Tables(0)) '依狀況呼叫Delete,update,insert  
     
        End Sub 
    End Class
    • 已標示為解答 chian 2009年3月11日 上午 01:26
    2009年3月11日 上午 12:45
    版主