以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  AB表同步  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=161320)

--  作者:BG小白
--  发布时间:2021/3/13 1:41:00
--  AB表同步
我现在是读取了MYSQL的表,生成了一张临时A表,然后清空B表,把A表的每一行都新增进去
Dim mda As New MySql.Data.MySqlClient.MySQLDataAdapter("s elect distinct spdm,pic_name from ipos_sptpk" , conn) \'这里可以设置你的查询语句
Dim ds As New System.Data.DataSet()
mda.Fill(ds, "TableTemp") \'MySQLDataAdapter方法把数据放到一个新建的临时表里,这个临时表名可自定义,我这里写TableTemp

For Each r As System.Data.DataRow In ds.Tables(0).Rows
    Dim dr As DataRow = DataTables("SPTPB").AddNew()
    dr("spdm") = r("spdm")
    dr("pic_name") = r("pic_name")
Next
conn.close
DataTables("SPTPB").Save()
但是这样好慢,能不能生成临时A表后,对比B表,SPDM字段相同的对比PIC_NAME的内容,有变化就修改成和A表一致,如果A表没有该行,那就删除B表里面的行,A表有B表没有,那就复制该行到B表
Dim dt2 As DataTable = DataTables("A表")
Dim dr0 As DataRow 
For i As Integer = DataTables("B表").DataRows.Count - 1 To 0 Step -1
    dr0 = DataTables("B表").DataRows(i)
    If DataTables("A表").Find("第一列=\'" & dr0("第一列") & "\' and 第二列=\'" & dr0("第二列") & "\'") Is Nothing Then ’这里是对比两个数据,我是想根据第一列相同,第二列不同的找出来
        dr0.Delete ’这里现在是删除,如何变成修改第二列呢?因为对比的是第一列
        Dim ndr As DataRow = dr0.AddNew \'这里我是想把对比A表,B表没有的,从A表复制到B表里面,但是代码无效
        ndr("第一列") = dr0("第一列")
        ndr("第二列") = dr0("第二列")
    End If
Next
[此贴子已经被作者于2021/3/13 1:42:36编辑过]

--  作者:BG小白
--  发布时间:2021/3/13 2:03:00
--  
还有就是根据相同的第一列,找出第二列或者第三列,第四列不同的出来,进行修改,该怎么写
--  作者:BG小白
--  发布时间:2021/3/13 2:56:00
--  
我想了一个笨办法
Dim dr0 As DataRow
For i As Integer = DataTables("B表").DataRows.Count - 1 To 0 Step -1
    dr0 = DataTables("B表").DataRows(i)
    If DataTables("A表").Find("第一列=\'" & dr0("第一列") & "\' and 第二列=\'" & dr0("第二列") & "\'") Is Nothing Then 
        dr0.Delete
    End If
Next
Dim dr9 As DataRow
For i As Integer = DataTables("A表").DataRows.Count - 1 To 0 Step -1
    dr9 = DataTables("A表").DataRows(i)
    If DataTables("B表").Find("第一列=\'" & dr9("第一列") & "\' and 第二列=\'" & dr9("第二列") & "\'") IsNot Nothing Then 
        dr9.Delete
    End If
Next
Dim Cols1() As String = {"第一列","第二列"}
Dim Cols2() As String = {"第一列","第二列"}
For Each dr1 As DataRow In DataTables("A表").Select("")
    Dim dr2 As DataRow = DataTables("B表").AddNew()
    For i As Integer = 0 To Cols1.Length -1
        dr2(Cols2(i)) = dr1(Cols1(i))
    Next
Next
但是只能执行一次,执行第二次的话,B表只会留下A表新增过来的行
[此贴子已经被作者于2021/3/13 2:56:55编辑过]

--  作者:BG小白
--  发布时间:2021/3/13 3:00:00
--  
Dim dr0 As DataRow
For i As Integer = DataTables("B表").DataRows.Count - 1 To 0 Step -1
    dr0 = DataTables("B表").DataRows(i)
    If DataTables("A表").Find("第一列=\'" & dr0("第一列") & "\' and 第二列=\'" & dr0("第二列") & "\'") Is Nothing Then 
        dr0.Delete
Else
Return  这里加进去会报错,提示加入返回值
    End If
Next

--  作者:有点蓝
--  发布时间:2021/3/13 12:06:00
--  
如果A表和B表都是同一个数据库的表,或者都是内部表,可以使用sql处理,比如

de
lete B表.* from B表,A表 where B表.第一列=A表.第一列 and B表.第二列 = A表.第二列

或者试试这样加载第一列相同,第二列不同的数据

select A表.* from B表 ininer join A表 where B表.第一列=A表.第一列 and B表.第二列 <> A表.第二列

--  作者:BG小白
--  发布时间:2021/3/13 13:39:00
--  
蓝老师,A表是临时表,B表是外部数据表
--  作者:有点蓝
--  发布时间:2021/3/13 14:40:00
--  
那就只能是3楼那种用法了。执行的时候不要把A表数据删除
--  作者:BG小白
--  发布时间:2021/3/13 15:55:00
--  
好的,谢谢,三楼的问题重新加载一次临时表就没有问题了
--  作者:BG小白
--  发布时间:2021/3/13 17:17:00
--  

    Dim conn As MySql.Data.MySqlClient.MySqlConnection
    Dim cmd As MySql.Data.MySqlClient.MySqlCommand
    
    Dim connStr As String = "server=127.0.0.1; port=3306; user id=root; password=mima; database=ipos;CharSet=utf8" \'设置你的数据库连接字符串
    conn = New MySql.Data.MySqlClient.MySqlConnection(connStr)
    conn.Open
    
    Dim mda As New MySql.Data.MySqlClient.MySQLDataAdapter("se lect distinct spdm,pic_name from ipos_sptpk" , conn) \'这里可以设置你的查询语句
    Dim ds As New System.Data.DataSet()
    mda.Fill(ds, "TableTemp") \'MySQLDataAdapter方法把数据放到一个新建的临时表里,这个临时表名可自定义,我这里写TableTemp
Dim dr0 As DataRow
For i As Integer = DataTables("SPTPB").DataRows.Count - 1 To 0 Step -1
    dr0 = DataTables("SPTPB").DataRows(i)
    If DataTables("TableTemp").Find("SPDM=\'" & dr0("SPDM") & "\' and pic_name=\'" & dr0("pic_name") & "\'") Is Nothing Then 
        dr0.Delete
    End If
Next
Dim dr9 As DataRow
For i As Integer = DataTables("TableTemp").DataRows.Count - 1 To 0 Step -1
    dr9 = DataTables("TableTemp").DataRows(i)
    If DataTables("SPTPB").Find("SPDM=\'" & dr9("SPDM") & "\' and pic_name=\'" & dr9("pic_name") & "\'") IsNot Nothing Then 
        dr9.Delete
    End If
Next
Dim Cols1() As String = {"SPDM","pic_name"}
Dim Cols2() As String = {"SPDM","pic_name"}
For Each dr1 As DataRow In DataTables("TableTemp").Select("")
    Dim dr2 As DataRow = DataTables("SPTPB").AddNew()
    For i As Integer = 0 To Cols1.Length -1
        dr2(Cols2(i)) = dr1(Cols1(i))
    Next
Next
    conn.close
    DataTables("SPTPB").Save()
End If

为什么找不到这个表呢

--  作者:有点蓝
--  发布时间:2021/3/13 17:33:00
--  
只有foxtable里的用法加载的表才能使用DataTables("xxx")这种用法。第三方数据库加载的临时表无法这样用