关闭

VB6数据库编程的一点入门经验

标签: 数据库vb编程microsoftaccessdao
4069人阅读 评论(0) 收藏 举报

很久很久以前写的一段文字,在软盘里放了N年。--飞利浦的软盘质量不错:)aphismail-job#yahoo.com.cn

偶学VB有两三年的时间了,初学的时候,碰到不少困难,没少在BBS上提问,得到了不少帮助。现在还很多初学者像偶当初那样遇到了各种各样的困难,而且很多是偶当初遇到过的。于是偶动了一个念头,把偶这两年的体会写一点出来,供初学者们参考一下。当然偶没有办法写太多,暂时先把关于数据库连接的一点基本认识写一下。这里写的仅仅是VB数据库编程所必需的一点入门级东东(大部分是我初学时遇到过的问题),想看深入的东西就别在这里浪费时间了,呵呵:)
偶只用Access写过几个单机版程序,谈不上什么经验,而且本人对VB也不是学得很好,很可能出现各种各样的错误,欢迎大家批评指正。

DAO部分
一. 首先我们要知道数据库存放在什么地方。
连接数据库,经常要填写数据库的路径,我们可以用一个变量来保存数据库路径。假设数据库与程序存放在同一文件夹下,可以用App.Path得到它的路径。需要注意的是,当程序放在根目录下时(例如C盘根目录),App.Path返回"C:/",当程序放在某个子文件夹下(例如C:/DB下),则返回"C:/DB",最后少了一个符号“/”。偶一般用以下方法解决。
例1:
Dim DataBasePath As String
DataBasePath = App.Path
If Right(DataBasePath, 1) <> "/" Then
    DataBasePath = DataBasePath & "/"
End If
DataBasePath = DataBasePath & "MyDB.mdb"

例2:
Dim DataBasePath As String
DataBasePath = Replace(App.Path & "/MyDB.mdb", "//", "/")
二. 用Data控件连接带密码的Access97数据库
偶上VB课的时候,老师没讲过这个问题,一般书上也不提,可以说是我碰到的第一个难题。为解决这个问题,花了整整一天时间上网找答案。您别笑,那时候我还不知道有个网站叫CSDN,不知道Google,也很少上BBS,所以找起来特别费劲。
方法很简单,选中Data控件,在属性窗口Connect栏中填写密码即可。假设密码为“123”,则填写;pwd=123(注意不要丢掉前面的分号)。在DataBaseName栏中填写数据库的完整路径,在RecordSource栏选择表。OK!
三. 用Data控件连接带密码的Access2000数据库
首先,安装 Visual Basic 6.0 Service Pack 5(SP5),否则别指望连接Access2000库(显示错误信息“不可识别的数据库格式”)。这个东西有一百多M,微软网站提供下载。安装SP5前,需要把MDAC升级到2.5。MDAC2.5也可以从微软网站下载,而且好像SP5中包含了这个东西(记不清了)。下载后运行mdac_typ.exe就可以升级MDAC了,再运行setupsp5.exe安装SP5。
用Data控件连接Access2000不能在属性窗口填写密码,需要写代码,而且不能在Form_Load事件中写,否则仍然显示错误信息“不可识别的数据库格式”。可以考虑在Form_Activate事件中写这些代码。
例:
Data1.DatabaseName = "E:/system.mdb"
    Data1.Connect = ";pwd=123"
    Data1.RecordSource = "雇员表"
Data1.Refresh
四.抛开Data控件,用代码连接数据库
    DAO编程,不允许在代码中设置绑定控件的DataSouce属性。所以,不使用Data控件,将无法实现对控件的绑定,换来的是更大的灵活性和更强的功能。
首先添加对DAO的引用:菜单“工程”->“引用”,如果连接Access97库,选中Microsoft DAO 3.51 Object Library,若连接Access2000库,选中Microsoft DAO 3.6 Object Library。更简单的办法:在窗口上放置一个Data控件,再把它删掉,VB会自动添加对DAO的引用。
例:
    Dim db As DAO.Database
    Dim tbl As DAO.TableDef
    Dim rs As DAO.Recordset
    Set db = OpenDatabase("e:/system.mdb", False, False, ";pwd=123")
    Set tbl = db.TableDefs("专业")
    Set rs = tbl.OpenRecordset()
    Do While Not rs.EOF
        Debug.Print rs.Fields("专业名称")
        rs.MoveNext
Loop
注:OpenDatabase函数中间两个参数,头一个是独占标志,第二个是只读标志。本例中,数据库以共享、可读写方式打开。
五.压缩数据库
Access数据库,无用记录被删除后,仍然占据着磁盘空间。经过长时间使用后,数据库会变得臃肿不堪,必须进行压缩以提高效率。我们可以打开Access软件,点菜单“工具”->“数据库实用工具”->“压缩和修复数据库”,对数据库进行压缩。也可以在程序中编写代码达到同样的效果。
所有书上,凡是提到这一功能的,无不叮嘱一件事:压缩后的数据库名字,绝对不可以跟原数据库相同!因为如果压缩失败,Jet将删掉压缩后的数据库,二者同名,后果不堪设想。偶实际试验的结果是,如果二者同名,会出现运行时错误3204:“数据库已经存在”,根本不会给你压缩,自然也不会像书上说得那么危险。
这是一件有点风险的工作,注意错误捕捉。
例:
    DBEngine.CompactDatabase "e:/system.mdb", "e:/system1.mdb", , , ";pwd=123"
    Kill "e:/system.mdb"
