數(shù)據(jù)庫的建立與鏈接問題

? ? ? ? ? ? ?做完學(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)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享