(转)如何使用ADOX/DAO刷新/更新/删除并重定义链接表

学习提速专享!AI工具全家桶免费用 限时购周边加赠Coding Plan Lite,解锁20+主流AI工具,写代码、查资料快人一步! 阅读详情
方法一:

 如何使用ADOX刷新链接表 
 
Public Sub NewLinkedExternalTableMdb() 
   
  ' strTargetDB: 被链接的数据库路径名 
  ' strProviderString: 连接字符串 
  ' strSourceTbl: 被链接的源表名称 
  ' strLinkTblName: 要重设链接的链接表的名称 
  Dim strTargetDB() As String 
  Dim strProviderString() As String 
  Dim strSourceTbl() As String 
  Dim strLinkTblName() As String 
   
  Dim catDB  As ADOX.Catalog 
  Dim tblLink As ADOX.Table 
  Dim tmpLink As ADOX.Table 
   
  Dim i As Integer 
  Dim j As Integer 

 

  Set catDB = New ADOX.Catalog 
  catDB.ActiveConnection = CurrentProject.Connection 
   
  i = catDB.Tables.Count 
   
  ReDim strTargetDB(i) 
  ReDim strProviderString(i) 
  ReDim strSourceTbl(i) 
  ReDim strLinkTblName(i) 
   
  i = 1 
   
  For Each tmpLink In catDB.Tables 
     
    If tmpLink.Properties("Jet OLEDB:Create Link") Then 
      If Trim(tmpLink.Properties("Jet OLEDB:Remote Table Name")) <> "" Then 
       
        Debug.Print tmpLink.Name & " | " & tmpLink.Properties("Jet OLEDB:Remote Table Name") 
         
        strLinkTblName(i) = tmpLink.Name 
        strTargetDB(i) = tmpLink.Properties("Jet OLEDB:Link Datasource") 
        strProviderString(i) = tmpLink.Properties("Jet OLEDB:Link Provider String") 
        strSourceTbl(i) = tmpLink.Properties("Jet OLEDB:Remote Table Name") 
         
        Do While InStr(1, strTargetDB(i), "/") <> 0 
          strTargetDB(i) = Mid(strTargetDB(i), InStr(1, strTargetDB(i), "/") + 1, Len(strTargetDB(i))) 
        Loop 
         
        strTargetDB(i) = CurrentProject.Path & "/" & strTargetDB(i) 
         
        i = i + 1 
      End If 
    End If 
   
  Next 
   
  j = i - 1 
   
  For i = 1 To j 
    catDB.Tables.Delete strLinkTblName(i) 
       
    Set tblLink = New ADOX.Table 
       
    With tblLink 
      .Name = strLinkTblName(i) 
      Set .ParentCatalog = catDB 
         
      .Properties("Jet OLEDB:Create Link") = True 
      .Properties("Jet OLEDB:Link Datasource") = strTargetDB(i) 
      .Properties("Jet OLEDB:Link Provider String") = strProviderString(i) 
      .Properties("Jet OLEDB:Remote Table Name") = strSourceTbl(i) 
    End With 
         
    catDB.Tables.Append tblLink 
    Set tblLink = Nothing 
  Next 
  Set catDB = Nothing 
  'DoCmd.TransferDatabase acLink, "microsoft Access", "C:/a.mdb", acTable, "表1", "表x1"
  '也可以达到链接表的效果
End Sub 


 


方法二:

 -----------------------------------------------------------
以前还用了个DAO的,放一起吧,记得引用DAO
-----------------------------------------------------------
Public Function RefreshLinks(strFileName As String) As Boolean
    Dim dbsOrders As DAO.Database
    Dim tdf As DAO.TableDef
    Dim intCount As Integer
On Error GoTo ErrorHandler
    Set dbsOrders = CurrentDb
    For intCount = 0 To dbsOrders.TableDefs.Count - 1
        
        Set tdf = dbsOrders.TableDefs(intCount)
        Debug.Print tdf.name & "-----找到表"
        If tdf.name = "~TMPCLP192931" Or tdf.name = "ke_hu1" Or tdf.name = "dbo_票点" Then
            Debug.Print "Ke_hu表因为是DBASE 5类型无法更新因此跳过"
        Else
            If Len(tdf.Connect) > 0 Then
                tdf.Connect = ";DATABASE=" & strFileName
                Err.Number = 0
                On Error Resume Next
                tdf.RefreshLink         ' Relink the table.
                If Err.Number <> 0 Then
                    RefreshLinks = False
                    Exit Function
                End If
            End If
        End If
    Next intCount
    RefreshLinks = True        ' Relinking complete.
    Exit Function
