VB6 数据库程序设计

Q & A


99/07/03 使用键盘操作 p.101 的 Valid04.vbp, 结果会避开验证程序, 如何解决?
99/06/26 如何动态设定数据库的所在路径?
99/06/20 VB5 的数据库程序可以直接在 VB6 执行吗?
99/06/13 VB5 使用 DBGrid 开发的数据库程序不能使用于 VB6?
99/05/18 对数据库来说,如何处理已经删除的数据记录空间?
99/05/18 JPG或GIF格式的图片是否可以插入于 mdb数据库?
99/03/27 如何使用 VB6 的 ADO 打开含有密码的 mdb 数据库?

使用键盘操作 p.101 的 Valid04.vbp, 结果会避开验证程序, 如何解决?


Q: 我使用您附在书中之程序范例 valid04.vbp, 依您书中所述应该会使错误数据回复; 但我在Datagrid1中对 "收盘价" 栏位输入0, 而屏幕出现警告讯息, 但我使用键盘移至下一笔数据时,错误数据仍旧没有回复.
A: 经测试, 发现 DataGrid 将数据写入数据库之前, 并不会产生 Adodc1_WillChangeRecord, 这听起来有点不合理, 但却是事实。 目前解决的方法, 是增加以下程序:
Private Sub DataGrid1_BeforeUpdate(Cancel As Integer)
    Dim pRecordset As Recordset
    Set pRecordset = Adodc1.Recordset
    If pRecordset("收盘价") < pRecordset("最低价") Or _
       pRecordset("收盘价") > pRecordset("最高价") Then
        Cancel = True
    End If
End Sub

其中 BeforeUpdate 事件会发生于 DataGrid 将数据写入数据库之前。


如何动态设定数据库的所在路径?


Q: 撰写程序时, 都是在自己的机器进行测试, 如果想把执行档安装到其他电脑 (安装之后 .mdb 文档的所在路径可能与原机器不同), 此时程序如何正确地打开数据库?
A: 这个问题很好, 当我们利用 ADODC 设定好数据库时, ADODC会记录数据库文档的绝对路径, 所以当然程序移植到其他机器之后, 路径就可能变得不正确。 修改的方法如下: (注:设计时,ConnectionString 及 DataGrid 的 DataSource 属性要先清成空白)
Private Sub Form_Load()
    S = "Provider=Microsoft.Jet.OLEDB.3.51; Persist Security Info=False;"
    S = S & "Data Source=" & Mdb数据库的路径
    Adodc1.ConnectionString = S
    Adodc1.Refresh

    Set DataGrid1.DataSource = Adodc1
End Sub

以上的「Mdb数据库的路径」可以在进行安装时, 将其写入Windows的Registry (例如执行SaveSetting叙述), 然后才在程序中利用GetSettting叙述读取「Mdb数据库的路径」。


VB5 的数据库程序可以直接在 VB6 执行吗?


如果您的程序没有使用到 DBGrid 及 Crystal Report, 则可以直接在 VB6 执行。

如果您的程序使用了 DBGrid,请参考 Q&A「VB5 使用 DBGrid 开发的数据库程序不能使用于 VB6?」的说明。

如果您的程序使用了 Crystal Report, 很抱歉(我干吗说抱歉, 说抱歉的应该是微软), VB6 不再附带这个控件, 因此您必须先安装 VB5(同时也安装 Crystal Report), 再安装 VB6, 接着才可以在 VB6 之中使用 Crystal Report。


VB5 使用 DBGrid 开发的数据库程序不能使用于 VB6?


我在 VB5 底下所开发的数据库程序使用了 DBGrid 控件, 后来我在另一台全新的机器中安装了VB6, 然后执行这些使用 DBGrid 控件所开发的程序, 结果却出现「找不到DBGRID32.OCX」的错误, 该如何解决?


方法有二:

(1) 先安装VB5、再安装VB6。
(2) 如果不想安装VB5, 首先从VB6第一片光盘中寻找DBGrid32.* 文档 (只有专业版及企业版才找得到), 结果至少可以找到DBGrid.reg及DBGrid32.ocx这两个文档, 接下来在VB6底下安装DBGrid的步骤如下:
  1. 请将DBGrid32.ocx复制到硬盘中,通常是复制到Windows底下的System目录。
  2. 双按DBGrid.reg文档将DBGrid所需登录的信息汇入系统的登录数据库。
  3. 启动VB6,然后选取菜单的「专案/ 设定使用元件」,接下来在「设定使用元件」视窗里面按下「浏览」钮将DBGrid32.ocx引用进来。

经过以上步骤之后,凡是使用DBGrid所开发的数据库程序都可以在VB6底下执行了。


JPG 或 GIF 格式的图片是否可以插入于 mdb 数据库?


VB 程序可以将 JPG 或 GIF 格式的图片插入于mdb数据库, 而 VB 的作法是直接读取图片(形)控件 (例如 Image 或 PictureBox 控件) 的 Picture 属性, 然后插入于图片栏位, 但由于Picture属性存放图片的格式一律采用Bmp格式, 所以原本有经过压缩的 JPG 或 GIF 图片, 储存到数据库之后, 会变成没有经过压缩的 Bmp 图片, 所以数据库可能会急速膨胀。


对数据库来说, 如何处理已经删除的数据记录空间?


我们几乎可以不必担心数据库这方面的问题, 数据库本身会判断是否有被删除的空间, 如果有, 还会继续使用他们。 所以, 除非我们真的不断地新增数据记录, 否则在有删除有新增的情况下, 数据库并不会一直长大。

当然, 数据库文档也跟其他文档一样, 有「数据片段」的问题, 对同一数据表而言, 过多的数据片段(数据记录分散在不同位置)势必影响执行效能, 为了解决这个问题, MDB数据库允许我们重整数据库(也就是将同一数据表的数据记录放在一起), 至于如何重整数据库呢? 如果您有 Access 软件, 那么选取其菜单的「工具/数据库公用程序/压缩数据库」即可达到此一目的。


在 VB6 里面,如何打开含有密码的 mdb 数据库?


在使用 ADODC 或 DataEnvironment 设定好连线之后,直接利用属性视窗修改 ConnectionString 属性(附属于 ADODC) 或 ConnectionSource 属性(附属于 DataEnvironment 的 Connection 对象),修改的方法是在属性之后增加以下打参:

;Jet OLEDB:Database Password=密码

除了 ADODC 及 DataEnvironment 之外, 直接使用 ADO 对象来打开含有密码的 mdb 数据库,设定参数的方法也是相同的。