国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

巧用VB的ADO處理各類數(shù)據(jù)庫(kù)故障解析

2017-03-15 12:51:20馬亮
電腦與電信 2017年6期
關(guān)鍵詞:字段數(shù)據(jù)量控件

馬亮

(甘肅省天水市職業(yè)技術(shù)學(xué)校,甘肅 天水 741000)

巧用VB的ADO處理各類數(shù)據(jù)庫(kù)故障解析

馬亮

(甘肅省天水市職業(yè)技術(shù)學(xué)校,甘肅 天水 741000)

操作系統(tǒng)從W in7開始變成了64位系統(tǒng),導(dǎo)致VB下基本的界面操作都變得很卡,原先提供的眾多命令、函數(shù)等不能正常運(yùn)行。幸好快捷而且強(qiáng)大的數(shù)據(jù)庫(kù)連接工具ADO依然正常,但操作系統(tǒng)、數(shù)據(jù)庫(kù)版本、鏈接庫(kù)版本、數(shù)據(jù)庫(kù)信息量都會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響,教程的理論分析與實(shí)際情況往往存在差異,對(duì)此本文主要分析筆者在編寫程序時(shí)遇到的實(shí)際問題、困惑以及解決方法。

VB;ADO;數(shù)據(jù)庫(kù);故障

1 引言

隨著各類數(shù)據(jù)庫(kù)版本的不斷升級(jí),VB的功能不斷遭到拋棄。Access、VB默認(rèn)版本是97,Excel版本不能超過2003。尤其操作系統(tǒng)從Win7開始變成了64位系統(tǒng),導(dǎo)致VB下基本的界面操作都變得很卡,原先提供的眾多命令、函數(shù)等不能正常運(yùn)行。幸好快捷而且強(qiáng)大的數(shù)據(jù)庫(kù)連接工具ADO依然正常,但理論和實(shí)際往往差別很大,操作系統(tǒng)、數(shù)據(jù)庫(kù)版本、鏈接庫(kù)版本、數(shù)據(jù)庫(kù)信息量都會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響,教程一般使用幾條信息演示處理過程,而實(shí)際情況卻千差萬別,以下就是作者在編寫程序時(shí)遇到的實(shí)際問題、困惑以及解決方法。

2 數(shù)據(jù)庫(kù)的基本操作

2.1 讀寫數(shù)據(jù)庫(kù)準(zhǔn)備工作

(1)引用

M icrosoftActiveX Data Objects2.5 Library

M icrosoftDAO 3.6Object Library

M icrosoftData Formatting Object Library

(2)添加控件

MSHFlexGrid1’表格_控件

Time1 ’計(jì)時(shí)器_控件

ProgressBar1’進(jìn)度條_控件

(3)變量定義

Public Cn As New ADODB.Connection

Public RsAsNew ADODB.Recordset

Public路徑As String’數(shù)據(jù)庫(kù)文件的存放位置

2.2 鏈接數(shù)據(jù)庫(kù)

(1)打開Excel文件,擴(kuò)展名xls

Cn.ConnectionString="Provider=M icrosoft.Jet.OLEDB.4.0; Persist Security Info=false;Data Source="&路徑&";Extended Properties='Excel8.0;HDR=Yes'" ’路徑字符串變量表示數(shù)據(jù)庫(kù)文件存放位置

Cn.Open

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

(2)打開Vf文件,擴(kuò)展名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"&表冊(cè)名rs.Open strSQL,conn,3,3

也可直接使用Data控件就可實(shí)現(xiàn)操作。

注:以上過程只是打開或鏈接數(shù)據(jù)庫(kù)文件,并非讀取數(shù)據(jù)。

Excel因其易學(xué)、操作簡(jiǎn)單,所以用戶量很大,但Excel算不上數(shù)據(jù)庫(kù)軟件。Excel2003以下版本數(shù)據(jù)量只有6萬多條(65536)。Excel2007數(shù)據(jù)量可達(dá)1百萬(1048576)。

Vf屬于專業(yè)數(shù)據(jù)庫(kù)軟件,信息量可到10億條,但使用者并不太多。

Access讀寫最為簡(jiǎn)潔、方便,但目前已被大家遺忘。

2.3 讀取數(shù)據(jù)庫(kù)信息

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

SetMSHFlexGrid1.DataSource=Rs

優(yōu)點(diǎn):操作簡(jiǎn)單、讀取速度極快,即便用戶對(duì)該數(shù)據(jù)庫(kù)內(nèi)容一無所知,也不影響數(shù)據(jù)的讀取。

缺點(diǎn):每一列數(shù)據(jù)類型必須保持一致,不然會(huì)出現(xiàn)信息缺失,且只顯示信息的前2048條。(解決方法將在后面敘述)

(2)按順序逐條讀取

1)讀取第R條(行),第C列數(shù)據(jù)至變量S中

Dim Sas String

Rs.Move(R)

S=Rs.Fields(C).Value

2)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)全部讀取到表格MSHFlexGrid1中

假設(shè)此數(shù)據(jù)庫(kù)有R條數(shù)據(jù),C個(gè)字段。

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優(yōu)點(diǎn):不用將數(shù)據(jù)庫(kù)的全部數(shù)據(jù)讀取,只選擇所需的數(shù)據(jù)。

缺點(diǎn):需要全部讀取且數(shù)據(jù)庫(kù)非常龐大時(shí),非常耗時(shí),還會(huì)出現(xiàn)假死或死機(jī)的現(xiàn)象。在讀取過程中也不能中斷或取消。(解決方法將在后面敘述)

注:數(shù)據(jù)庫(kù)第一行為字段,并非數(shù)據(jù),可不讀取,以下是數(shù)據(jù)庫(kù)操作的幾條常用命令。

Rs.Move(Num)’移動(dòng)到第Num條信息

Rs.MoveFirst’移動(dòng)到第一條信息

Rs.MoveLast ’移動(dòng)到最后一條信息

Rs.MoveNext ’移動(dòng)到下一條信息

Rs.MovePrevious’移動(dòng)到上一條信息

(3)按字段讀取

例:讀取“姓名”字段中的前5條數(shù)據(jù),保存至List1中

List1.Clear’清空記錄列表

Rs.MoveFirst

for i=1 to 5

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

Rs.MoveNext

next i

優(yōu)點(diǎn):數(shù)據(jù)信息與列無關(guān),只要確定字段名稱,就可任意讀取。

2.4 寫入數(shù)據(jù)庫(kù)信息

將MSHFlexGrid1中的所有信息保存在Excel表冊(cè)中,且表冊(cè)名稱為“數(shù)據(jù)”,列表中的第一行視為字段名稱。

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[中考成績(jī)庫(kù)$]",cn,adOpenKeyset,adLockOptim istic

’---------------------------------------------------------------------其中表頭部分格式包括:字符串chr,數(shù)字int

字符串,數(shù)字:表示字段名稱,chr表示數(shù)據(jù)類型為字符型,int表示數(shù)字類型,如果有多個(gè)字段則用逗號(hào)隔開。

2.5 斷開數(shù)據(jù)鏈接

Rs.Close

Cn.Close

數(shù)據(jù)讀寫完后要斷開連接,否則后面的程序可能出現(xiàn)不可預(yù)料的錯(cuò)誤。

易出現(xiàn)故障:如果數(shù)據(jù)沒有正常打開,則關(guān)閉時(shí)會(huì)引發(fā)系統(tǒng)故障,所以在關(guān)閉前應(yīng)先判斷數(shù)據(jù)庫(kù)狀態(tài)。

3 故障處理

(1)一次性讀取數(shù)據(jù)時(shí),不能全部讀取

問題敘述:讀取數(shù)據(jù)時(shí)用Set MSHFlexGrid1.Data-Source=Rs命令,方法最為簡(jiǎn)潔,但讀取的數(shù)據(jù)量不能超過2048條(根據(jù)系統(tǒng)的不同,數(shù)據(jù)量也不相同),網(wǎng)上有很多人想了很多解決方法,但均無效果。最終只能采取逐行讀取的方法,費(fèi)時(shí)費(fèi)力。

解決方法:其實(shí)這是VB6.0的一個(gè)漏洞,用戶只需打Vb-SP6的補(bǔ)丁即可。

(2)一次性讀取數(shù)據(jù)時(shí),數(shù)據(jù)不完整

問題敘述:整個(gè)數(shù)據(jù)一次性讀取時(shí),還有一個(gè)錯(cuò)誤就是數(shù)據(jù)的缺失,故障原因就是信息的格式不統(tǒng)一,例如,數(shù)據(jù)庫(kù)中某個(gè)字段的第一個(gè)數(shù)據(jù)是數(shù)字,而后面非數(shù)字格式的信息就會(huì)變成空字段。

解決方法:在建立數(shù)據(jù)庫(kù)或保存數(shù)據(jù)庫(kù)時(shí)將數(shù)據(jù)格式統(tǒng)一成“字符串”格式。讀取之后根據(jù)需要再進(jìn)行轉(zhuǎn)換。對(duì)于Excel文件,在保存時(shí)數(shù)據(jù)前加一個(gè)單引號(hào)即可。

