none
請問各位大大VB.Net中兩個DataGridview比對問題 RRS feed

  • 問題

  • 請問各位大大:

    VB.Net中兩個DataGridview比對問題

    我有兩個Datagridview1與 Datagridview2

    Datagridview1是從Mysql取得的資料  Datagridview2是從Mssql 取得資料

    如果Datagridview1中的客戶編號不存在 Datagridview2中則將  Datagridview2中的資料插入datagridview1的來源資料庫中

    請問各位大大此程式該如何撰寫呢?  謝謝各位大大

    2019年6月10日 上午 07:42

所有回覆

  • 這個應該不牽涉到 DataGridView,DataGridView 是展現資料的元件,並非資料本身。

    你如果要比較,只要直接比較雙方的資料來源,我猜想你的資料來源應該是 DataTable。

    使用差集比較 ,就可以得到結果。類似以下這樣

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim table1 As DataTable = New DataTable()
            table1.Columns.Add("Number")
            table1.Columns.Add("Other")
            Dim table2 As DataTable = table1.Clone()
            For i As Integer = 0 To 9
                Dim row As DataRow = table1.NewRow
                row.Item(0) = i
                row.Item(1) = Chr(65 + i).ToString()
                table1.Rows.Add(row)
            Next
            Dim row1 As DataRow = table2.NewRow
            row1.Item(0) = 8
            row1.Item(1) = Chr(65 + 8).ToString()
            table2.Rows.Add(row1)
            Dim row2 As DataRow = table2.NewRow
            row2.Item(0) = 10
            row2.Item(1) = Chr(65 + 10).ToString()
            table2.Rows.Add(row2)
    
    
            Dim result As IEnumerable(Of DataRow) = table2.AsEnumerable().Except(table1.AsEnumerable(), New RowEqualityComparer)
    
            For Each item As DataRow In result
                System.Diagnostics.Debug.WriteLine(item(0).ToString() & ":" & item(1).ToString())
            Next
        End Sub
    Public Class RowEqualityComparer
        Implements IEqualityComparer(Of DataRow)
    
        Public Overloads Function Equals(x As DataRow, y As DataRow) As Boolean Implements IEqualityComparer(Of DataRow).Equals
            Return x.Item(0).Equals(y.Item(0))
        End Function
    
        Public Overloads Function GetHashCode(obj As DataRow) As Integer Implements IEqualityComparer(Of DataRow).GetHashCode
            Return obj.Item(0).GetHashCode()
        End Function
    End Class

    Dim result … 之前的程式碼只是為了做假資料而已,不用想太多,重點是 Except 取得差集,還有 RowEqualityComparer 的實作

    相關參考資料:
    比較 DataRow (LINQ to DataSet)

    Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月10日 下午 12:30
    版主
  • 您可以利用類似Select Not Exists敘述取得不存在於MySQL資料庫的SQL Server記錄, 再將這些記錄寫入SQL Server
    2019年6月11日 上午 01:23
  • 謝謝大大的回覆

    但我是兩個不同資料庫取直做比較 所以才不知怎麼寫  感謝您的回覆

    2019年6月19日 上午 03:17
  • 首先感謝大大的回覆 但我的問題是這樣

    1.兩個不同資料庫 一個是MSSQL資料庫(圖一) 另一個是mysql(圖二)

    2.我要將MSSQL資料庫中客戶資料表與Mysql 資料庫客戶資料表作比較

    3.當MSSQL中資料表中的客戶資料不存在MYSQL中則將 MSSQL中的某些欄位(如客戶代號,公司名稱,統一編號)拷貝到MYSQL中的account_no , accountname,siccode)中

    4.但mysql資料庫客戶資料表中有一個欄位叫accountid 他是手動生成也就是在程式中案新增時會在最後一筆資料下加一產生

    5.總結就是當兩個不同資料庫中的客戶資料做比較 當MSSQL的客戶資料不在Mysql資料庫的客戶資料中則將客戶代號,公司名稱,統一編號拷貝到mysql的客戶資料表中accountid從mysql從現行資料中最後一筆開始插入. PS:客戶代號不允許NULL    謝謝各位大大指教

    2019年6月19日 上午 03:56
  • 用 DataTable 和資料庫形式一不一樣完全無關啊。DataGridView 的資料來自於 DataTable,那要比資料,用 DataTable 的內容比較是很正常的。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月19日 下午 02:38
    版主
  • 感謝大大 

    但我測試老半天還是不知怎樣下手

    2019年6月20日 上午 06:08
  • (1) 讀取資料庫 1 => 塞進 DataTable1

    (2) 讀取資料庫 2 => 塞進 DataTable2

    (3) 建立一個類別,實作 IEqualityComparer(Of DataRow) 介面

    根據上面的範例,在多載的 Equals method 內容實作兩個 DataRow 的比較方式 . 依據你要用哪個欄位做為比較去比就好

     GetHashCode 一樣,就是拿你要比較的那個欄位呼叫其 GetHashCode 就好

    (4) 在主程式用 linq 的 Except 方法

    就這樣


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月20日 上午 06:21
    版主
  • 大大你好

    我的程式碼如下

    但出現資料行"客戶代號不允許為NULL  請問我要改寫哪裡呢?  感謝您

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

     Dim da As New MySqlDataAdapter
            Dim ds As New DataSet
            GetKDBConn()
            Dim str1 As String = "select * from vtiger_account"

            Dim adp1 As MySqlDataAdapter = New MySqlDataAdapter(str1, KDBconn)

          
            Dim set1 As DataSet = New DataSet
                
            KDBconn.Close()
            GetSqlConn()

            Dim table1 As DataTable = New DataTable()
            table1 = set1.Tables("1a")
            table1.Columns.Add("Number")
            table1.Columns.Add("Other")
            Dim conn As SqlConnection
            Dim strDbCon As String
            Dim dss As New DataSet
            Dim cmd As SqlCommand
            Dim sqlstr As String
            strDbCon = "Persist Security Info=False;User ID=sa;pwd=****;Initial Catalog=****;Data Source=192.168.1.236\database"
            conn = New SqlConnection(strDbCon)
            conn.Open()
            sqlstr = " Select ROW_NUMBER() OVER(ORDER BY 客戶代號 ASC) AS Row#, 客戶代號,公司名稱,負責人,統一編號,電話一,傳真號碼 from 客戶 "
            cmd = New SqlCommand(sqlstr, conn)
            cmd.ExecuteNonQuery()
           
            Dim table2 As DataTable = table1.Clone()
            Using Rdr As SqlDataReader = cmd.ExecuteReader
                table2.Load(Rdr)
            End Using
            For i As Integer = 0 To 9
                Dim row As DataRow = table1.NewRow
                row.Item(0) = i
                row.Item(1) = Chr(65 + i).ToString()
                table1.Rows.Add(row)
            Next
            Dim row1 As DataRow = table2.NewRow
            row1.Item(0) = 8
            row1.Item(1) = Chr(65 + 8).ToString()
            table2.Rows.Add(row1)
            Dim row2 As DataRow = table2.NewRow
            row2.Item(0) = 10
            row2.Item(1) = Chr(65 + 10).ToString()
            table2.Rows.Add(row2)

            Dim result As IEnumerable(Of DataRow) = table2.AsEnumerable().Except(table1.AsEnumerable(), New RowEqualityComparer)

            For Each item As DataRow In result
                System.Diagnostics.Debug.WriteLine(item(0).ToString() & ":" & item(1).ToString())
            Next

        End Sub

    2019年6月21日 上午 07:31
  • 你的資料都已經從 DB 讀回來了,不需要那些 Rows.Add

    我的範例裡面, 在 Dim result As IEnumerable(Of DataRow) 之前的程式碼純粹是為了要做假資料,你為什麼會照著抄下來? (而且我在說明中有提醒你)

    你應該先理解我的範例在做甚麼,然後再改成你所需要的。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月21日 上午 07:58
    版主