3、程序原码
采用微软DAO (Data Access Object) 数据模型, 打开Access 本地数据库, 并连接一个外部ODBC数据表, 拷贝该表结构完成, 有以下过程块CopyStru :
Private Sub copyStru ()
Set dbsTemp = wrkjet. OpenDatabase (tagFilName)// 链接表的过程
For i = 0 To tabN - 1
Set tdfLinked = dbsTemp. CreateTableDef (“linkTab”)
tdfLinked. Connect = “OdbC; DATABASE = xgsbgsys ; UID =
sa ; PWD = ; DSN = xgsdb ;”
tdfLinked. SourceTableName = tabName (i)
dbsTemp. TableDefs. Append tdfLinked
Set temp Tab = dbsTemp. CreateTableDef ()
temp Tab. Name = tabName (i)
//创建新表的过程
For Each fld In tdfLinked. Fields
Set newFil = temp Tab. CreateField (fld. Name , fld. Type ,fld. Size)
newFil. OrdinalPosition = fld. OrdinalPosition
newFil. Required = fld. Required
temp Tab. Fields. Append newFil
Next
//创建索引
For Each idx In tdfLinked. Indexes
Set newIdx = temp Tab. CreateIndex ()
With newIdx
Name = tabName (i) & ” x”
Fields = idx. Fields
Unique = idx. Unique
Primary = idx. Primary
End With
temp Tab. Indexes. Append newIdx
Next
dbsTemp. TableDefs. Append temp Tab
Set temp Tab = Nothing
dbsTemp. TableDefs. Delete ”linkTab”
Next i
dbsTemp. Close
Set dbsTemp = Nothing
wrkjet. Close
Set wrkjet = Nothing
End Sub
End Sub
追加数据, 采用微软ADO (ActiveX data object) 数据模型, 分别操纵SQL Server 和Access 数据对象, 追加记录数据来完成, 有以下过程块CopyDa2ta :
Set dbsTemp = wrkjet. OpenDatabase (tagFilName)// 链接表的过程
For i = 0 To tabN - 1
Set tdfLinked = dbsTemp. CreateTableDef (“linkTab”)
tdfLinked. Connect = “OdbC; DATABASE = xgsbgsys ; UID =
sa ; PWD = ; DSN = xgsdb ;”
tdfLinked. SourceTableName = tabName (i)
dbsTemp. TableDefs. Append tdfLinked
Set temp Tab = dbsTemp. CreateTableDef ()
temp Tab. Name = tabName (i)
//创建新表的过程
For Each fld In tdfLinked. Fields
Set newFil = temp Tab. CreateField (fld. Name , fld. Type ,fld. Size)
newFil. OrdinalPosition = fld. OrdinalPosition
newFil. Required = fld. Required
temp Tab. Fields. Append newFil
Next
//创建索引
For Each idx In tdfLinked. Indexes
Set newIdx = temp Tab. CreateIndex ()
With newIdx
Name = tabName (i) & ” x”
Fields = idx. Fields
Unique = idx. Unique
Primary = idx. Primary
End With
temp Tab. Indexes. Append newIdx
Next
dbsTemp. TableDefs. Append temp Tab
Set temp Tab = Nothing
dbsTemp. TableDefs. Delete ”linkTab”
Next i
dbsTemp. Close
Set dbsTemp = Nothing
wrkjet. Close
Set wrkjet = Nothing
End Sub
End Sub
Private Sub copyData ()
Set sourceCn = New adodb. Connection
sourceCn. CursorLocation = adUseServer
strSql =“PROVIDER = MSDASQL ; dsn = xgsdb ; uid = sa ;
pwd = ;”
sourceCn. Open strSql
Set targetCn = New adodb. Connection
targetCn. CursorLocation = adUseClient
targetCn. Open ” PROVIDER = Microsoft. Jet. OL Edb. 3.51 ;
Data Source = ”& tagFilName &“;”
End If //追加新表
For i = 0 To tabN - 1
Set targetRst = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i)
targetRst. Open strSql , targetCn , adOpenStatic , adLockPes2simistic , adCmdText
Set sourceSet = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i) & strSQLApp
sourceSet. Open strSql , sourceCn
zdN = sourceSet. Fields. Count
If sourceSet. EOF Then Go To hh
sourceSet. MoveFirst
Do While Not sourceSet. EOF
targetRst. AddNew
For j = 0 To zdN - 1
If Trim (sourceSet. Fields (j) . Value) = ””Then
targetRst. Fields (j) . Value = Null
Else
targetRst. Fields (j) . Value = Trim (sourceSet. Fields(j) . Value)
End If //复制记录
Next
targetRst. Update
sourceSet. MoveNext
Loop
recN = targetRst. RecordCount
hh :sourceSet. Close
Set sourceSet = Nothing
targetRst. Close
Set targetRst = Nothing
Next
targetCn. Close
Set targetCn = Nothing
sourceCn. Close
Set sourceCn = Nothing
End Sub //删除链接
其中字符数组tabName (i) 中存放需备份的各数据表名, strSQLAPP 字符串中存放对数据表的限制条件where 子句内容。 Set sourceCn = New adodb. Connection
sourceCn. CursorLocation = adUseServer
strSql =“PROVIDER = MSDASQL ; dsn = xgsdb ; uid = sa ;
pwd = ;”
sourceCn. Open strSql
Set targetCn = New adodb. Connection
targetCn. CursorLocation = adUseClient
targetCn. Open ” PROVIDER = Microsoft. Jet. OL Edb. 3.51 ;
Data Source = ”& tagFilName &“;”
End If //追加新表
For i = 0 To tabN - 1
Set targetRst = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i)
targetRst. Open strSql , targetCn , adOpenStatic , adLockPes2simistic , adCmdText
Set sourceSet = New adodb. Recordset
strSql = ”select 3 from ”& tabName (i) & strSQLApp
sourceSet. Open strSql , sourceCn
zdN = sourceSet. Fields. Count
If sourceSet. EOF Then Go To hh
sourceSet. MoveFirst
Do While Not sourceSet. EOF
targetRst. AddNew
For j = 0 To zdN - 1
If Trim (sourceSet. Fields (j) . Value) = ””Then
targetRst. Fields (j) . Value = Null
Else
targetRst. Fields (j) . Value = Trim (sourceSet. Fields(j) . Value)
End If //复制记录
Next
targetRst. Update
sourceSet. MoveNext
Loop
recN = targetRst. RecordCount
hh :sourceSet. Close
Set sourceSet = Nothing
targetRst. Close
Set targetRst = Nothing
Next
targetCn. Close
Set targetCn = Nothing
sourceCn. Close
Set sourceCn = Nothing
End Sub //删除链接
4、数据恢复
如果要从Access中将数据恢复到SQL Server中,方法类似,仅仅是拷贝记录的方向和以上相反,即从Access表往链接过来的SQL表中拷贝。
安全方案
因为Access属小型数据库,所以要保证其不被非法访问。可以在VB程序中实现对备份数据库的安全性接口,有以下两种方法限制对Access的任意访问:
(1)给Access数据库加口令,在VB程序中用口令打开数据库。打开Access软件,选中“工具”菜单,选择“安全”项,选择“加密/解密数据库”,然后选择备份数据库的名字,就可以给这个数据库加上密码。这样的话,任何人如果想打开备份数据库,手动修改数据表内容,必须先输入正确的访问密码,否则不能继续操作。用VB程序打开数据库时,必须提供访问密码,否则无法访问数据库。
(2)给Access数据库定义不同的用户组和用户权限,从而使不同级别的用户可以分别读或写某表或视图。打开Access软件,选中“工具”菜单,选择“安全”项,选择“用户/组权限”,在此可定义不同的组和用户,并按组划分用户的权限级别,从而限制低或无权限的用户执行某些操作。用VB 程序打开数据库进行操作时,对不同的操作采用不同的用户名和用户密码,从而区分有不同使用权限的人的访问操作。
备份方案的几点建议
1、在业余时间执行完全备份
如果你的公司没有工作在24时的环境之下,那么业余时间是执行备份的最佳时间。这既可以提高备份的性能,又可以减少备份对用户的影响。
2、安排一个完全备份在几天内完成
如果数据库非常大,并且你不能在期限内完成一个完全备份,那么就把该备份进行分解。你可以在一部分数据库中执行文件或文件组备份。照这样,经过几天,就可以备份所有的数据。
3、使用差异备份
如果你没有时间每天晚上执行一个完全备份,那么就可以在一周之中执行差异备份,而在周末执行一个完全备份。
4、建立一张合理的备份时间表
一个提高正被备份的系统性能的最好办法是不要做不必要的备份。必须根据要求确定最有效的备份时间表。不要做超过你所需要的备份,但是也不要因为性能而牺牲数据的安全。根据你的要求,建立对自己最有利的备份计划。
结束语
该备份方案使用VB设计出友好方便的用户界面,用户只需点击按钮便可执行备份或恢复操作;而且用Access作备份数据库,备份同样的数据,其所占用的硬盘空间远远小于SQL数据库所占空间,大大地提高了效率和节约了用户资源。通过实践检验,其运行效率比双机备份要高得多。
[1] [2]
