vb数据库连接

vb数据库连接2008年12月27日 星期六 下午 05:04DAO部分:
一. 首先我们要知道数据库存放在什么地方。
连接数据库,经常要填写数据库的路径,我们可以用一个变量来保存数据库路径。假设数据库与程序存放在同一文件夹下,可以用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 DA

O.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:“数据库已经存在”,根本不会给你压缩,自然也不会像书上说得那么危险。
这是一件有点风险的工作,注意错误捕捉。
例:
https://www.360docs.net/doc/5a14781744.html,pactDatabase "e:\system.mdb", "e:\system1.mdb", , , ";pwd=123"
Kill "e:\system.mdb"
Name "e:\system1.mdb" As "e:\system.mdb"
如果希望压缩数据库的同时更换密码,例如变“123”为“456”,则第一句改为
https://www.360docs.net/doc/5a14781744.html,pactDatabase "e:\system.mdb", "e:\system1.mdb",”;pwd=456” , , ";pwd=123"
如果希望撤掉密码,则第一句改为
https://www.360docs.net/doc/5a14781744.html,pactDatabase "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, adOpenDyna

mic, 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
https://www.360docs.net/doc/5a14781744.html,pactDatabase "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.可以看出,这种方法并非只能用来存放图片文件,实际上任何文件都可以通过这种方法存入数据库,只不过好像没什么必要这么做。实际上,如果图片很大数量又多,存入数据后,浏览速度会变得很慢,不如改为存放文件路径。


相关主题
相关文档
最新文档