巧用VB的ADO处理各类数据库故障解析

2017-03-15 12:51马亮
电脑与电信 2017年6期
关键词:字段数据量控件

马亮

(甘肃省天水市职业技术学校,甘肃 天水 741000)

巧用VB的ADO处理各类数据库故障解析

马亮

(甘肃省天水市职业技术学校,甘肃 天水 741000)

操作系统从W in7开始变成了64位系统,导致VB下基本的界面操作都变得很卡,原先提供的众多命令、函数等不能正常运行。幸好快捷而且强大的数据库连接工具ADO依然正常,但操作系统、数据库版本、链接库版本、数据库信息量都会对数据产生影响,教程的理论分析与实际情况往往存在差异,对此本文主要分析笔者在编写程序时遇到的实际问题、困惑以及解决方法。

VB;ADO;数据库;故障

1 引言

随着各类数据库版本的不断升级,VB的功能不断遭到抛弃。Access、VB默认版本是97,Excel版本不能超过2003。尤其操作系统从Win7开始变成了64位系统,导致VB下基本的界面操作都变得很卡,原先提供的众多命令、函数等不能正常运行。幸好快捷而且强大的数据库连接工具ADO依然正常,但理论和实际往往差别很大,操作系统、数据库版本、链接库版本、数据库信息量都会对数据产生影响,教程一般使用几条信息演示处理过程,而实际情况却千差万别,以下就是作者在编写程序时遇到的实际问题、困惑以及解决方法。

2 数据库的基本操作

2.1 读写数据库准备工作

(1)引用

M icrosoftActiveX Data Objects2.5 Library

M icrosoftDAO 3.6Object Library

M icrosoftData Formatting Object Library

(2)添加控件

MSHFlexGrid1’表格_控件

Time1 ’计时器_控件

ProgressBar1’进度条_控件

(3)变量定义

Public Cn As New ADODB.Connection

Public RsAsNew ADODB.Recordset

Public路径As String’数据库文件的存放位置

2.2 链接数据库

(1)打开Excel文件,扩展名xls

Cn.ConnectionString="Provider=M icrosoft.Jet.OLEDB.4.0; Persist Security Info=false;Data Source="&路径&";Extended Properties='Excel8.0;HDR=Yes'" ’路径字符串变量表示数据库文件存放位置

Cn.Open

Rs.Open"select*from["&表册&"$]",cn,adOpenKeyset,adLockOptim istic’表册字符串变量表示Excel文件包含表册(Sheet)的名称

(2)打开Vf文件,扩展名mdb

cn.ConnectionString="provider=msdasql;DRIVER=M icrosoftVisual FoxPro Driver;UID=;Deleted=yes;Null=no;

Collate=Machine;BackgroundFetch=no; Exclusive=No; SourceType=DBF;SourceDB="&路径&";"

cn.Open

Rs.Open"select*from"&路径&"",cn

(3)打开Acess文件

Cn.open"Provider=M icrosoft.Jet.OLEDB.4.0;Data Source=" &路径

strSQL="SELECT*FROM"&表册名rs.Open strSQL,conn,3,3

也可直接使用Data控件就可实现操作。

注:以上过程只是打开或链接数据库文件,并非读取数据。

Excel因其易学、操作简单,所以用户量很大,但Excel算不上数据库软件。Excel2003以下版本数据量只有6万多条(65536)。Excel2007数据量可达1百万(1048576)。

Vf属于专业数据库软件,信息量可到10亿条,但使用者并不太多。

Access读写最为简洁、方便,但目前已被大家遗忘。

2.3 读取数据库信息

(1)一次性读取到表格中

SetMSHFlexGrid1.DataSource=Rs

优点:操作简单、读取速度极快,即便用户对该数据库内容一无所知,也不影响数据的读取。

缺点:每一列数据类型必须保持一致,不然会出现信息缺失,且只显示信息的前2048条。(解决方法将在后面叙述)

(2)按顺序逐条读取

1)读取第R条(行),第C列数据至变量S中

Dim Sas String

Rs.Move(R)

S=Rs.Fields(C).Value

2)将数据库中的数据全部读取到表格MSHFlexGrid1中

假设此数据库有R条数据,C个字段。

Dim ias Long:dim jas Long

Rs.MoveFirst

For i=1 to R

For j=1 to C

Rs.MoveNext

MSHFlexGrid1.TextMatrix(R-1,C-1)=Rs.Fields(C).Value

Next j

