VB读写dbf格式数据库

    dbf曾经是最流行的数据库之一,上世纪末foxbase被微软收购,并入VS6.0,就是大名鼎鼎的FoxPro,然而,微软的亲儿子,小数据库有Access,大数据库有SQL Sever,所以就越来越不待见dbf了,直至2010年1月正式宣布停止支持,FoxPro最后一个版本是9.0。

    然而,dbf还是有很多忠诚粉丝的,dbf的一些特有特征也延长了它的生命力。一般的数据库是一个大的数据库文件,其中包含N个数据表。而如果想对各表自由拷贝,就做不到了。而dbf是单独一个文件,一张数据表就是一个文件。据我所知,也只有后来的SQLite数据库才也有此特性。

    一些老的系统,很顽固地使用着dbf,也难怪,人家系统稳定运行了十几二十年,不能因为微软出幺蛾子就重写系统,花钱之外,出现新BUG又怎么办?比如交易所的清算系统,仍然使用着dbf数据库。有同事来找我写个程序,需求是这样的:交易所提供了一张所有客户的数据表,要把特定客户的数据提取出来生成一个dbf文件发给指定客户。目前是手工在FoxPro软件中用下拉框一个个找出来再打包发送,每天没有几个小时搞不完。这个问题简单啊,不就是一个SQL语句么。然而,困难却出在dbf格式上。

    SQL语句"select  ... into table1"执行后可以自动生成table1.dbf文件。这个特性真是太好了。我用程序写了个for循环,把1000个客户对应的1000个SQL语句生成出来,然后,把这些语句全选拷进FoxPro的命令窗口,全选状态下按回车键执行,于是1000个dbf就生成了。

    第一版程序就是这样写的,最后一步需要同事拷贝出脚本(1000个语句)到FoxPro中执行一下。这个有点丑。因为同事不是IT人,对编程方面一窍不通,就让他copy一下都错误百出,不是复制错了位置就是没全选就执行,然后换同事代班时再重复着这样的错误。于是,很想找一个能用VB或VC执行dbf的SQL语句的方法,因为我不大可能去学那老旧的FoxPro开发了。

    最后真的找到了一段程序,看来很精典,因为N个不同贴子都是这段代码。看完后恍然大悟,关键不在此代码,此代码和普通SQL代码没什么两样,关键在于,这台电脑要装有dbf数据库驱动。数据库处理数据之所以比文本等其他方式快,也就是有了数据库驱动的原因。查找控制面板中ODBC数据表驱动列举,其第一项就是dBase(dbf)数据库驱动,但估计是因为版本太老,它是不能支持读写dbf的程序运行的。

读写dbf的代码如下:

Dim CNN As New ADODB.Connection
Dim STRSQL As String

'打开
Private Sub Form_Load()
    CNN.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDb=E:DBF"
    CNN.Open
    CNN.CursorLocation = adUseClient

End Sub

'创建
Private Sub Command1_Click()
    'STRSQL = "SET DEFAULT TO '" & App.Path & "'"
    'CNN.Execute STRSQL


    STRSQL = "CREATE TABLE dbfdemo.dbf([IDA] CHAR(32),[NAME] CHAR(32))"
    CNN.Execute STRSQL
    'CNN.Close
End Sub

'添加
Private Sub Command2_Click()

    STRSQL = "insert into dbfdemo.dbf([ida],[NAME]) values('1','sdf')"
    CNN.Execute STRSQL
End Sub

'显示
Private Sub Command3_Click()
    Dim rs As New ADODB.Recordset
    STRSQL = "select * from dbfdemo.dbf"
    Set rs = CNN.Execute(STRSQL)
    If Not rs.EOF Then
        Text1.Text = rs.Fields(1)
    End If
End Sub

'修改
Private Sub Command4_Click()
    STRSQL = "update dbfdemo.dbf set name='好好' where ida='1'"
    CNN.Execute STRSQL
End Sub

Private Sub Form_Unload(Cancel As Integer)
    CNN.Close

End Sub

    老司机们都知道,在复制粘贴代码后需引用ADO,即引用列表中引用Microsoft ActiveX Data Object,版本随意(我反正没太注意到不同版本的区别)。上述代码在安装有FoxPro的电脑上运行是没有问题的,因为它有了数据库驱动。如果是一台新的电脑,或你的程序需要发布到任意电脑上使用,则需要安装FoxPro驱动,大小不到1M。

    另外,有个细节需要说明。不知是驱动版本问题还是什么原因,上述代码在新电脑上运行时会出现找不到路径的错误,此时,把SQL语句中的表名指定绝对路径即可,如:

'创建
Private Sub Command1_Click()
    CNN.CursorLocation = adUseClient
    STRSQL = "CREATE TABLE """ & App.Path & "\dbfdemo.dbf""([IDA] CHAR(32),[NAME] CHAR(32))"
    CNN.Execute STRSQL
    'CNN.Close
End Sub

'添加
Private Sub Command2_Click()

    STRSQL = "insert into """ & App.Path & "\dbfdemo.dbf""([ida],[NAME]) values('1','sdf')"
    CNN.Execute STRSQL
End Sub

    上述方法完全OK了。在FoxPro中,还有一种指定目录的方法,即SET DEFAULT TO C:\xxxx这样。可是这行代码却不能在VB中执行,执行时报错,知道的网友告诉我一下哈。

    同事任务中后续的压缩和邮件发送,则是直接调用winrar和outlook完成的。

你可能感兴趣的:(VB编程手札,数据库)