(3)數(shù)據(jù)量過大,讀取時(shí)死機(jī)

問題敘述:當(dāng)數(shù)據(jù)量為幾萬或幾十萬時(shí),讀取過程中可能因硬件原因?qū)е录偎阑蛩罊C(jī)現(xiàn)象,即便高配置計(jì)算機(jī)也會(huì)出現(xiàn)卡頓現(xiàn)象,在普通循環(huán)命令中這種現(xiàn)象也比較常見,而且中途無法選擇放棄。

解決方法:

方法1:利用控件-計(jì)時(shí)器,來完成循環(huán)命令

準(zhǔn)備工作:加入兩個(gè)按鈕:command1、command2,用于循環(huán)的開始、暫?;蚪Y(jié)束的控制。

加入一個(gè)計(jì)時(shí)器控件:timer1,用于代替循環(huán)命令。

加入進(jìn)度條:ProgressBar1,用于查看程序運(yùn)行進(jìn)度。

代碼改寫前:

For i=1 to 10000

<循環(huán)體>

Nexti

代碼改寫后:

Dim計(jì)數(shù)as Long’用于控制循環(huán)運(yùn)行次數(shù)

Private Sub Command1_Click()’控制循環(huán)開始按鈕

Timer1.Interval=10’設(shè)置程序運(yùn)行速度,單位毫秒

計(jì)數(shù)=1 ’初始循環(huán)的次數(shù)

ProgressBar1.Max=10000’定義進(jìn)度條的最大值

ProgressBar1.Value=1’初始進(jìn)度條進(jìn)度

Timer1.Enable=True’循環(huán)開始執(zhí)行

End Sub

Private Sub Timer1_Timer() ’計(jì)時(shí)器控件、放置循環(huán)體

計(jì)數(shù)=計(jì)數(shù)+1

If計(jì)數(shù)<10000 then

<循環(huán)體>

ProgressBar1.Value=i

Else

Timer1.Enable=False’循環(huán)結(jié)束

End If

End Sub

Private Sub Command2_Click()’控制循環(huán)結(jié)束或暫停按鈕

If Timer1.Enable=False then

Timer1.Enable=True

Else

Timer.Enable=False

End If

End Sub

計(jì)時(shí)器中可放置多個(gè)循環(huán)體,并不需要建立多個(gè)計(jì)時(shí)器插件。例:

Private Sub Timer1_Timer() ’計(jì)時(shí)器控件、放置循環(huán)體

Selectcase K ’K為循環(huán)控制參數(shù)

Case0:Call函數(shù)A

Case1:Call函數(shù)B

……

End Select

End Sub

注:此方法看似多了很多條命令,讓程序變得復(fù)雜。但讓程序變得可以控制,可根據(jù)硬件配置在<循環(huán)體>中加入小的For循環(huán),以減少程序的運(yùn)行時(shí)間。而且進(jìn)度條也能顯示流暢的進(jìn)度動(dòng)畫。

方法2:利用Sleep函數(shù)

Public Declare Sub Sleep Lib"kernel32"(ByVal dwM illisecondsAs Long)’函數(shù)定義

代碼改寫后:

For i=1 to 10000

<循環(huán)體>

Sleep 10’暫停10毫秒

DoEvents’轉(zhuǎn)讓控制權(quán)

Next i

DoEvents的作用是在循環(huán)體執(zhí)行暫停時(shí),可以執(zhí)行其它命令,例如按下暫停按鈕。但此命令在使用時(shí),需注意數(shù)據(jù)的嵌套使用,很容易出現(xiàn)未知的數(shù)據(jù)錯(cuò)誤。

(4)斷開數(shù)據(jù)庫(kù)時(shí)出現(xiàn)異常錯(cuò)誤

問題敘述:數(shù)據(jù)庫(kù)使用完,必須斷開鏈接。斷開鏈接后不能再次斷開。問題看似簡(jiǎn)單,但在使用過程中并非如此,除非程序運(yùn)行在理想狀態(tài)下。數(shù)據(jù)庫(kù)的鏈接、讀取、用戶的誤操作都會(huì)產(chǎn)生問題。

解決方法:

使用錯(cuò)誤檢測(cè)跳轉(zhuǎn)命令:On ErrorGoTo

命令含義:程序運(yùn)行出現(xiàn)錯(cuò)誤跳轉(zhuǎn)到指定的命令行。

程序如下:

On ErrorGoTo結(jié)束

K=0’變量,用于測(cè)試程序執(zhí)行到了第幾步出現(xiàn)了錯(cuò)誤

<鏈接數(shù)據(jù)庫(kù)語句>:K=1