Name "e:/system1.mdb" As "e:/system.mdb"
如果希望压缩数据库的同时更换密码,例如变“123”为“456”,则第一句改为
DBEngine.CompactDatabase "e:/system.mdb", "e:/system1.mdb",”;pwd=456” , , ";pwd=123"
如果希望撤掉密码,则第一句改为
DBEngine.CompactDatabase "e:/system.mdb", "e:/system1.mdb",”;pwd=” , , ";pwd=123"
六.改变数据库密码
    Dim db As DAO.Database
    Set db = OpenDatabase("e:/system.mdb", True, False, ";pwd=123")
    db.NewPassword "123", "456"
七.得到数据库中所有表的名字
    Dim db As DAO.Database
    Set db = OpenDatabase("e:/system.mdb", False, False, ";pwd=123")
    Dim i As Long
    For i = 0 To db.TableDefs.Count - 1
        Debug.Print db.TableDefs(i).Name
Next
八.SQL语句的执行
偶刚学VB数据库编程的时候,看了两本相关的书。书上长篇累牍地介绍了各种SQL语句的功能、语法,偏偏没介绍怎样在VB中使用这些SQL语句,搞得偶很是郁闷。希望后来的战友不要再经历这段郁闷期。
1.对于用来返回RecordSet的Select语句,可以像下面这样使用
例1:
    Data1.DatabaseName = "E:/system.mdb"
    Data1.Connect = ";pwd=123"
    Data1.RecordSource = "select * from 专业 where 专业名称<>'123'"
    Data1.Refresh
    Do While Not Data1.Recordset.EOF
        Debug.Print Data1.Recordset.Fields("专业名称")
        Data1.Recordset.MoveNext
Loop
注:"select * from 专业 where 专业名称<>'123'"也可以写在Data控件的RecordSouce属性栏中(两边不带双引号)。
例2:
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = OpenDatabase("e:/system.mdb", False, False, ";pwd=123")
    Set rs = db.OpenRecordset("select * from 专业 where 专业名称<>'123'")
    Do While Not rs.EOF
        Debug.Print rs.Fields("专业名称")
        rs.MoveNext
Loop
2.对于不返回记录集的SQL语句,执行方法如下:
例1:
    Data1.DatabaseName = "E:/system.mdb"
    Data1.Connect = ";pwd=123"
    Data1.Refresh
Data1.Database.Execute "Delete * from 专业 where 专业名称='123'"
例2:
    Dim db As DAO.Database
    Set db = OpenDatabase("e:/system.mdb", False, False, ";pwd=123")
db.Execute "update 专业 set 专业名称='123' where 专业名称='外贸英语'"
九.打包
程序写完了,如果不是自己用的话,免不了要打成一个安装包。VB提供了一个打包工具Package & Deployment 向导,很容易上手。生手经常碰到的一个问题是,不知道怎么把数据库文件添加到安装包中。
很简单,运行打包向导至“包含文件”这一步,点“添加”按钮,把你的数据库文件包含进来就行了。在“安装位置”一步,可以设置数据库的安装路径。如果你想把数据库跟程序放在同一个目录下,采纳它的默认值就可以了。如果想放在比程序更低一级的文件夹,比如“数据库”文件夹下,可以设置“安装位置”为“$(AppPath)/数据库”。

ADO部分:
一.用Adodc控件连接数据库

例:   
Adodc1.ConnectionString = "DBQ=E:/system.mdb;Driver={Microsoft Access Driver (*.mdb)};pwd=123;"
    Adodc1.RecordSource = "select * from 专业 where 专业名称<>’123’"
    Adodc1.Refresh
    Set Text1.DataSource = Adodc1
Text1.DataField = "专业名称"
二.不使用Adodc控件,连接数据库
    Adodc控件虽然简单易用,但功能上受很多限制,速度也慢,能不用就不用。使用ADO,可以在代码中动态改变绑定控件的DataSouce属性,所以控件可以绑定到RecordSet对象上,并非一定要绑定到Adodc控件,这一点比DAO方便多了。偶觉得这也进一步削弱了使用Adodc控件的必要性(实际上偶从来没正经用过Adodc控件)。
首先,添加对ADO的引用,菜单“工程”->“引用”->Microsoft ActiveX Data Objects 2.5 Library(未必是2.5,2.1亦可)。也可以通过在窗体上放置一个Adodc控件让VB自动添加这个引用。
例1:本例没有使用带DSN的连接字符串, 作为替换方法,指定了ODBC 的驱动程序。指定DSN,需要通过“Windows 控制面板”对ODBC数据源进行定义,有点麻烦,而且将来打包安装都是个问题。
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    cn.Open "DBQ=E:/system.mdb;Driver={Microsoft Access Driver (*.mdb)};pwd=123;"
    rs.Open "专业", cn, adOpenDynamic, adLockReadOnly, adCmdTable
    Set Text1.DataSource = rs
