谁可相欹 发表于 2015-1-16 22:20:11

MYSQL编程:在VB中兼容非ACCESS数据库的技能

任何规模的组织都可能受益于外包服务,并在一个标准化和优化的平台上统一其数据库管理任务。基于其本身的特性,DBaaS提供了敏捷和高效的数据库服务,它可以支持多变的需求。本文从VB数据库系统布局的角度动身,分离一个详细实例,论述了在VB中兼容非ACCESS格局数据库的详细办法和技能。
关头词:VB、非ACCESS数据库、数据存取工具
一个完全的数据库办理体系(DBMS)应是能兼容市情上各类较盛行数据格局的体系,它充实思索了分歧用户的实践请求。鉴于今朝市情上有多种数据库格局(如Foxpro、DBase、Paradox等)盛行,因此在VB数据库使用程序中兼容非ACCESS数据库就显得尤其主要了。
作为一种盛行的开辟平台,VB供应了壮大的数据库功效。次要有以下三种:数据控件法:利用数据存取工具(DataAccessObject)法;间接挪用ODBC2.0API接口函数法。个中挪用数据存取工具的办法绝对别的两种办法具无方便天真、功效壮大的凸起长处。本文即从挪用数据库存取工具的办法动身,完成了非ACCESS格局数据库(以FoxPro数据库为例)的建新库、拷贝数据库布局、静态调进等操纵,论述了从编程技能上填补VB对这些外来数据库撑持不敷的可行性。
1、VB数据库的系统布局
VB数据库的中心布局是所谓的MicroSoftJET数据库引擎,它为VB与数据库的接口供应了基础的办法和手腕。JET引擎被VisualBasic、MicrosoftACCESS和别的Microsoft产物所共享。因此在VB中Access数据库格局是一种尺度的内置格局,一切的非ACCESS数据库都被称为外来数据库。
JET引擎的感化就像是一块“面板”,在其上能够拔出多种索引按次存取办法(即ISAM)数据驱动程序。这就是VB对非ACCESS数据库具有丰厚撑持的真正缘故原由。VB专业版中供应了FoxPro、dBASE(或Xbase)、Paradox、Btrieve等数据库的ISAM驱动程序,这就使得VB能撑持这些数据库格局。别的,其他的很多兼容ISAM的驱动程序也能够经由过程从厂商的售后服务失掉。因此从实际上说,VB能撑持一切兼容ISAM的数据库格局(条件是只需取得这些数据库的ISAM驱动接口程序)。
2、利用非ACCESS数据库时的参数设置及设置文件的参数读取
值得注重的是,年夜多半的程序员都不注意数据库设置文件的利用,却不知这是极其主要的。
假如在VB的程序中利用了数据库的操纵,将使用程序天生EXE文件或打包天生安装程序后,则必需供应一个数据库设置(.INI)文件,在INI文件中能够对分歧范例的数据库举行设置。假如找不到这个INI文件,将会招致不克不及会见数据库。一般情形下,INI文件的文件名和使用程序的称号不异,以是假如没有指明,VB的程序会在Windows子目次中往找和使用程序同名的INI文件。可使用VB中的SetDataACCESSOptions语句来设置INI文件。
SetDataACCESSOptions语句的用法以下:
SetDataACCESSOptions1,IniFileName
个中IniFileName参数指明的是INI文件的领路径的文件名。
值得注重的是,当使用程序找不到这个INI文件时,或在挪用OpenDataBase函数时对其Connect参数值没有设定为VB划定的尺度值,如对FoxPro2.5格局设定为了“FoxPro;”(应为“FoxPro2.5;”),大概没有安装响应的ISAM驱动程序,则此时VB会显现一条毛病信息“NotFoundInstallableISAM”。
一般,INI文件在使用程序分收回往之前已天生,大概在安装时静态天生,也能够在使用程序中本人天生。一般这类INI文件中有“”、“”、“”、“”、“”、“”等设置段,关于一个完全的使用程序则还应有一个属于使用程序本人的设置段如“”。可在个中设置DataType、Server、DataBase、OpenOnStartup、DisplaySQL、QueryTimeOut等较为主要的数据库参数,并以此限制使用程序一样平常的运转情况。
WindowsAPI接口函数在Win95体系供应的静态链接库中供应了一个OSWritePrivateProfileString函数,此函数能按Windows下设置文件(.INI)的誊写格局写进信息。
在一般情形下,使用程序还必要在运转时读取设置文件内相干项的参数。好比PageTimeOut(页加锁超不时限)、MaxBufferSize(缓冲区巨细)、LockRetry(加锁失利时重试次数)等参数,经由过程对这些参数的读取对使用程序运转情况的设定、潜伏毛病的捕捉等均会有很年夜的改良。
设此使用程序的数据库设置文件为MyDB.INI,则详细历程以下:
以下为援用的内容:
FuntionGetINIString$(ByvalFname$,ByvalszItem$,ByvalszDeFault$)
’此自界说子函数完成INI文件内设置段内参数的读取
DimTmpAsString,xAsInteger
Tmp=String(2048,32)
x=OSGetPrivateProfileString(Fname$,szItem$,szDefault$,Tmp,Len(Tmp),“MyDB.INI”)
GetINIString=Mid$(Tmp,1,x)
EndFunction
经由过程此函数就可以完成对各类数据库格局的读取。
3、挪用数据存取工具对非ACCESS数据库编程的办法及实在例
VB专业版中利用数据库存取工具变量(DAO)的办法最具有功效壮大、编程天真的特性。它可以在程序中存取ODBC2.0的办理函数;能够把持多种纪录集范例:Dynaset,Snapshot及Table纪录汇合工具;能够存储历程和查询举措;能够存取数据库汇合工具,比方TableDefs,Fields,Indexes及QueryDefs;具有真实的事物处置才能。这类办法对数据库处置的年夜多半情形都十分合用。
从VB的程序代码的角度来看,供应给VB程序员的纪录集工具(RecordSet)同所利用的数据库格局及范例是互相自力的。即对FoxPro等数据库仍旧可使用浩瀚的数据库存取工具变量,这就为非ACCESS数据库的会见供应了最主要的条件和办法。
在VB中从一种数据库范例转化为另外一种数据库范例几近不必要或只必要很少的代码修正。并且,只管dBASE、Paradox自己的DDL(DataDefinitionLanguage,即数据界说言语)和DML(DataManipulationLanguage,即数据利用言语)长短布局化查询的,但它们仍旧可使用VB的SQL语句和JET引擎来利用。
因此对FoxPro等非ACCESS数据库而言,挪用数据库存取工具的办法一样也是一种最好的选择。
(一)非ACCESS数据库的新建及库布局的修正
VB专业版中的数据库存取工具变量能够分为两类,一类用于数据库布局的保护和办理,另外一类用于数据的存取。个中暗示数据库布局时可使用上面的工具:DataBase、TableDef、Field、Index,和三个汇合(Collection):TableDefs、Fields和Indexes。每个汇合都是由多少个工具构成的,这些数据工具的汇合能够完整看做是一个数组,并按数组的办法来挪用。
一旦数据库工具创建后,就能够用它对数据库的布局举行修正和数据处置。
关于非ACCESS数据库,年夜部分都是对应于一个目次,以是可使用VB的MkDir语句师长教师成一个目次,亦即新建一个数据库。而每个非ACCESS数据库文件可看做是此目次下的一个数据表(Table),但实践上它们是相互自力的。
上面是新建一个FoxPro2.5格局数据库的程序实例。
以下为援用的内容:
SubCreateNew()
DimDb1Asdatabase,TdAsTableDefs
DimT1AsNewTabledef,F1AsNewField,F2AsNewField,F3AsNewField
DimIx1AsNewIndex
DimPathAsString
ConstDB_TEXT=10,DB_INTEGER=3
ChDir""
Path$=InputBox("请输出新路径名:","输出对话框")
MkDirPath$’新建一个子目次
SetDb1=OpenDatabase(Path$,True,False,"FoxPro2.5;")
SetTd=Db1.TableDefs
T1.Name="MyDB"’新建一个数据表,数据表名为MyDB
F1.Name="Name",F1.Type=DB_TEXT,F1.Size=20
F2.Name="Class",F2.Type=DB_TEXT,F2.Size=20
F3.Name="Grade",F3.Type=DB_INTEGER
T1.Fields.AppendF1’向数据表中增加这些字段
T1.Fields.AppendF2
T1.Fields.AppendF3
Ix1.Name="Name",Ix1.Fields="Name",Ix1.Primary=True’新建索引
T1.Indexes.AppendIx1’向数据库的Indexes汇合中增加新的索引
Td.AppendT1’向TableDefs汇合中增加新表
Db1.Close’必需先封闭数据库工具再加入
EndSub

