VB SQL Server数据库.docx
《VB SQL Server数据库.docx》由会员分享,可在线阅读,更多相关《VB SQL Server数据库.docx(26页珍藏版)》请在冰豆网上搜索。
VBSQLServer数据库
用VB备份和恢复SQLServer数据库的方法
2005-12-0108:
34作者:
杨梅娟陈亚军出处:
计算机与信息技术责任编辑:
方舟
摘要备份与恢复是数据库管理员维护数据库安全性和完整性的重要操作。
本文分析并介绍用Access备份SQL数据库的方法,很好地达到了数据备份的目的。
同时,就Access数据库的安全接口作了简略讨论,使备份后不致丧失数据安全性。
并提出了改进备份与恢复策略的一些建议。
关键词SQLServer数据库;VisualBasic6.0;数据备份;数据恢复;Access
引言
对于关键应用的数据库系统应根据具体环境和条件制订一个完善可行确保系统安全的备份计划,没有备份的系统是不可靠、危险的,后果将是严重的,破坏性病毒、误操作、自然灾害等等都可能会对数据库系统造成难以估量的破坏。
尤其对一个信息化程度较高的企业来说,最有价值的财产或许就是企业数据库中的数据。
一个系统中最重要的是大量的实时数据,没有备份功能显然是不安全和不完善的。
经过实践摸索出VisualBasic6.0开发的备份程序,能将数据库备份到Access数据库(Access为目前流行的桌面型数据库产品,具有存储操作灵活、便利等优点,并且因它与SQLServer同属微软数据库产品,二者能很好地兼容)中,并对Access数据库进行加密以防数据被非法访问。
该程序还能用Access备份库的数据恢复SQLServer数据库,从而减少因误操作损坏数据内容而造成的损失。
使用该方法,用户不须添加额外设备,只须在原有服务器上运行该备份程序,其界面简单方便,适合普通用户使用。
备份与恢复概述
备份是数据库管理员定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。
常用的数据备份类型有:
完全备份、差异备份、事务日志备份、文件或文件组备份。
一个通用的备份策略是:
以较长的时间间隔执行完全备份,以适中的时间间隔进行差异备份,并以较短的时间间隔进行事务日志备份。
当数据遭到破坏后就可以利用备份来恢复数据库。
恢复数据库是一个装载数据库的备份,然后应用事务日志重建的过程。
一个通用的恢复策略是:
首先恢复完全备份的数据,然后恢复差异备份数据,最后根据事务日志备份进行恢复。
1、备份方案
开发所需软件:
VisualBasic6.0Access备份程序的设计方法:
(1)用控制面版的ODBC设置,给SQLServer中的数据库添加一个数据源名称。
(2)在Access中新建一个数据库,命名为backup.mdb。
(3)用VB定义两个主要过程:
Attach_Table()和Create_Table()。
Attach_Table的作用是将SQLServer数据库中的所有需要备份的表链接到Access数据库中,在此过程中要排除系统表,因为那是SQLServer自创建的,表中无用户数据。
Create_Table的作用是在backup.mdb中创建目的表,即在这个备份Access库中创建表用来保存所有存在SQL数据库中的用户数据。
另外,在链接过程中,要去掉SQLServer自带的拥有者名称。
2、程序的逻辑结构
①通过第一步创建的ODBC数据源打开要备份的SQL数据库;
②使用Attach_Table()将该数据库中的所有用户表链接到backup.mdb中,排除系统表的方法是:
ForEachtdfinbackup_db.TableDefs
If(tdf.attributesAnddbSystemObject)=0Then
//条件成立,说明该表是用户定义的表,可以链接,否则跳过
Endif
Next
③使用Create_Table()对每个表创建与之对应的备份表,取名可遵循如下原则,若原表叫table_name,则备份表叫b_table_name。
④将table_name表中的所有记录复制到b_table_name中。
⑤从备份库删除对SQL数据表的链接。
3、程序原码
采用微软DAO(DataAccessObject)数据模型,打开Access本地数据库,并连接一个外部ODBC数据表,拷贝该表结构完成,有以下过程块CopyStru:
PrivateSubcopyStru()
SetdbsTemp=wrkjet.OpenDatabase(tagFilName)//链接表的过程
Fori=0TotabN-1
SettdfLinked=dbsTemp.CreateTableDef(“linkTab”)
tdfLinked.Connect=“OdbC;DATABASE=xgsbgsys;UID=
sa;PWD=;DSN=xgsdb;”
tdfLinked.SourceTableName=tabName(i)
dbsTemp.TableDefs.AppendtdfLinked
SettempTab=dbsTemp.CreateTableDef()
tempTab.Name=tabName(i)
//创建新表的过程
ForEachfldIntdfLinked.Fields
SetnewFil=tempTab.CreateField(fld.Name,fld.Type,fld.Size)
newFil.OrdinalPosition=fld.OrdinalPosition
newFil.Required=fld.Required
tempTab.Fields.AppendnewFil
Next
//创建索引
ForEachidxIntdfLinked.Indexes
SetnewIdx=tempTab.CreateIndex()
WithnewIdx
Name=tabName(i)&”x”
Fields=idx.Fields
Unique=idx.Unique
Primary=idx.Primary
EndWith
tempTab.Indexes.AppendnewIdx
Next
dbsTemp.TableDefs.AppendtempTab
SettempTab=Nothing
dbsTemp.TableDefs.Delete”linkTab”
Nexti
dbsTemp.Close
SetdbsTemp=Nothing
wrkjet.Close
Setwrkjet=Nothing
EndSub
EndSub
追加数据,采用微软ADO(ActiveXdataobject)数据模型,分别操纵SQLServer和Access数据对象,追加记录数据来完成,有以下过程块CopyDa2ta:
PrivateSubcopyData()
SetsourceCn=Newadodb.Connection
sourceCn.CursorLocation=adUseServer
strSql=“PROVIDER=MSDASQL;dsn=xgsdb;uid=sa;
pwd=;”
sourceCn.OpenstrSql
SettargetCn=Newadodb.Connection
targetCn.CursorLocation=adUseClient
targetCn.Open”PROVIDER=Microsoft.Jet.OLEdb.3.51;
DataSource=”&tagFilName&“;”
EndIf//追加新表
Fori=0TotabN-1
SettargetRst=Newadodb.Recordset
strSql=”select3from”&tabName(i)
targetRst.OpenstrSql,targetCn,adOpenStatic,adLockPes2simistic,adCmdText
SetsourceSet=Newadodb.Recordset
strSql=”select3from”&tabName(i)&strSQLApp
sourceSet.OpenstrSql,sourceCn
zdN=sourceSet.Fields.Count
IfsourceSet.EOFThenGoTohh
sourceSet.MoveFirst
DoWhileNotsourceSet.EOF
targetRst.AddNew
Forj=0TozdN-1
IfTrim(sourceSet.Fields(j).Value)=””Then
targetRst.Fields(j).Value=Null
Else
targetRst.Fields(j).Value=Trim(sourceSet.Fields(j).Value)
EndIf//复制记录
Next
targetRst.Update
sourceSet.MoveNext
Loop
recN=targetRst.RecordCount
hh:
sourceSet.Close
SetsourceSet=Nothing
targetRst.Close
SettargetRst=Nothing
Next
targetCn.Close
SettargetCn=Nothing
sourceCn.Close
SetsourceCn=Nothing
EndSub//删除链接
其中字符数组tabName(i)中存放需备份的各数据表名,strSQLAPP字符串中存放对数据表的限制条件where子句内容。
4、数据恢复
如果要从Access中将数据恢复到SQLServer中,方法类似,仅仅是拷贝记录的方向和以上相反,即从Access表往链接过来的SQL表中拷贝。
安全方案
因为Access属小型数据库,所以要保证其不被非法访问。
可以在VB程序中实现对备份数据库的安全性接口,有以下两种方法限制对Access的任意访问:
(1)给Access数据库加口令,在VB程序中用口令打开数据库。
打开Access软件,选中“工具”菜单,选择“安全”项,选择“加密/解密数据库”,然后选择备份数据库的名字,就可以给这个数据库加上密码。
这样的话,任何人如果想打开备份数据库,手动修改数据表内容,必须先输入正确的访问密码,否则不能继续操作。
用VB程序打开数据库时,必须提供访问密码,否则无法访问数据库。
(2)给Access数据库定义不同的用户组和用户权限,从而使不同级别的用户可以分别读或写某表或视图。
打开Access软件,选中“工具”菜单,选择“安全”项,选择“用户/组权限”,在此可定义不同的组和用户,并按组划分用户的权限级别,从而限制低或无权限的用户执行某些操作。
用VB程序打开数据库进行操作时,对不同的操作采用不同的用户名和用户密码,从而区分有不同使用权限的人的访问操作。
备份方案的几点建议
1、在业余时间执行完全备份
如果你的公司没有工作在24时的环境之下,那么业余时间是执行备份的最佳时间。
这既可以提高备份的性能,又可以减少备份对用户的影响。
2、安排一个完全备份在几天内完成
如果数据库非常大,并且你不能在期限内完成一个完全备份,那么就把该备份进行分解。
你可以在一部分数据库中执行文件或文件组备份。
照这样,经过几天,就可以备份所有的数据。
3、使用差异备份
如果你没有时间每天晚上执行一个完全备份,那么就可以在一周之中执行差异备份,而在周末执行一个完全备份。
4、建立一张合理的备份时间表
一个提高正被备份的系统性能的最好办法是不要做不必要的备份。
必须根据要求确定最有效的备份时间表。
不要做超过你所需要的备份,但是也不要因为性能而牺牲数据的安全。
根据你的要求,建立对自己最有利的备份计划。
结束语
该备份方案使用VB设计出友好方便的用户界面,用户只需点击按钮便可执行备份或恢复操作;而且用Access作备份数据库,备份同样的数据,其所占用的硬盘空间远远小于SQL数据库所占空间,大大地提高了效率和节约了用户资源。
通过实践检验,其运行效率比双机备份要高得多。
提高VisualBasic访问数据库的效率
2005-04-1209:
51作者:
Mice出处:
中国VB网责任编辑:
方舟
1.尽量使用事务处理更新数据库
VB的事务处理包括以BeginTrans开始,以CommitTrans或Rollback结尾的多条数据库操作指令。
事务处理除了能很好的保证数据库的完整性以外,同时能大大提高数据库批量更新的效率。
这是因为如果数据库更新操作没有使用事务处理,则每次Update操作都会引起数据库写盘一次。
使用事务处理后,更新只在内存缓冲区内进行,执行CommitTrans时才将所有修改一次写回到磁盘中。
使用事务处理要注意一下几点:
(1)事务处理要有很完善的错误检查机制;
(2)因为VB在事务处理结束前对数据库使用了页面锁.所以在多用户环境中,如果事务被挂起,则其他用户将无法访问上锁的数据。
2.尽量使用代码分解Select检索操作
使用Select进行数据库操作固然简单易用,但如果将一些检索操作分解为等价的手工检索代码,则对数据库的检索速度将大大加快.分解的基本方法是对检索关键字段进行索引,利用Seek方法定位后,根据索引的数据库已经排序的特点,进行遍历查找.对于遍历范围不是很宽时,这种方法能几十倍的提高数据库的访问速度.例如:
Select*frompersonwherevol='123'andbirth=#11-02-73#分解成下面的操作后,访问速度可大大提高:
Table.Index="vol"Table.Seek"=","123"ifnottable.nomatchthen
whilenottable.eof
iftable("vol")="123"then
table.movelast
elseiftable("Birth")=#11-02-73#then
'找到记录
endif
table.movenext
wendendif
3.使用attach绑定数据库表
当使用ODBC连接MSSQLServer,Oracle和Sysbase之类的数据库服务器时,我们可以通过MSAcess的attach功能将服务器上的表绑定到MSAcess数据库中,因为MSAcess数据库能缓存数据库服务器上表的结构,当我们访问ODBC数据源时能提高系统的访问性能。
4.使用dbSQLPassThrough选项
连接MSSQLServer,Oracle和Sysbase数据库服务器时,使用dbSQLPassThrough选项可将命令直接发送给数据库服务器,从而减少中间件对命令的检查和解释,提高了数据库的访问性能。
下例使用存储过程建立Dynaset:
dimmydbasdatabasedimmydsasdynasetsetmydb=opendatabase(..........)'打开数据库setmyds=mydb.openrecordset("name",dbOpendynaset,dbSQLPassThrough,...)
使用dbSQLPassThrough的缺点是返回的记录集是只读的。
5.正确使用数据库访问对象Table.
支持SEEK命令和索引.两者配合能最快的找到纪录.笔者曾经做过速度比较试验,都是检索10万个记录Table用时3.5秒Dynaset用时9秒Snapshot用时10秒.支持读写操作.不支持SORT和FILTER,必须使用Index代替.对应于数据库中的物理表,增,删,改会直接影响数据库表。
Dynaset.最灵活的数据库对象.支持读写操作,是记录的动态子集.在ODBC中,写操作需要设定唯一性索引.支持SORT和FILTER.使用JOIN命令关联多个表时,只能使用Dynaset。
Snapshot.只能读不能写,不能加锁.不支持事务处理.不支持Edit,Addnew和Update方法
VB访问SQLServer数据库技术全揭密
2006-08-0305:
00作者:
蒋涛出处:
电子技术责任编辑:
方舟
摘要:
本文讨论了VisualBasic应用程序访问SQLServer数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法性能和优缺点。
一、引言
SQLServer是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。
随着SQLServer网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。
创建维护数据库的工作可用SQLServer提供的SQLEnterpriseManager工具来进行,如能提供一种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。
VisualBasic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。
而且Microsoft为其提供了与SQLServer通信的API函数集及工具集,因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端,与后端的MicrosoftSQLServer相结合,VB能够提供一个高性能的客户机—服务器方案。
二、VB访问SQLServer数据的常用方法
使用VisualBasic作为前端开发语言,与SQLServer接口有几种常用的方法,即:
①数据访问对象/Jet
②为ODBCAPI编程
③使用SQLServer的VisualBasic库(VBSQL)为DB库的API编程
④RDO远程数据对象(RemoteDataObjects)
⑤ADO数据对象(ActiveDataObjects)
1、数据访问对象/Jet
VB支持DataAccessObjects(DAOs)的子集。
DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它的确有许多优点。
DAO/Jet是为了实现从VB访问Access数据库而开发的程序接口对象。
使用DAOs访问SQLServer的过程如下:
应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通过调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQLServer提交SQL语句且返回结果。
下面是一个用DAOs访问SQLServer的VB实例。
注释:
FormDeclarations
DimmydbAsDatabase
DimmydynasetAsDynasetオ
PrivateSubForm_Load()
Setmydb=OpenDatabase("",False,False,"ODBC;DSN=Myserver;WSID=LCL;DATABASE=sales")
Setmydynaset=mydbCreateDynaset("Select*fromCustomers")オ
EndSub
上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。
OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了MicrosoftAccess连接到SQLServer所需要知道的一些内容。
其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。
2、利用ODBCAPI编程
ODBC(OpenDatabaseConnectivity)的思想是访问异种数据库的一种可移植的方式。
与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。
应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVR.DLL)把它们送到服务器中。
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。
GlobalgiHEnvAsLong
GlobalgiHDBAsLong
GlobalgiHStmtAsLong
DimmyResultAsinteger
DimmyConnectionAsSrting
DimmyBuffAsString*256
DimmyBufflenAsInteger
IfSQLAllocEnv(giHEnv)<>SQL_SUCCESSThen
MsgBox"Allocationcouldn注释:
thappen!
"
EndIf
IfSQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESSThen
MsgBox"SQLServercouldn注释:
tconnect!
"
EndIf
myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=SQLAllocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL="Select*fromCustomersWhereCity="Hunan""
myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsS