Foxtable(狐表)用户栏目专家坐堂 → Merger合并access 怎么写条件:判断当前文件中的表里面某行数据与目标文件表里面的某行数据,所有字段都相同,就不合并,反之就合并当前文件到目标文件表里面。


  共有5011人关注过本帖树形打印复制链接

主题:Merger合并access 怎么写条件:判断当前文件中的表里面某行数据与目标文件表里面的某行数据,所有字段都相同,就不合并,反之就合并当前文件到目标文件表里面。

帅哥哟,离线,有人找我吗?
cnsjroom
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
Merger合并access 怎么写条件:判断当前文件中的表里面某行数据与目标文件表里面的某行数据,所有字段都相同,就不合并,反之就合并当前文件到目标文件表里面。  发帖心情 Post By:2022/3/20 12:12:00 [只看该作者]

Export导出Access  直接代码给Access设定一个密码,确保数据不被非授权打开!Merger合并access 代码定义密码后合并数据,怎么写条件:判断当前文件中的表里面某行数据与目标文件表里面的某行数据,所有字段都相同,就不合并,反之就合并当前文件到目标文件表里面。

每个表都有一个主键  身份证号 

 

当前代码如下:

Dim dlg As New SaveFileDialog '定义一个新的SaveFileDialog
dlg.Filter= "Access文件|*.mdb" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim lst As List(Of String)
    lst = Connections("廉政档案").GetTableNames
    For Each nm As String In lst
        Dim ex As New Exporter
        ex.SourceTableName = nm '指定导出表
        ex.filepath = dlg.FileName  '指定目标文件
        ex.Export() '开始导出
    Next

CompactAccessFile(dlg.FileName,"163.com")
    Dim Result As DialogResult
    Result = MessageBox.Show("数据备份完毕,是否需要打开文件所在目录?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    If Result = DialogResult.Yes Then      
        Dim Proc As New Process
        Proc.File = FileSys.GetParentPath(dlg.FileName)
        Proc.Start()
    End If
End If

 

 

导入代码:

Dim dlg As New openFileDialog '定义一个新的SaveFileDialog
dlg.Filter= "Access文件|*.mdb" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim file As String =dlg.FileName
    'For Each File As String In Filesys.GetFiles(dlg.FileName)
    If File.EndsWith(".mdb") '如果后缀名是mdb,说明此文件是access格式
       
        Dim lst As List(Of String)
        lst = Connections("廉政档案").GetTableNames
        For Each nm As String In lst
            Dim mg As New Merger
            mg.SourcePath = file

            mg.Filter = "" '指定合并条件

            mg.PassWord="163.com"
            mg.SourceTableName = nm
            mg.DataTableName = nm
            mg.Merge()

        Next

            Filesys.DeleteFile(File) '合并后删除文件
    Else
        MessageBox.Show("文件格式不对,请检查并选择mdb格式文件!","温馨提示")
    End If
    'Next
   
    MessageBox.Show("数据导入完毕|", "提示")
   
End If

[此贴子已经被作者于2022/3/20 15:00:05编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111424 积分:567196 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/20 20:31:00 [只看该作者]

Merger没有办法写这种条件。只能是遍历当前表所有行,然后使用find根据身份证查询目标表,再遍历所有列,逐个列数据判断是否相同

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)Merger没有办法写这种条件。只能是遍...  发帖心情 Post By:2022/3/21 2:02:00 [只看该作者]

当前代码实现遍历廉政档案数据源中的所有表及字段

怎么在判断所选择的acc数据文件里面的所有表及字段  与廉政档案数据源中的所有表及字段是否相同呢?如果相同就不写入  繁殖就写入

 

 

当前代码如下:【实际运行效率也不高,还要麻烦老师多多指导下!谢谢!】

 

' 获取身份证号不重复值
Dim Products As List(Of String)
Products = DataTables("干部花名册").GetValues("身份证号")
'获取数据源廉政档案里面的所有表
Dim lst As List(Of String)
lst = Connections("廉政档案").GetTableNames
For Each nm As String In lst
    '下列表名不含身份证号字段,先予以排除
    If nm.Contains("编号") Or nm.Contains("代码表") Or nm.Contains("参数设置") Or nm.Contains("单位归属") Or nm.Contains("数据操作日志") Or nm.Contains("干部信息") Or nm.Contains("档案目录")Then
    Else
        output.Show(nm)
        '从包含身份证号字段的所有表现遍历
        For Each bb As DataRow In DataTables(nm).DataRows
            '遍历身份证号,并查找对应的表中满足身份证号的数据行   如果有就开始遍历列
            For Each Product As String In Products
                Output.Show(Product)
                bb.DataTable.Find("身份证号='" & Product & "'")
                If bb IsNot Nothing Then
                    For Each cc As DataCol In DataTables(nm).DataCols
                        'output.show(cc.name)
                        'output.show("1")
                        output.show(bb(cc.name))
                    Next
                End If
            Next
           
        Next
    End If
Next


 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111424 积分:567196 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/21 8:42:00 [只看该作者]

动态添加数据源连接到access数据库:http://www.foxtable.com/webhelp/topics/1944.htm,然后一样使用GetTableNames这种方法获取数据库表。这种方法不要期望有什么效率。

给个相对简单的方法自己参考一下,在所有需要同步的表中添加一个【更新时间】列,可以到datacolchanged时间给【更新时间】列赋值为最新的电脑时间。
1、到目的表查询表中最大的【更新时间】列值,比如值为:2022-3-20 08:30:00
2、到来源表查询大于上面查询出来的【更新时间】列值(查询大于2022-3-20 08:30:00的数据)的数据,然后更新到目的表中

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)动态添加数据源连接到access数据库:...  发帖心情 Post By:2022/3/21 9:42:00 [只看该作者]

'A为目标表   b为来源表

假定所有表都已经添加了更新时间列,怎么写判断条件呢?

 

当前代码如下:


Dim lst As List(Of String)
lst = Connections("A").GetTableNames    

Connections.Add("B","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\abc.mdb;Persist Security Info=False")

Dim lst1 As List(Of String)
lst1 = Connections("B").GetTableNames
For Each nm As String In lst
   
    For Each nm1 As String In lst1
       
        Dim f As New Filler
        f.SourceTable = NM '指定数据来源
        f.DataTable = NM1 '指定数据接收表
       
        F.Filter="更新时间='" & ……("更新时间") & "'"
        f.Fill() '填充数据
       
    Next
   
Next


 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111424 积分:567196 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/3/21 10:02:00 [只看该作者]

Filler只能用于已添加到外部表管理中的表格,不能用于临时添加的数据源的表格,参考这种:http://www.foxtable.com/webhelp/topics/2137.htm

更新时间可以这样处理

dim d as date = DataTables("员工").compute("max(更新时间)")
Dim cmd As New SQLCommand
Dim
 dt As DataTable
Connections.Add("B","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\abc.mdb;Persist Security Info=False")
cmd.Conn
ectionName = "B"
cmd.CommandText = 
"SELECT * From {员工} where 
更新时间 >#" & d & "#"
dt = cmd.ExecuteReader()
For Each dr As DataRow In dt.DataRows
dim nr as datarow = DataTables("员工").Find("身份证号码 = '" & dr("身份证号码") & "'")
    If
 
nr Is Nothing Then
nrDataTables("员工").AddNew()
    End If
        For Each dc As DataCol In dt.DataCols
            nr(dc.name) = dr(dc.name)

        Next

Next

 回到顶部