ErrorHandler:
    MsgBox "Error#:  " & Err.Number & vbCrLf & Err.Description
    RefreshLinks = False
End Function

 

 

 

方法三:

 
【摘】重新定位链接表二步走 

 

[ kevindeng  2003年7月20日,阅读人数193人 ]
 
 
 
 
尽管Accxp网上有很多关于定位链接表的贴子,但还是有很多的朋友询问这方面的问题。应letter网友的提议,结合Alex总版主的重新定位链接表文件源码,现将这方面的具体操作介绍如下: 

假设前台数据库文件名为frontBase.mdb 
后台数据库文件名为backData.mdb 
frontBase当中有链接表tbl1, tbl2, tbl3, …,链接到backData.mdb中 

首先我们要在前台数据库文件的启动窗体加载事件中判断链接是否正确,方法是打开任意一个链接表,假设为tbl1,代码如下: 

Public Function CheckLinks() As Boolean 
' 检查到后台数据库的链接;如果链接存在且正确的话,返回 True 。   
  Dim dbs As Database, rst As DAO.Recordset   
  Set dbs = CurrentDb() 
  ' 打开链接表查看表链接信息是否正确。 
  On Error Resume Next 
  Set rst = dbs.OpenRecordset(“tbl1”) 
  rst.Close 
  ' 如果没有错误,返回 True 。 
  If Err = 0 Then 
    CheckLinks = True 
  Else 
    CheckLinks = False 
  End If   
End Function 


启动窗体的加载事件: 
Private Sub FORM_Load() 
If CheckLinks = False then 
Docmd.OpenFORM “frmConnect” 
End If 
End Sub 


frmConnect 连接窗体如下图 

 


接下来的事情就是如何刷新链接表了。 
上面的窗体右边的按钮是用用来调用API打开文件对话框,具体代码如下: 

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean 

 

Type OPENFILENAME 
  lStructSize As Long 
  hwndOwner As Long 
  hInstance As Long 
  lpstrFilter As String 
  lpstrCustomFilter As String 
  nMaxCustFilter As Long 
  nFilterIndex As Long 
  lpstrFile As String 
  nMaxFile As Long 
  lpstrFileTitle As String 
  nMaxFileTitle As Long 
  lpstrInitialDir As String 
  lpstrTitle As String 
  flags As Long 
  nFileOffset As Integer 
  nFileExtension As Integer 
  lpstrDefExt As String 
  lCustData As Long 
  lpfnHook As Long 
  lpTemplateName As String 
End Type 

Private Sub FileOpen_Click() 
  Dim ofn As OPENFILENAME 
  Dim rtn As String 

  ofn.lStructSize = Len(ofn) 
  ofn.hwndOwner = Me.hwnd 
  
  ofn.lpstrFilter = "数据库文件 (*.mdb)" & vbNullChar & "*.mdb" 
  ofn.lpstrFile = Space(254) 
  ofn.nMaxFile = 255 
  ofn.lpstrFileTitle = Space(254) 
  ofn.nMaxFileTitle = 255 
  ofn.lpstrInitialDir = CurrentProject.Path 
  ofn.lpstrTitle = "后台数据文件为" 
  ofn.flags = 6148 

  rtn = GetOpenFileName(ofn) 
  
  FileName.SetFocus 
  If rtn = True Then 
    FileName.Text = ofn.lpstrFile 
    FileName.Text = FileName.Text 
    OK.Enabled = True 
  Else 
    FileName.Text = "" 
  End If 
End Sub 



连接按钮刷新链接表,代码如下: 
Private Sub OK_Click() 
Dim tabDef As TableDef 
For Each tabDef In CurrentDb.TableDefs 
If Len(tabDef.Connect) > 0 Then 
tabDef.Connect = ";DATABASE=" & Me.FileName.Text & ";PWD=" + 后台数据库密码 
tabDef.RefreshLink 
End If 
Next 
MsgBox "连接成功!" 
DoCmd.Close acFORM, Me.Name 
End Sub 

其实很简单只有两步,判断链接是否正确和刷新链接表。 
 

 

 

方法四:

 直接用TransferDatabase 来完成
Function OnStart()
    CheckLink "Switchboard Items;tblInExMoney;tblInExType;tblMoneyType;tblTransferMoney;tblType", "收支平衡表.mdb"
