用access做应用程序,往往做成"数据"和"程序"两个数据库,"数据"数据库中只存放数据表,"程序"数据库中存放所有的form,query,report,module等,通过表联接"程序"数据库可以访问所有"数据"数据库中的表。 当我们的应用程序更换存储位置的时候往往失去正确的表联接,造成运行错误。下面的一段程序可以自动找回表联接。在我的应用中"程序"数据库名字是stockMgr.mdb,"数据"数据库名字是stock-Data.mdb, d3 w0 c& p2 E4 Z1 h
注意: 该程序仅限于"程序"和"数据"存放在同一个目录而且是对应单个"数据"文件的情况。7 w; d: Q+ _/ i, q U j( C1 J
Function ReAttachTable()# g, F |. ]( k6 }+ r) \
Dim MyDB As Database, MyTbl As TableDef E- R& h, Y/ x0 b
Dim cpath As String8 f! E. Z8 e8 G8 B* Y* ^/ b/ s4 R4 S
Dim datafiles As String, i As Integer
0 {0 D1 [' F' f' r5 n q On Error Resume Next* y6 E, R+ d! D/ C$ w
Set MyDB = CurrentDb0 M) H; O) |: B8 F6 N N, R0 i
cpath = trimFileName(CurrentDb.Name)
" `. N0 L! D6 |& k1 z" B* ?1 B& z datafiles = "stock-data.mdb"
8 W" H/ C+ `! c( Z; A6 W! ?( E' [; \ DoCmd.Hourglass True5 \8 ~- H3 R8 V
For i = 0 To MyDB.TableDefs.Count - 1
/ Y y* z7 h9 U2 P! A Set MyTbl = MyDB.TableDefs(i)
$ S l) a/ \2 X( s& m2 j If MyTbl.Attributes = DB_ATTACHEDTABLE And Left(MyTbl.Connect, 1) = ";" Then$ G; R, W" h# Y, @% t" _: I
MyTbl.Connect = ";DATABASE=" %26amp; cpath %26amp; datafiles0 E7 ]; p0 M; ^( b7 \% h
MyTbl.RefreshLink2 G8 N9 V2 `$ H0 P, H: f+ U. K, v
If Err Then
- `" i, y1 d0 e$ e If vbNo = MsgBox(Err.description %26amp; ",继续吗?", vbYesNo) Then Exit For
, g" o+ o9 B; ~+ l" j- G- I" h End If
6 g) Z9 b* x5 R4 g* [ End If
1 D2 \; m4 t9 s5 \% c6 e z Next i
$ B( R4 L" w# o5 |& i2 s/ v DoCmd.Hourglass False/ c# I- O, D* ~. X4 }
msgbox "Tables relink finish."' r5 F, X# g# @6 v
End Function' x8 c' i V- B# ?2 s
'绝对路径中去掉文件名,返回路径$ t- B2 o, w1 r7 m0 }
Function trimFileName(fullname As String) As String
5 j- o! {( h+ m5 B4 V% @7 R, C" f Dim slen As Long, i As Long3 A4 T$ j9 U a
slen = Len(fullname)
0 L8 D4 Z+ O2 [& E5 Q For i = slen To 1 Step -1% o9 l8 I8 k8 j4 v& L
If Mid(fullname, i, 1) = "\" Then4 R% C+ F1 x% j* A9 r1 r5 z6 u
Exit For" `9 N6 h; D; P* e3 u8 t& v
End If7 ], T4 Z9 `3 T8 v- ~
Next4 d( D! ? P. i* i7 h- t
trimFileName = Left(fullname, i)
- O0 B% Z5 S' e* p& Q" n+ C End Function
( B: m1 J: e) O9 Y1 f 在程序启动或者按钮动作中调用即可。 |