? ? ? ? ? ? ?做完學(xué)生管理系統(tǒng),經(jīng)過師傅的驗(yàn)收,發(fā)現(xiàn)對(duì)最初的概念了解相當(dāng)不深刻!又反過頭對(duì)5實(shí)例簡單看了一下,老師常說,學(xué)習(xí)最重要的是反復(fù),通過這次觀看,重新對(duì)基本概念有所了解。
首先看幾個(gè)專業(yè)名詞:ADO—activex data object動(dòng)態(tài)數(shù)據(jù)對(duì)象通過OLE DB(object linking and embed中文:對(duì)象連接與嵌入,是底端程序接口)實(shí)現(xiàn)對(duì)不同數(shù)據(jù)的訪問。
當(dāng)時(shí)師傅問我關(guān)于ADO的對(duì)象時(shí),一下子懵了,原來我們?cè)诮?a href="http://m.babyishan.com/tag/%e6%95%b0%e6%8d%ae%e5%ba%93">數(shù)據(jù)庫定義的connection,recordset等都是ado 的對(duì)象,它共有7個(gè)對(duì)象,在這次的學(xué)生信息管理系統(tǒng)中最常見的就是上面那倆,3個(gè)獨(dú)立對(duì)象:recordset,connection,command!還有4個(gè)附屬對(duì)象:field,parameter,property,error
OLE DB由3個(gè)部分組成:數(shù)據(jù)提供者,數(shù)據(jù)消費(fèi)者,服務(wù)組件。數(shù)據(jù)提供者是類似于SQL Serser,ODBC提供數(shù)據(jù)的程序,VB創(chuàng)建的程序就是一種典型的數(shù)據(jù)消費(fèi)者,它是利用數(shù)據(jù)提供者提供的數(shù)據(jù)創(chuàng)建的數(shù)據(jù)應(yīng)用程序。服務(wù)組件負(fù)責(zé)連接數(shù)據(jù)提供者與數(shù)據(jù)消費(fèi)者。
五實(shí)例當(dāng)中應(yīng)用了vb外界程序的可視化管理器建立的micrsoft access數(shù)據(jù)庫(其文件后綴名為.mdb),而學(xué)生信息管理系統(tǒng)的數(shù)據(jù)庫是利用SQL Sever創(chuàng)建的(后綴名為.sql),數(shù)據(jù)庫類的應(yīng)用程序第一步是建立數(shù)據(jù)庫!第二步,建立ADO引用,在vb程序里直接點(diǎn)擊工程下的引用選擇microsoft activex data objects 2.6 library即可!第三步,用代碼建立連接。下面讓我們看一下數(shù)據(jù)庫的不同連接方式對(duì)比:
1.直接連接access數(shù)據(jù)庫
dim?Objcn?as?new?connection,objRs?as?new?recordset objcn.connectionstring="Prvider=Microsoft.jet.OLEDB.3.5.1;"?&?_ "data?sourse=數(shù)據(jù)遠(yuǎn)文件路徑"?????????'連接數(shù)據(jù)提供者與數(shù)據(jù)源 objcn.open ???????strSQL=“select?……from?……?where……” set?objrs.activeconnection=objcn???'將數(shù)據(jù)庫記錄集與數(shù)據(jù)源相匹配 objrs.open(strSQL)??????'記錄集打開 ???????.???????????????????????‘進(jìn)行數(shù)據(jù)庫的增刪改查操作 objcn.close?????????‘關(guān)閉數(shù)據(jù)庫 set?objrs=Nothing set?objcn=Nothing
2.?利用ODBC連接access數(shù)據(jù)庫,ODBC有3種數(shù)據(jù)源連接方式,分別為用戶DNS,系統(tǒng)DNS,文件DNS,學(xué)生信息管理系統(tǒng)利用的正是文件DNS的添加。
set?objcn=new?connection objcn.open="dsn=數(shù)據(jù)庫文件名" set?objrs=new?recordset ????????????????. objcn.close set?objrs=nothing set?objcn=nothing
3.利用ado data控件創(chuàng)建數(shù)據(jù)庫連接,這種方法相對(duì)簡單,只要從控件屬性里面進(jìn)行連接即可。
看完了5實(shí)例的連接方法,解析一下對(duì)學(xué)生管理系統(tǒng)連接于登陸時(shí)的代碼:
1.在登陸窗體中,為走向?qū)I(yè)化,往往數(shù)據(jù)庫的登錄名設(shè)置為系統(tǒng)用戶名,所以在登陸窗體的用戶名部分自動(dòng)獲得系統(tǒng)用戶,在開頭部分調(diào)用API函數(shù):
Private?Declare?Function?GetUsername?Lib?"advapi32.dll"?Alias?"GetUserNameA"?(ByVal?lpBuffer?As?String,?nSize?As?Long)?As?Long
窗體加載部分獲得系統(tǒng)用戶名:
Private?Sub?Form_Load() ????Dim?sbuffer?As?String ????Dim?lsize?As?Long ???? ????sbuffer?=?Space$(255)??'因無法確定系統(tǒng)用戶名的長度,先開辟一個(gè)255(最大值)空格字符控件 ????lsize?=?Len(sbuffer)???'lsize盛放sbuffer字符串的真是長度 ????Call?GetUsername(sbuffer,?lsize)? ????'api中字符串作函數(shù),需要提前確定大小 ???? ????If?lsize?>?0?Then ????????txtusername.Text?=?Left$(sbuffer,?lsize) ????Else ????????txtusername.Text?=?vbNullString ????????'沒有字符串 ????End?If ???? ????ok?=?False ????micount?=?0??’用于登陸次數(shù)的標(biāo)記 ?End?Sub
2.在確認(rèn)按鈕中建立連接:
Private?Sub?cmdOK_Click() ????Dim?txtSQL?As?String ????Dim?mrc?As?ADODB.Recordset?'用于保存數(shù)據(jù)源記錄集 ????Dim?MsgText?As?String ???? ????UserName?=?""?????'先將登錄名滯空 ????If?Trim(txtusername.Text?=?"")?Then?????'確認(rèn)用戶名輸入框不為空 ????????MsgBox?"沒有這個(gè)用戶,請(qǐng)重新輸入用戶",?vbOKOnly?+?vbExclamation,?"警告" ????????txtusername.SetFocus ????Else ????????txtSQL?=?"select?*?from?user_info?where?user_id?='"?&?txtusername.Text?&?"'" ????????Set?mrc?=?ExecuteSQL(txtSQL,?MsgText)????' ?調(diào)用模塊當(dāng)中的executesql函數(shù) 建立數(shù)據(jù)庫連接 ????????If?mrc.EOF?Then ????????????MsgBox?"沒有這個(gè)用 戶,請(qǐng)重新輸入用戶",?vbOKOnly?+?vbExclamation,?"警告" ????????????txtusername.SetFocus ????????Else????????????????????????????????????'確認(rèn)密碼 ????????????If?Trim(mrc.Fields(1))?=?Trim(txtpassword.Text)?Then ????????????????ok?=?True ????????????????mrc.Close ????????????????Me.Hide ????????????????UserName?=?Trim(txtusername.Text) ????????????????frmmain.Show ????????????Else ????????????????MsgBox?"輸入密碼不正確,請(qǐng)重新輸入!",?vbOKOnly?+?vbExclamation,?"警告" ????????????????txtpassword.SetFocus ????????????????txtpassword.Text?=?"" ????????????End?If ????????End?If ????End?If ???? ????micount?=?micount?+?1??????????'值允許3次輸入 ????If?micount?=?3?Then ????????Me.Hide ????End?If ????Exit?Sub ???? End?Sub
3.理解一下執(zhí)行函數(shù)excutesql函數(shù)的連接方式。
Public?Function?ConnectString()?As?String ????ConnectString?=?"FileDSN=student.dsn;UID=sa;PWD=123"?'文件源,登錄名,驗(yàn)證密碼 End?Function Public?Function?ExecuteSQL(ByVal?SQL?As?String,?MsgString?As?String)?As?ADODB.Recordset ???Dim?cnn?As?ADODB.Connection ???Dim?rst?As?ADODB.Recordset ???Dim?sTokens()?As?String ??? ???'On?Error?GoTo?ExecuteSQL_Error ??? ???sTokens?=?Split(SQL)?'該函數(shù)定義將sql語句中的詞以空格為分解符分解開放進(jìn)一個(gè)數(shù)組里 ???Set?cnn?=?New?ADODB.Connection?'實(shí)體化,連接數(shù)據(jù)源 ???cnn.Open?ConnectString?????'打開數(shù)據(jù)源 ??? ???If?InStr("INSERT,DELETE,UPDATE",?UCase$(sTokens(0)))?Then???????'比較確定sql數(shù)據(jù)開始單詞是否為增,刪,改 ??????cnn.Execute?SQL???'執(zhí)行SQL語句 ??????MsgString?=?sTokens(0)?&?"?query?successful" ??????'雖然MsgString不是返回值,但傳遞方式是ByRef,實(shí)參地址和這個(gè)地址相同 ???Else ??????Set?rst?=?New?ADODB.Recordset????'實(shí)例化記錄集 ??????rst.Open?Trim$(SQL),?cnn,?adOpenKeyset,?adLockOptimistic???'打開要執(zhí)行的內(nèi)容sql,連接數(shù)據(jù)源,游標(biāo)類型:鍵集游標(biāo),窗口值固定大小 ??????'得到臨時(shí)表,游標(biāo)指向第一條記錄 ??????'get?RecordCount, ??????Set?ExecuteSQL?=?rst ??????MsgString?=?"查詢到"?&?rst.RecordCount?&?_ ?????????"?條記錄?" ???End?If ??? ExecuteSQL_Exit:??‘關(guān)閉連接 ???Set?rst?=?Nothing ???Set?cnn?=?Nothing ???Exit?Function ??? ExecuteSQL_Error: ???MsgString?=?"查詢錯(cuò)誤:?"?&?_ ??????Err.Description ???Resume?ExecuteSQL_Exit End?Function
總結(jié)來說,建立連接分三步走戰(zhàn)略:打開–執(zhí)行(增刪改查)–關(guān)閉
?以上就是數(shù)據(jù)庫的建立與鏈接問題的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!