Next i优点:不用将数据库的全部数据读取,只选择所需的数据。

缺点:需要全部读取且数据库非常庞大时,非常耗时,还会出现假死或死机的现象。在读取过程中也不能中断或取消。(解决方法将在后面叙述)

注:数据库第一行为字段,并非数据,可不读取,以下是数据库操作的几条常用命令。

Rs.Move(Num)’移动到第Num条信息

Rs.MoveFirst’移动到第一条信息

Rs.MoveLast ’移动到最后一条信息

Rs.MoveNext ’移动到下一条信息

Rs.MovePrevious’移动到上一条信息

(3)按字段读取

例:读取“姓名”字段中的前5条数据,保存至List1中

List1.Clear’清空记录列表

Rs.MoveFirst

for i=1 to 5

list1.AddItem Rs.Fields("姓名"),i

Rs.MoveNext

next i

优点:数据信息与列无关,只要确定字段名称,就可任意读取。

2.4 写入数据库信息

将MSHFlexGrid1中的所有信息保存在Excel表册中,且表册名称为“数据”,列表中的第一行视为字段名称。

Dim路径as String

路径=“****”’文件存放位置和名称。例:路径=“C:data文件.xls”

Cn.Open"Provider=M icrosoft.Jet.OLEDB.4.0;"&"Data Source="&路径&";Extended Properties=""Excel 8.0;HDR= YES;"""

’------------------如果文件需要新建则加入以下代码------------------------

cn.Execute"CREATETABLE["&路径&"]."&表头Rs.Open"select*from[中考成绩库$]",cn,adOpenKeyset,adLockOptim istic

’---------------------------------------------------------------------其中表头部分格式包括:字符串chr,数字int

字符串,数字:表示字段名称,chr表示数据类型为字符型,int表示数字类型,如果有多个字段则用逗号隔开。

2.5 断开数据链接

Rs.Close

Cn.Close

数据读写完后要断开连接,否则后面的程序可能出现不可预料的错误。

易出现故障:如果数据没有正常打开,则关闭时会引发系统故障,所以在关闭前应先判断数据库状态。

3 故障处理

(1)一次性读取数据时,不能全部读取

问题叙述:读取数据时用Set MSHFlexGrid1.Data-Source=Rs命令,方法最为简洁,但读取的数据量不能超过2048条(根据系统的不同,数据量也不相同),网上有很多人想了很多解决方法,但均无效果。最终只能采取逐行读取的方法,费时费力。

解决方法:其实这是VB6.0的一个漏洞,用户只需打Vb-SP6的补丁即可。

(2)一次性读取数据时,数据不完整

问题叙述:整个数据一次性读取时,还有一个错误就是数据的缺失,故障原因就是信息的格式不统一,例如,数据库中某个字段的第一个数据是数字,而后面非数字格式的信息就会变成空字段。

解决方法:在建立数据库或保存数据库时将数据格式统一成“字符串”格式。读取之后根据需要再进行转换。对于Excel文件,在保存时数据前加一个单引号即可。

(3)数据量过大,读取时死机

问题叙述:当数据量为几万或几十万时,读取过程中可能因硬件原因导致假死或死机现象,即便高配置计算机也会出现卡顿现象,在普通循环命令中这种现象也比较常见,而且中途无法选择放弃。

解决方法:

方法1:利用控件-计时器,来完成循环命令

准备工作:加入两个按钮:command1、command2,用于循环的开始、暂停或结束的控制。

加入一个计时器控件:timer1,用于代替循环命令。

加入进度条:ProgressBar1,用于查看程序运行进度。

代码改写前:

For i=1 to 10000

<循环体>

Nexti

代码改写后:

Dim计数as Long’用于控制循环运行次数

Private Sub Command1_Click()’控制循环开始按钮

Timer1.Interval=10’设置程序运行速度,单位毫秒

计数=1 ’初始循环的次数

ProgressBar1.Max=10000’定义进度条的最大值

ProgressBar1.Value=1’初始进度条进度

Timer1.Enable=True’循环开始执行

End Sub

Private Sub Timer1_Timer() ’计时器控件、放置循环体

计数=计数+1

If计数<10000 then

<循环体>

ProgressBar1.Value=i

Else

Timer1.Enable=False’循环结束

End If

End Sub

Private Sub Command2_Click()’控制循环结束或暂停按钮

If Timer1.Enable=False then

Timer1.Enable=True

Else

Timer.Enable=False

End If

End Sub