Text1.DataField = "专业名称"
例2:使用OLE DB接口是首选,比ODBC要快很多。正如MSDN所言,“对于 ADO 或 RDS 的程序员来说,理想的环境是每个数据源都具有一个 OLE DB 接口,以便 ADO 可以直接调用该数据源”。Access当然提供了OLE DB 接口,所以嘛,让ODBC走远点吧:)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=e:/system.mdb;Jet OLEDB:Database Password=123;"
rs.Open " select * from 专业 where 专业名称<>’123’", cn, adOpenKeyset, adLockReadOnly, adCmdText
Do While Not rs.EOF
    Debug.Print rs.Fields("专业名称")
    rs.MoveNext
Loop
三.得到数据库中所有表的名字
    用ADO得到所有表名,不像DAO那样直接,所以很多人不知道怎么做。偶也是有一天闲着无聊,乱七八糟做了半天试验,偶然发现的这个东东。
首先,添加两个引用:Microsoft ActiveX Data Objects 2.5 Library和Microsoft ADO Ext. 2.5 for DDL and Security
例:
    Dim cn As New ADODB.Connection
    Dim x As New ADOX.Catalog
    cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=e:/system.mdb;Jet OLEDB:Database Password=123;"
    x.ActiveConnection = cn
    Dim i As Long
    For i = 0 To x.Tables.Count - 1
        Debug.Print x.Tables(i).Name, x.Tables(i).Type
Next
四.压缩数据库
刚开始用ADO编程的时候,不知道怎么实现数据库的压缩。后来偶然在一本书上看到了一个示例,赶紧记了下来。奇怪的是,从那以后,好像到处都可以见到用ADO压缩数据库的示例:)
首先,添加引用Microsoft Jet and Replication Objects 2.1 Library和Microsoft ActiveX Data Objects 2.1 Library
例:
    Dim jj As New JRO.JetEngine
jj.CompactDatabase "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=e:/system.mdb;Jet OLEDB:Database Password=123;", "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=e:/system1.mdb;Jet OLEDB:Database Password=123;"
    Kill "e:/system.mdb"
Name "e:/system1.mdb" As "e:/system.mdb"
注:这个方法同时实现对数据库的修复,也可以实现对密码的修改。ADO中专门用于修改密码的方法偶还没找到。
五.在数据库中存放图片
在ADO中,想在数据库中存放图片比DAO麻烦不少,它不能把绑定的图片框中的图像自动存入数据库。2.1版以前,ADO程序员一般通过AppendChunk这个方法实现此目的,那可不是一般的麻烦,MSDN给出的示例有50多行。所以很多人干脆在数据库中存放图片的路径,显示时再LoadPicture。
到了2.5版,ADO提供了Stream来解决这个问题,方便极了。
偶是在一本书中看到的这种方法,书上说,虽然Value是Field的缺省属性,在这里却不可以省略。偶试验了一下,即使不写.Value,使用缺省属性,也可以正常工作。不过在本例中偶还是显式指明了Value属性。
首先,添加引用Microsoft ActiveX Data Objects 2.5 Library
例1:把图片文件存入数据库
    Dim cn As New ADODB.Connection
    cn.Open "DBQ=E:/db.mdb;Driver={Microsoft Access Driver (*.mdb)};"
    Dim s As New ADODB.Stream
    Dim rs As New ADODB.Recordset
    rs.Open "图片表", cn, adOpenDynamic, adLockOptimistic, adCmdTable
    s.Type = adTypeBinary
    s.Open
    s.LoadFromFile "e:/Camcord.bmp"
    rs.AddNew
    rs.Fields("image").Value = s.Read()
rs.Update
例2:把数据库中的图像数据导出为文件
Dim cn As New ADODB.Connection
cn.Open "DBQ=E:/db.mdb;Driver={Microsoft Access Driver (*.mdb)};"
Dim s As New ADODB.Stream
Dim rs As New ADODB.Recordset
rs.Open "图片表", cn, adOpenDynamic, adLockOptimistic, adCmdTable
s.Type = adTypeBinary
s.Open
s.Write rs.Fields("image").Value
s.SaveToFile "e:/xxx.bmp"
注:1.图片表的image字段类型为OLE 对象。
2.可以看出,这种方法并非只能用来存放图片文件,实际上任何文件都可以通过这种方法存入数据库,只不过好像没什么必要这么做。实际上,如果图片很大数量又多,存入数据后,浏览速度会变得很慢,不如改为存放文件路径。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9101次
    • 积分:120
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    最新评论
  • 让MSFlexGrid支持滚轮

    u011811113: 按照你的这个做了,但是确实能用滚轮了,但是有个小问题,就是,向上滑动滚轮时只能滑到第二行,不能滑到第...