用access做应用程序,往往做成"数据"和"程序"两个数据库,"数据"数据库中只存放数据表,"程序"数据库中存放所有的form,query,report,module等,通过表联接"程序"数据库可以访问所有"数据"数据库中的表。 当我们的应用程序更换存储位置的时候往往失去正确的表联接,造成运行错误。下面的一段程序可以自动找回表联接。在我的应用中"程序"数据库名字是stockMgr.mdb,"数据"数据库名字是stock-Data.mdb
9 M1 h0 L M! H L$ ]9 w; x 注意: 该程序仅限于"程序"和"数据"存放在同一个目录而且是对应单个"数据"文件的情况。& _, X+ w; e i$ m. L% }3 [
Function ReAttachTable()8 ^' B5 g$ y2 b* U* l% N Z
Dim MyDB As Database, MyTbl As TableDef
# M. m2 \( Q4 K4 y1 z$ S6 w& [ Dim cpath As String0 p3 Z" w7 f; G$ d
Dim datafiles As String, i As Integer
4 _1 |0 f- u8 s4 Z9 A$ V( F On Error Resume Next
' z/ x6 `- @: K8 [6 L; G. P/ _. I Set MyDB = CurrentDb: y' s, p- f: p9 U7 g
cpath = trimFileName(CurrentDb.Name)' O9 }- D7 Q9 `' C6 l/ {
datafiles = "stock-data.mdb"
; ~4 \+ A) v( `4 d( { DoCmd.Hourglass True
+ d0 r8 x+ k# j For i = 0 To MyDB.TableDefs.Count - 1
" y- O/ I' W1 L/ H/ u Set MyTbl = MyDB.TableDefs(i)& V1 A. L* w9 \- g
If MyTbl.Attributes = DB_ATTACHEDTABLE And Left(MyTbl.Connect, 1) = ";" Then' v( X( S8 s7 G. A: _& H- C. ?3 q
MyTbl.Connect = ";DATABASE=" %26amp; cpath %26amp; datafiles
7 z/ G0 r* O3 l. Y \ MyTbl.RefreshLink
9 o, f$ L: O7 s- q2 P4 [& K If Err Then
) O0 K* H. m1 H5 ?: T If vbNo = MsgBox(Err.description %26amp; ",继续吗?", vbYesNo) Then Exit For
* J4 @' |# |! W; N5 `/ B6 ] End If
0 q" M' h: O) d% X End If
+ a# h% I. F) i% j+ _ Next i M/ }. \8 N: T' M; |- @& @
DoCmd.Hourglass False
+ d9 B% ^7 A5 y1 `# P% r msgbox "Tables relink finish."
+ X5 s e( K8 {- H End Function8 {# A# z% f! r& M5 T+ l2 p. {
'绝对路径中去掉文件名,返回路径
N; V7 e$ M( H0 H. Y& V; h$ j Function trimFileName(fullname As String) As String
% x) Q( C' W8 _ Z! u Dim slen As Long, i As Long
' M8 e- t: w% h) T. K l slen = Len(fullname)
. V) `$ | ^' M8 A$ q For i = slen To 1 Step -1
0 w, c W, j7 s' D0 c; m- [ If Mid(fullname, i, 1) = "\" Then
f; G; w3 Z% ? w/ A: L4 I Exit For9 t1 ?7 Z( L' V9 Z
End If6 |# Z3 E* l4 L ?
Next+ M" {& M" O, Q7 G
trimFileName = Left(fullname, i)) k0 w( n! K6 \& B, ]
End Function* T) q+ P3 h E% \% G' q% D
在程序启动或者按钮动作中调用即可。 |