2024年4月25日发(作者:)

维普资讯

ol 霪 

l Visual 

Basic 6.0开发数据库应用程序的几个实用 

{ 

li 

; 

(新疆钢铁学校,新疆

英 

鸟鲁木齐830022) 

i 

Visual Basic是Microsoft公司推出的的32位Windows应 

用程序开发工具。它提供了开发Microsoft Windows(R 应用程 

中提供用户对数据集需满足的条件的设置、如获取当前表含 

有的字段,以及如何选取需要的字段?(4)如何实现根据用户 

序的最迅速、最简捷的方法。不论是Microsoft Windows应用程 

序的资深专业开发人员还是初学者,Visual Basic都为他们提 

供了整套工具,以方便开发应用程序。Visual Basic 6.0作为一 

种成熟的开发工具,从设计新型的用户界面到利用其它应用 

的选择情况动态生成数据输出窗体?(5)如何实现各窗体的切 

换? 

针对第一个问题,首先,进入VB集成环境,创建一个新 

工程,选择“工程”菜单,“添加窗体”选项,在弹出的窗口选择 

“新建”,在可选项中选择“ODBC登录”,单击“打开”后出现 

“ODBC登录”窗体,可以看见工程中增加了窗体名称为fr- 

mODBCLogon的窗体。这个窗体是中文版VB 6.0提供给程序 

员直接调用的,窗体的控件及代码都已经设计好了。察看该窗 

体上各控件的属性和代码,在Form_Load()事件中看见如下代 

码: 

Private Sub Form

_

程序的对象、从处理文字图像到使用数据库,Visual Basic提 

供了完成这些工作的所有工具。与C++Bulider、Delphi、 

Power Bulider等快速开发工具一样,Visual Basic支持许多公 

共的编程结构和语言元素。在开发数据库应用程序方面,vi. 

sual Basic 6.0提供了许多工具以满足针对数据库编程的需 

要,例如数据绑定控件、设计器以及诸如格式化对象等技术。 

通常用VB6.0实现访问数据库的方法包括:通过VB 6.0 

的“VB数据窗体向导”、ADO控件与Dbgrid控件、DataCombo、 

DataList等控件的绑定、VB 6.0 Data Envoriment以及VB 6.0 

Load() 

GetDSNsAndDrivers 

End Sub 

集成开发环境配合VB6.0外接程序中的“可视化数据管理 

器”等。采用这些方法和控件能够实现数据库应用程序设计, 

其中调用了GetDSNsAndDrivers子过程。该过程就是获取 

当前系统中可用ODBC数据源的程序。在这里要注意的是必 

只是对数据库的操作不够灵活,比如在程序中要确定需要打 须在模块级变量声明中添加如下代码: 

开数据库的ODBC数据源等。针对这一情况,作者编写了一个 

Option Explicit 

可以通过人机交互,由用户自由选择ODBC数据源、数据库、 

数据集(表)、数据项(字段),而且返回信息界面可根据用户不 

同选择动态调整的“通用ODBC数据库访问程序”,具体过程 

Private 

“ODBC32

Declare Function SQLDataSources Lib 

DLL” (ByVal henv&,ByVal fDirection%,ByVal 

szDSN¥,ByVal cbDSNMax%,pcbDSN%,ByVal szDescription 

限于篇幅在此不便详叙,本文仅就实现过程中遇到的问题和 

几个解决技巧加以说明。 

这个程序包含三个窗体,第一个为“ODBC登录”窗体。该 

窗体用于通过人机对话完成用户与ODBC数据源的连接。由 

于连接信息是用户在程序运行期间输入的,因此,用户可以选 

择任何一个已在本机配置好的ODBC数据源,同时针对每一 

个数据源,用户可以选择任意可访问(有访问权限)的数据 

¥,ByVal cbDescriptionMax%,pcbDescription%)As Integer 

Private 

Declare Function SQLAllocEnv%Lib 

“ODBC32

DLL”env&) 

Const SQL_SUCCESS As Long=0 

Const SQL_FETCH_NEXT As Long=l 

因为在GetDSNsAndDrivers()中调用的SQLAllocEnv()、 

SQLDataSources()等子过程是在ODBC32.DLL中定义的。此外 

库。第二个窗体为“数据窗体设计”窗体。该窗体用于向用户提 

还可以看到用于输入用户密码的文本框txtPWD的Password— 

供对数据集(表)、数据项(字段)的选择,同时允许用户在此设 Char属性为空。这就意味着用户输入的密码为明码了,所以 

定需要访问的纪录必须满足的条件。这些功能,既增加了用户 

必须修改。我把该属性改为“★”,即用户输入密码时,屏幕上 

文本框中显示的是相应数目的“★”符号。通过查看该窗体的 

代码我们可以看出该窗体只具有提供用户选择ODBC数据源 

及获取连接ODBC数据源字符串的功能,我们在使用中还需 

自己添加代码来完成与ODBC数据源的连接。具体工作是这 

的选择性,又能加强程序的针对性,可以更好地满足用户需 

求。第三个窗体为“数据窗”窗体。它的功能是向用户输出满足 

其设定的条件的纪录。该窗体可根据用户设定的不同条件,动 

态生成满足该条件的窗体结构。 

为了实现上述三个窗体及其功能,需要解决以下几个问 

题:(1)如何获取当前系统所配置的ODBC数据源以及如何连 

样的:在工程菜单选择“引用”,再在弹出的对话窗中选择 

“Microsoft ActiveX Data Objects 2.0 Library”和“Microsoft DAO 

接到数据源?(2)如何取得当前数据库中所有的表的表名及其 

列表;用户如何从列表中选取需要访问的表?(3)如何在程序 

36 

Objects 3.6 Library”两项可用的引用,并在该窗体的“模块声 

明”部分添加代码: 

新I气象2002年第25卷第3期 

维普资讯

Public db As Connection 

再在cnl”按钮的click事件中添加如下代码: 

再在“确定”按钮的代码段:Private Sub cmdOK

Click()中 

添加如下代码: 

Set db=New Connection 

db.CursorLocation adUseClient 

Private Sub cnl_』=lick() 

TextWhere.Text=…’ 

TextWhere.SetFocus 

End Sub 

db.Open(sADOConnect) 

此外还需在Form2窗体上再加入两个ListBox框分别命 

名为List1和List2。通过Listl列表框来获取当前表中含有的 

所有字段的列表;通过List2列表框纪录用户选定的字段列 

同时删除程序段中不需要的代码段:如:MsgBox等,加入 

简单的出错处理,这样第一个问题就顺利解决了。 

对于第二个问题,首先在工程中添加一个窗体命名为 

Form2,在该窗体上加入一个ComboBox框,名为:combol,再在 

frmODBClogon窗体的“确定”按钮中添加如下代码: 

Dim mydb As Database 

Dim mytab As TableDef 

表。为实现这两项功能,需要分别在两个列表框的DblClick() 

事件中添加如下代码: 

Private Sub Listl

DblClick() 

_

List2.Addhem List1.Text 

List1.RemoveItem(List1.Listlndex) 

End Sub 

etS mydb=OpenDatabase(vbNullString,0,0,sDAOCon- 

nect) 

Form2.comtab.Clear 

For Each mytab In mydb.TableDefs 

Form2.comtab.Addhem mytab.Name 

Next 

该程序段的功能是:当用户双击List1列表框中列出的某 

字段名时,表示该字段已被选中,并希望出现在程序最终输出 

窗体上,因此,该字段记入List2列表框,同时从Listl列表框 

中删除,以免用户重复误选。 

Private Sub List2

DblClick() 

_

其中OpenDatabase方法的定义在“Microsoft DAO Objects 

3.6 Library”中,OpenDatabase方法原型为OpenDatabase 

(dbname,options,read—only,connect)。“For each…in.. 

List1.Addhem List2.Text 

istL2.RemoveItem(List2.Listlndex) 

End Sub 

next”语句的用法请参考有关VB6.0教材。至此获取当前数 

据库中所有的表的表名及其列表的工作就完成了。选取表时, 

使用Combo1.text属性即可。 

该程序段的功能是:当用户双击List2列表框中列出的某 

字段名时,表示该字段已被选中,并且该字段不希望出现在程 

序最终输出窗体上,因此,该字段被从List2列表框中删除,同 

被时记入Listl列表框中,以便用户随后选取。 

这样第三个问题也解决了。 

第三个问题的解决办法为:在Form2窗体上加一个 

TextBox命名为TextWhere,用户设置查询条件时可在Tex. 

tWhere文本框中 接输入,但输入内容必须符合标准SQL语 

言中的“where”子句的规范。另外加入两个命令按钮,分别命 

针对第四个问题,实现方法是在程序窗体设计阶段,在主 

窗体Forml上事先设计好程序最终输出窗体的布局,然后再 

情况动态加载输出数据的相应控件。 

具体实现过程是: 

名为okl和cn1。确认输入正确后按“okl”按钮,否则选“cnl” 在程序代码中根据用户选择的字段数,字段名、各字段长度等 

按钮重新输入条件。为此在“okl”按钮的click事件中需要添 

加如下代码: 

Private Sub okl-!=lick() 

Dim strWhere As Sting r

Dim i As Integer 

首先,在Form1窗体上加入两个Label控件:Labts和 

Labto,修改其Caption属性为空和“状态统计”,修改Labts的 

index属性为0,再在窗体上加入两个textBox控件,分别命名 

为:textif-eld和texttotal。修改textifeld的index属性为0,这是很 

On Error GoTo myerror 

Set adoRs=New Recordset 

strWhere = “ ”&TextWhere

Text 

重要的一点,这样就相当于隐式声明了一个名为textifeld的 

文本框数组,对于Labts的index属性也是同样的道理。这样 

adoRs.Open“select★from”&eomtab

Text&strWhere, 

的设计就可以在程序代码中通过:load textileld(i)以及l0ad 

Labts(i)命令动态生成第i个文本框(textBox)控件和第i个 

frmODBCLogon.db,adOpenStatic,adLockOptimistic 

Dim myfie As Field 

etS myRs=adoRs 

For Each myfie In myRs.Fields 

标签(Labe1)控件。此外,再根据用户的具体需要在Form1窗 

体上加入若干个CommandButton按钮。如本程序中加入了5 

个按钮,分别命名为:“刷新”、“下一个”、“前一个”、“返回”、 

List1.Addhem myfie.Name 

Next 

“结束”。调整好Form1窗体上各个控件的初始位置。这样 

Form1窗体就设计完了。随后再在form2窗体上加入一个 

CommandButton按钮,修改其Caption属性为“确定”。双击该按 

钮,在Click事件中添加下代码: 

Private Sub combOk

Click() 

_

Exit Sub 

myerror: 

MsgBox Err.Description 

End Sub 

VisuaI Basic 6.0开冀藏量库应用程序的几个实用技巧——黄英 

Dim i As Integer 

37 

维普资讯

On Error GoTo myerror 

Form2.Hide 

Form1.Show 

For i=l To List2.ListCount—l 

mODBClogon窗体和Form2窗体以及Form1窗体间的切换我 

就是通过如下方法实现的。首先,程序运行初始从住窗体到显 

示“ODBC登录窗体”,这是通过Form1的form

load()事件来完 

成的。响应该事件的的代码如下: 

Private Sub Form

Load Form1.TextFields(i) 

Load Form1.Labts(i) 

Load() 

Form1.Hide 

frmODBCLogon.Show 

End Sub 

Form1.TextFields(i).Top=Form1.TextFields(i—1) 

Top+285 

Form1.Labts(i).TOp=Form1.Labts(i—1).TOp+ 

285 

其次,从fmODBClrogon窗体切换到Form2窗体,是通过 

在fmODBClrogon窗体中的“确定”按钮中添加代码来完成的: 

Form1.TextFields(i).Visible=True 

Form1.Labts(i).Visible=True 

Next 

fmODBCLogon.Hide r

Form2.Show 

最后,从Form2窗体切换到Forml窗体,是通过在Form2 

窗体的combOk按钮的Click()事件中添加如下代码实现的: 

Form2.Hide 

frmODBCLogon.Hide 

Form1.Show 

’在forml窗体上动态生成若干个Label控件和textBox 

控件’ 

Form1.TextTota1.Top=Form1.TextFields(List2.ListCount 

l1.Top+300 

Form1.Labto.Top=Form1.Textota1.TTop 

以上,就是采用Visual Basic实现“通用ODBC数据库访 

Form1.Cmend.Top=Form1.TextTota1.Top+300 

Form1.Command1.Top=Form1.Cmend.Top 

Form1.Command2.TOp=Form1.Cmend.TOp 

Form1.Command3.TOp=Form1.Cmend.Top 

Form1.Command4.Top=Form1.Cmend.Top 

For i=0 To List2.ListCount一1 

问程序”时遇到的一些问题和采取的解决办法。 

使用该程序,用户可以访问同一数据源绑定的数据库中 

的相关的表,也可在使用过程中随时通过人机交互界面更改 

要访问的数据源、数据库、表、字段等内容。该程序经过编译后 

可运行干任意一台配置了ODBC的windows 98、windows NT 

工作站。当然,这个程序也还有许多可以改进和加强的地方, 

比如,可以在程序中增加对数据库进行修改、增、删等操作的 

功能,这样才算是一个完全意义上的“通用访问ODBC数据库 

的程序”。 

Form1.Labts(i).Caption=List2.List(i) 

Form1.TextFields(i).Text=adoRs.Fields(List2.List 

(i)) 

Form1.TextFields(i).width=Len(adoRs.Fields 

(List2.List(i)))★300 

Next 

动态调整f0rml窗体上各控件的位置’ 

Form1.TextTotal_Text= “Cun_ent Record:”&adoRs

. 

AbsolutePosition&“/Total”&adoRs

RecordCount& 

“Records” 

Exit Sub 

myerror: 

MsgBox Err.Description 

End Sub 

上述程序段的功能主要是向“数据窗体”动态添加需要的 

控件,以及取得用户最终需要的数据。具体各行程序代码的功 

能请参见程序段中的各注释行。这样就解决了动态生成数据 

输出窗体的技术问题。当然,要使数据输出窗体的功能完善, 

还需要对前面提到的Forml窗体上的另外5个CommandBut— 

ton按钮,分别就其Click事件编写相应的代码。由于这部分代 

码相对较为简单这里就不一一列出了。 

最后一个问题只需记住任何时候保证你的程序中只有一 

个窗体是可见的,其它窗体均处于不可见状态(如:调用hide 

方法或者使visible=False)就行了。比如在我的程序中fr- 

38 

新疆气象2002年第25卷第3期