计时器中可放置多个循环体,并不需要建立多个计时器插件。例:

Private Sub Timer1_Timer() ’计时器控件、放置循环体

Selectcase K ’K为循环控制参数

Case0:Call函数A

Case1:Call函数B

……

End Select

End Sub

注:此方法看似多了很多条命令,让程序变得复杂。但让程序变得可以控制,可根据硬件配置在<循环体>中加入小的For循环,以减少程序的运行时间。而且进度条也能显示流畅的进度动画。

方法2:利用Sleep函数

Public Declare Sub Sleep Lib"kernel32"(ByVal dwM illisecondsAs Long)’函数定义

代码改写后:

For i=1 to 10000

<循环体>

Sleep 10’暂停10毫秒

DoEvents’转让控制权

Next i

DoEvents的作用是在循环体执行暂停时,可以执行其它命令,例如按下暂停按钮。但此命令在使用时,需注意数据的嵌套使用,很容易出现未知的数据错误。

(4)断开数据库时出现异常错误

问题叙述:数据库使用完,必须断开链接。断开链接后不能再次断开。问题看似简单,但在使用过程中并非如此,除非程序运行在理想状态下。数据库的链接、读取、用户的误操作都会产生问题。

解决方法:

使用错误检测跳转命令:On ErrorGoTo

命令含义:程序运行出现错误跳转到指定的命令行。

程序如下:

On ErrorGoTo结束

K=0’变量,用于测试程序执行到了第几步出现了错误

<链接数据库语句>:K=1

<读取数据库语句>:K=2

<关闭数据库>: K=3

结束:

Select case K’从K的数值就可看出程序从哪个阶段产生的跳转

Case 0:<程序>’数据库打开错误

Case1:<程序>’数据库读取错误

Case2:<程序>’数据库没有正常关闭

Case 3:<程序>’数据库操作正常

End Select

注:错误检测跳转命令(On ErrorGoTo)会忽略程序产生中所有的错误,使用过程中要谨慎。

(5)判断数据库字段和数据量

问题叙述:在读取数据库数据时,如果对内容一无所知就必须先判断字段和数据量以及字段名称,不然一定会产生错误。

解决方法:

判断数据条数,使用软件自带命令Rs.Fields.Count即可。

判断字段数量,此数据不可遇见,只能一一测试,就利用上述的错误检测跳转命令。

添加下拉列表控件List1,用于记录所有的字段名称。

Dim Ias interge:i=0’计算字段序号和统计数量

List1.Clear’清空记录列表

On ErrorGoTo结束’循环体语句出现错误时跳出

Do’字段数量未知,所以需要一个无限的循环

i=i+1

list1.Add Item Rs.Fields.Item(i).Name,i’将读取到的字段名称记录到列表中

Loop

结束:

命令解释:Rs.Fields.Item(i).Name读取第i个字段名称,当出现数据读取错误时,表示字段已经读取结束。

此时:List1里存放的就是每个字段的名称,i-1就是字段总数。

4 结束语

本文介绍了如何利用VB的ADO处理各类数据库的故障问题,有利于提高数据库的处理速度,以期为相关技术人员提供有价值的参考。

[1]柏建普,杜娟.ADO技术在VB访问SQL数据库中的应用[J].电脑知识与技术,2013(29):6481-6485.

Analysison the Resolution of Database FaultsUsing ADO in VB

Ma Liang
(TianshuiVocationaland TechnicalSchoolof Gansu Province,Tianshui741000,Gansu)

The operating system changing from Win7 into the 64 bit system has lead the VB operation interface to be not smooth,and the commandsand functions cannotwork properly.Fortunately,the database connection toolADO is stillnormal.However,operating system,database version,linking library version and database information w illhave an impacton the data.And there are differencesbetween the theoreticalanalysis and the actualsituation of the tutorial.This papermainly analyzes the practical problemsencountered in programming and itssolutions.

VB;ADO;database;fault

TP311.13

A

1008-6609(2017)06-0068-04

马亮(1977-),男,甘肃天水人,本科,助教,研究方向为计算机应用。

猜你喜欢
字段数据量控件
图书馆中文图书编目外包数据质量控制分析
基于大数据量的初至层析成像算法优化
基于.net的用户定义验证控件的应用分析
高刷新率不容易显示器需求与接口标准带宽
宽带信号采集与大数据量传输系统设计与研究
关于.net控件数组的探讨
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究
基于嵌入式MINIGUI控件子类化技术的深入研究与应用