在此段程序中值得注重的是,对非Access数据库的新建不必CreateDatabase函数,而是用OpenDatabase函数,这点与Access数据库年夜纷歧样,但也仅仅是针对非ACCESS数据库而言才干用OpenDatabase函数来新建一个数据库工具。
在VB中,外来数据库的分歧格局只在OpenDatabase函数的最初一个参数Connect中有所表现,分歧格局的外来数据库其Connect参数值也分歧,除此之外,在VB专业版中其编程的办法和步骤及技能是基础不异的。
新建子目次后,不克不及用ChDir语句进进它,不然会呈现“‘MyDB’isnotavalidpath”的毛病。同时,对F1、F2、F3等新建字段工具的界说也必需分离界说,不然会呈现“Elementnotdefined”(变量不决义)的毛病。
经由过程必定的编程技能还能够完成非ACCESS数据库的库布局的拷贝,上面是一段响应的程序。
FunctionGetPos(TFname$)’此自界说函数完成对领路径文件名中最初一个“”标记的定位
以下为援用的内容:
DimIAsInteger,TmpAsString
Tmp$=TFname$
ForI=0To255
Pos%=Pos%+InStr(1,Tmp$,"")
E1%=InStr(1,Tmp$,"")
Tmp$=Right$(Tmp$,Len(TFname$)-Pos%)
IfE1%=0Then’找到最初一个“”标记的地位,并记上去
GetPos=Pos%
ExitFor
EndIf
NextI
EndFuntion
SubCopyStruc()
DimDb1Asdatabase,Ds1AsDynaset,TdAsTableDefs,FldAsFields
DimFname,SourceF,DestF,PathAsString,Pos1AsInteger
CMD1.Filter="FoxPro数据库文件(*.DBF)|*.DBF|一切文件|*.*"’CMD1为一个对话框的把持名
CMD1.DialogTitle="调进MsFoxPro数据库文件"
CMD1.FilterIndex=1
CMD1.Action=1
DestF$=InputBox$("请输出方针文件名:","输出对话框")
IfCMD1.FileName=“”OrDestF$=""Then
MsgBox"源文件或方针文件名为空"
ExitSub
Else
SourceF$=CMD1.Filename
EndIf
FileCopySourceF$,DestF$
Pos1%=GetPos(SourceF$)
Path$=Left$(SourceF$,Pos1%)’取得源文件地点的路径名
Fn$=Left$(DestF$,InStr(1,DestF$,".")-1)’取得新文件的数据库名
’Fn$为实践的Foxpro数据库名,也即CreateDynaset函数内的source属性值
SetDb1=OpenDatabase(Path$,True,False,"FoxPro2.5;")
SetDs1=Db1.CreateDynaset(Fn$)
IfDs1.EOFAndDs1.BOFThen’数据库内的无纪录则加入
TotalNum%=0
MsgBox"此数据表为空表!"
ExitSub
EndIf
’删除纪录,保存库布局
Ds1.MoveFirst
Do
Ds1.Delete
Ds1.MoveNext
LoopUntilDs1.EOF
EndSub