End Function
Function CheckLink(ByVal strTableName As String, strDBName As String)
    On Error Resume Next
    Dim strA() As String
    strA = Split(strTableName, ";")
    Dim i As Integer
    
    For i = 0 To UBound(strA)
        DoCmd.DeleteObject acTable, strA(i)
        DoCmd.TransferDatabase acLink, "microsoft Access", CurrentProject.Path & "/" & strDBName, acTable, strA(i), strA(i)
    Next

 

End Function


VB使用DAO控制ACCESS链接表! 在一家使用Access开始程序的公司做项目,改进原系统成为支持Barcode的物流系统.他们使用程序和数据分离的方法,Access的程序使用链接表指向原始表,就可以在程序中直接操作链接表就像操作本地表一样.由于将数据部署在服务器上做为生产数据库,则调试时将使用本地数据进行调试,在程序中就要频繁更改链接表的指向.以前他们都是手动进行修改很是忙烦,我看了下DAO的资料就写个小程序控制链接表.程序如 阅读详情

相关推荐

ADO, DAO, DoCmd.RunSQL 三种方式用哪一种?

对ACCESS来进行操作,特别是SQL语句的执行,ACCESS中提供了多种手段。 ADO, DAO 以及 docmd.runsql以下摘自 Microsoft Access 2003 Help在 Microsoft Access 2002 和更高版本中使用 ActiveX 数据对象Microsoft Access 2002 提供了三种对象模型,用于通过使用 Visual Bas

ACMAIN_CHM的专栏 5961

C#操作Access数据库 增删改查

本文以ADOX操作Access 1、在C#中新建AccessClass.cs文件,内容如下 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Collections; 6 using Syste...

u011555996的博客 3144

使用ADOX创建Access数据库和表

using System;using ADOX; namespace WebPortal{ ///  /// CreateAccessDB 的摘要说明。 /// 对于不同版本的ADO,需要添加不同的引用  /// 请添加引用Microsoft ADO Ext. 2.7 for DDL and Security  /// 请添加引用Microsoft ADO Ext. 2.8 for DDL a

【孟子E章】 2万+

LinkTable的简单实现

package first; public class LinkTable { private LinkNode head = null; private int counts = 0; /** * 在链头给链表增加结点 **/ public void insertFront(int d) { if (head == null) { head = new LinkN

深爱着--- 2038

Qt结合ADOX建立Access数据库文件(一)

Qt结合ADOX建立Access数据库文件 楼主用Qt5开发一款软件,其中需要新建Access数据库文件,楼主找了很久,都是教去连接Access数据库的方法,没有说到新建的方法,最后都说用ADOX去做,但是给的例子都不是很完整或者不可行,所以楼主整理保存以及分享一个完整可行的例子 1.首先去到这个这个目录下C:\Program Files\Common Files\System\msadc查看是否有msado15.dll以及msadox.dll这两个dll,一般来说只要安装office套件都会的 2.新建工

我是黄同学博客 1680

面向对象来理解链表

目录 一、链表知识 1.1 链表定义 1.2 链表结构 1.3 优点 1.4 单链表、双链表、循环链表拓展 1.5 本文说明二、面向对象分析链表 2.1 节点封装类Node.java 2.2 链表封装类ChainTable.java 2.3 关于环的补充 2...

194

VC 操作ACCESS的创建数据库,表,添加修改删除记录等

VC 操作ACCESS的创建数据库,表,添加\修改\删除记录等 #import "C:\Program Files\Common Files\System\ado\msadox.dll" #import "C:\Program Files\Common Files\S

qinxiaoli1204的专栏 4621

创建ODBC链接表连SQL源码示例

创建ODBC链接表连SQL源码示例 Private Sub 创建_Click()     Dim cnn As String     Dim dbs As Object    'Database     Dim tdf As Object    'DAO.TableDef     Set dbs = CurrentDb     '下面是ODBC连接SQL字符串

yfglinwei的博客 1005

ADOX学习

1、ADOX 概述 Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) 是对 ADO 对象和编程模型的扩展。它可用于创建、修改和删除模式对象。它还包括安全对象,可用于维护用户和组,以及授予和撤消对象的权限。要通过开发工具使用 ADOX,需要建立对 A...

luotuoass 259

使用代码刷新ODBC链接SQL SEVER表

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 631
上一篇: MSDN:OpenSchema 方法 (ADO)
下一篇: (转)模拟QQ截屏
早起旺财
博客等级 码龄24年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值