<讀取數(shù)據(jù)庫(kù)語句>:K=2

<關(guān)閉數(shù)據(jù)庫(kù)>: K=3

結(jié)束:

Select case K’從K的數(shù)值就可看出程序從哪個(gè)階段產(chǎn)生的跳轉(zhuǎn)

Case 0:<程序>’數(shù)據(jù)庫(kù)打開錯(cuò)誤

Case1:<程序>’數(shù)據(jù)庫(kù)讀取錯(cuò)誤

Case2:<程序>’數(shù)據(jù)庫(kù)沒有正常關(guān)閉

Case 3:<程序>’數(shù)據(jù)庫(kù)操作正常

End Select

注:錯(cuò)誤檢測(cè)跳轉(zhuǎn)命令(On ErrorGoTo)會(huì)忽略程序產(chǎn)生中所有的錯(cuò)誤,使用過程中要謹(jǐn)慎。

(5)判斷數(shù)據(jù)庫(kù)字段和數(shù)據(jù)量

問題敘述:在讀取數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),如果對(duì)內(nèi)容一無所知就必須先判斷字段和數(shù)據(jù)量以及字段名稱,不然一定會(huì)產(chǎn)生錯(cuò)誤。

解決方法:

判斷數(shù)據(jù)條數(shù),使用軟件自帶命令Rs.Fields.Count即可。

判斷字段數(shù)量,此數(shù)據(jù)不可遇見,只能一一測(cè)試,就利用上述的錯(cuò)誤檢測(cè)跳轉(zhuǎn)命令。

添加下拉列表控件List1,用于記錄所有的字段名稱。

Dim Ias interge:i=0’計(jì)算字段序號(hào)和統(tǒng)計(jì)數(shù)量

List1.Clear’清空記錄列表

On ErrorGoTo結(jié)束’循環(huán)體語句出現(xiàn)錯(cuò)誤時(shí)跳出

Do’字段數(shù)量未知,所以需要一個(gè)無限的循環(huán)

i=i+1

list1.Add Item Rs.Fields.Item(i).Name,i’將讀取到的字段名稱記錄到列表中

Loop

結(jié)束:

命令解釋:Rs.Fields.Item(i).Name讀取第i個(gè)字段名稱,當(dāng)出現(xiàn)數(shù)據(jù)讀取錯(cuò)誤時(shí),表示字段已經(jīng)讀取結(jié)束。

此時(shí):List1里存放的就是每個(gè)字段的名稱,i-1就是字段總數(shù)。

4 結(jié)束語

本文介紹了如何利用VB的ADO處理各類數(shù)據(jù)庫(kù)的故障問題,有利于提高數(shù)據(jù)庫(kù)的處理速度,以期為相關(guān)技術(shù)人員提供有價(jià)值的參考。

[1]柏建普,杜娟.ADO技術(shù)在VB訪問SQL數(shù)據(jù)庫(kù)中的應(yīng)用[J].電腦知識(shí)與技術(shù),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-),男,甘肅天水人,本科,助教,研究方向?yàn)橛?jì)算機(jī)應(yīng)用。

猜你喜歡
字段數(shù)據(jù)量控件
圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
基于大數(shù)據(jù)量的初至層析成像算法優(yōu)化
計(jì)算Lyapunov指數(shù)的模糊C均值聚類小數(shù)據(jù)量法
高刷新率不容易顯示器需求與接口標(biāo)準(zhǔn)帶寬
寬帶信號(hào)采集與大數(shù)據(jù)量傳輸系統(tǒng)設(shè)計(jì)與研究
電子制作(2019年13期)2020-01-14 03:15:18
關(guān)于.net控件數(shù)組的探討
軟件(2018年7期)2018-08-13 09:44:42
CNMARC304字段和314字段責(zé)任附注方式解析
無正題名文獻(xiàn)著錄方法評(píng)述
關(guān)于CNMARC的3--字段改革的必要性與可行性研究
就這樣玩會(huì)VBA中常見的自定義控件
電腦迷(2012年24期)2012-04-29 00:44:03
兴隆县| 桐庐县| 乡城县| 罗甸县| 上栗县| 东乌| 胶南市| 双江| 铁岭县| 理塘县| 卓资县| 宣威市| 家居| 高平市| 治县。| 开江县| 弥勒县| 肃北| 徐水县| 新乐市| 武威市| 莫力| 洛浦县| 区。| 沙坪坝区| 苍梧县| 侯马市| 惠来县| 左云县| 开远市| 漳平市| 新疆| 扶绥县| 古交市| 罗甸县| 玉环县| 麟游县| 肥城市| 古丈县| 雅安市| 蒲江县|