可见,拷贝库布局的办法在于把一个已存在的数据库拷贝到一个新文件中,然后再删除新文件内的一切纪录,保存其库布局,失掉的就是一个新建的库布局完全的空库。
(二)非ACCESS数据库的静态调进
在实践使用的良多情形下,常常必要在对一些事前其实不晓得其详细库布局的数据库举行调进、显现及打印其纪录。因此完成未知格局数据库的静态调进也是评价VB数据库使用程序兼容性的一个主要标记。
在VB中,网格控件十分合适用于扫瞄数据库中的数据,只需把数据放进网格便可。
在利用网格时静态调进的关头在于纪录(Colume)内容和字段(Row)内容(包含字段的称号、范例、值等)的读取,因此天生一个能够对应于一个或多个数据表中的全体或部分纪录的Dynaset工具长短常需要的。Dynaset工具还能够是一个静态查询的了局,能举行纪录的增添、删除和修正等操纵。
上面是一段用网格显现FoxPro数据库的程序。
以下为援用的内容:
SubDBLoad()
DimDb1Asdatabase,Ds1AsDynaset,TdAsTableDefs,FldAsFields
DimFname,Tmp,PathToTalNumAsString,I,J,Pos1AsInteger
DimMyNum’界说一个变体型数据
CMD1.Filter="FoxPro数据库文件(*.DBF)|*.DBF|一切文件|*.*"
CMD1.DialogTitle="调进MsFoxPro数据库文件"
CMD1.FilterIndex=1
CMD1.Action=1
Fname$=CMD1.Filename
Pos1%=GetPos(Fname$)
Path$=Left$(Fname$,Pos1%)
Tmp$=Right$(Fname$,Len(Fname$)-Pos1)
Fn$=Left$(Tmp$,Instr(1,Tmp$,“.”)-1)
SetDb1=OpenDatabase(Path$,True,False,"FoxPro2.5;")
SetDs1=Db1.CreateDynaset(Fn$)
IfDs1.EOFAndDs1.BOFThen数据库表内无纪录则加入
TotalNum=0
MsgBox"此数据表为空表!"
ExitSub
Else显现数据库表内的实践纪录数
Ds1.MoveLast
TotalNum=Ds1.RecordCount
Grid1.Rows=TotalNum+1’置网格的实践行数
Total.Caption=Str$(TotalNum)
EndIf
置网格的实践列数并置每列的宽度
SetTd=Db1.TableDefs
SetFld=Td(Fn$).Fields
Grid1.Cols=Fld.Count+1
Grid1.ColWidth(0)=600
ForI=1ToFld.Count
Grid1.ColWidth(I)=1500
NextI
在网格的第一行内填进字段名
Grid1.Row=0,Grid1.Col=0
Grid1.Text="序号"
ForI=1ToFld.Count
Grid1.Col=I
Grid1.Text=Fld(I-1).Name
NextI
在网格中填进响应的数据
Ds1.MoveFirst
I=1
DoWhileNotDs1.EOF
Grid1.RowHeight(I)=300
Grid1.Row=I
Grid1.Col=0
Grid1.Text=I
ForJ=1ToFld.Count
Grid1.Col=J
MyNum=Ds1.Fields(J-1).Value
对纪录的数据范例举行判别后做响应的处置
IfIsNumeric(MyNum)OrIsDate(MyNum)Then
Grid1.Text=Str$(Ds1.Fields(J-1).Value)
ElseIfVarType(MyNum)=8Then
Grid1.Text=Ds1.Fields(J-1).Value
ElseIfVarType(MyNum)=0OrVarType(MyNum)=1Then
Grid1.Text=""
EndIf
OnErrorResumeNext
NextJ
Ds1.MoveNext
I=I+1
Loop
Ds1.Close
Db1.Close
ExitSub

最初应记着,在VB的数据库使用程序运转之前,必定要在AUTOEXEC.BAT文件中到场一句SHARE.EXE/L:500。
以上一切程序均在Pentium/166机、中文Windows95下用VB4调试经由过程。
4、停止语
对非Access数据库的兼容是VB数据库编程中不成支解的主要部分。因此纯熟把握利用DAO办法对非ACCESS数据库的编程是极其主要的。而且,必定编程技能的使用也有助于填补VB对外来数据库撑持的不敷。

MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。

若天明 发表于 2015-1-19 08:59:06

备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。

乐观 发表于 2015-1-28 05:57:27

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

admin 发表于 2015-2-5 18:17:31

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?

谁可相欹 发表于 2015-2-13 05:48:13

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

只想知道 发表于 2015-3-3 16:20:11

个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。

爱飞 发表于 2015-3-11 12:19:54

我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!

若相依 发表于 2015-3-18 14:22:54

SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。

愤怒的大鸟 发表于 2015-3-26 02:28:22

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
页: [1]
查看完整版本: MYSQL编程:在VB中兼容非ACCESS数据库的技能