




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章數(shù)據(jù)庫編程
(2017版)
廈門大學(xué)計算機科學(xué)系本科生課程《數(shù)據(jù)庫系統(tǒng)原理》
第8章數(shù)據(jù)庫編程
(2017版)廈門大學(xué)計算機科學(xué)系第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程8.4JDBC編程謝謝觀賞2019-8-28第八章數(shù)據(jù)庫編程8.1嵌入式SQL謝謝觀賞2019-8-8.1嵌入式SQLSQL語言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級語言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴充謝謝觀賞2019-8-288.1嵌入式SQLSQL語言提供了兩種不同的使用方式:謝謝8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.1嵌入式SQL的處理過程主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預(yù)編譯方法謝謝觀賞2019-8-288.1.1嵌入式SQL的處理過程主語言謝謝觀賞2019-8嵌入式SQL的處理過程(續(xù))主語言程序含ESQL語句RDBMS的預(yù)處理程序ESQL語句轉(zhuǎn)換為函數(shù)調(diào)用主語言編譯程序目標(biāo)語言程序ESQL基本處理過程謝謝觀賞2019-8-28嵌入式SQL的處理過程(續(xù))主語言程序RDBMS的ESQL嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語句>;謝謝觀賞2019-8-28嵌入式SQL的處理過程(續(xù))為了區(qū)分SQL語句與主語言語句8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負(fù)責(zé)操縱數(shù)據(jù)庫高級語言語句過程性的面向記錄的語句負(fù)責(zé)控制程序流程它們之間應(yīng)該如何通信?謝謝觀賞2019-8-288.1.2嵌入式SQL語句與主語言之間的通信將SQL嵌入到嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息使主語言能夠據(jù)此控制程序流程2.主變量主語言向SQL語句提供參數(shù)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言進(jìn)一步處理3.游標(biāo)解決集合性操作語言與過程性操作語言的不匹配謝謝觀賞2019-8-28嵌入式SQL語句與主語言之間的通信(續(xù))數(shù)據(jù)庫工作單元與源一、SQL通信區(qū)SQLCA:SQLCommunicationAreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息
描述系統(tǒng)當(dāng)前工作狀態(tài)描述運行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句謝謝觀賞2019-8-28一、SQL通信區(qū)SQLCA:SQLCommunicatiSQL通信區(qū)SQLCA使用方法:定義SQLCA
用EXECSQLINCLUDESQLCA定義使用SQLCASQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯sqlerrmc用來保留與sqlcode中的狀態(tài)碼對應(yīng)的錯誤信息文本應(yīng)用程序每執(zhí)行完一條SQL語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理備注:在C語言中,被存放在sqlca.h的SQLCA結(jié)構(gòu)體中嵌入SQL語句的C程序都必須要加入一條語句,即EXECSQLINCLUDEsqlca.h謝謝觀賞2019-8-28SQL通信區(qū)SQLCA使用方法:備注:在C語言中,被存放在s二、主變量主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為主變量(HostVariable)謝謝觀賞2019-8-28二、主變量主變量謝謝觀賞2019-8-28主變量(續(xù))主變量的類型輸入主變量輸出主變量一個主變量有可能既是輸入主變量又是輸出主變量謝謝觀賞2019-8-28主變量(續(xù))主變量的類型謝謝觀賞2019-8-28主變量(續(xù))指示變量:一個主變量可以附帶一個指示變量(IndicatorVariable)什么是指示變量一個整形變量,用來指示所指主變量的值或條件指示變量的用途謝謝觀賞2019-8-28主變量(續(xù))指示變量:謝謝觀賞2019-8-28主變量(續(xù))在SQL語句中使用主變量和指示變量的方法1)說明主變量和指示變量BEGINDECLARESECTION ......... .........(說明主變量和指示變量) .........ENDDECLARESECTION謝謝觀賞2019-8-28主變量(續(xù))在SQL語句中使用主變量和指示變量的方法謝謝觀主變量(續(xù))C語言中的主變量聲明謝謝觀賞2019-8-28主變量(續(xù))C語言中的主變量聲明謝謝觀賞2019-8-28主變量(續(xù))2)使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標(biāo)志3)使用指示變量指示變量前也必須加冒號標(biāo)志必須緊跟在所指主變量之后謝謝觀賞2019-8-28主變量(續(xù))2)使用主變量謝謝觀賞2019-8-28主變量(續(xù))在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接引用,不必加冒號謝謝觀賞2019-8-28主變量(續(xù))在SQL語句之外(主語言語句中)使用主變量和指三、游標(biāo)(cursor)為什么要使用游標(biāo)
SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式謝謝觀賞2019-8-28三、游標(biāo)(cursor)為什么要使用游標(biāo)謝謝觀賞2019-8
游標(biāo)(續(xù))游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標(biāo)區(qū)都有一個名字用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理謝謝觀賞2019-8-28游標(biāo)(續(xù))游標(biāo)謝謝觀賞2019-8-28游標(biāo)(續(xù))謝謝觀賞2019-8-28游標(biāo)(續(xù))謝謝觀賞2019-8-28四、建立和關(guān)閉數(shù)據(jù)庫連接建立數(shù)據(jù)庫連接
EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];
target是要連接的數(shù)據(jù)庫服務(wù)器關(guān)閉數(shù)據(jù)庫連接
EXECSQLDISCONNECT[connection];謝謝觀賞2019-8-28四、建立和關(guān)閉數(shù)據(jù)庫連接建立數(shù)據(jù)庫連接謝謝觀賞2019-8C語言編寫嵌入式SQL實例(1)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(1)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(2)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(2)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(3)通知謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(3)通知謝謝觀賞2019-8-2C語言編寫嵌入式SQL實例(4)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(4)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(5)謝謝觀賞2019-8-28C語言編寫嵌入式SQL實例(5)謝謝觀賞2019-8-28六、編譯運行C程序嵌入SQL的C應(yīng)用程序具體到VC++6.0、SQLServer2000下調(diào)試可分為五步:(1)環(huán)境初始化(2)預(yù)編譯(3)編譯(4)鏈接(5)運行謝謝觀賞2019-8-28六、編譯運行C程序嵌入SQL的C應(yīng)用程序具體到VC++6.0六、編譯運行C程序-1.環(huán)境初始化(1)SQLServer為其嵌入式SQL提供了一些特殊的接口;默認(rèn)的安裝方式并沒有安裝這些接口;因此,需要把devtools.rar解壓到SQLServer的系統(tǒng)目錄下;如果操作系統(tǒng)安裝在C盤,則SQLServer的系統(tǒng)目錄是:C:\ProgramFiles\MicrosoftSQLServer。
(2)初始化VisualC++6.0編譯器環(huán)境。在命令行方式下運行文件:\MicrosoftVisualStudio\VC98\Bin\vcvars32.bat。謝謝觀賞2019-8-28六、編譯運行C程序-1.環(huán)境初始化(1)SQLServer六、編譯運行C程序-1.環(huán)境初始化(3)初始化SQLServer的預(yù)編譯環(huán)境。在命令行方式下運行文件:\Devtools\samples\esplc\setenv.bat。
(4)VC++6.0環(huán)境配置。具體配置分為如下三步:
[1]Tools->options->directories->Include
Files:C:\ProgramFiles\MicrosoftSQLServer\devtools\include
[2]Tools->options->directories->Lib
Files:C:\ProgramFiles\MicrosoftSQLServer\devtools\x86lib
[3]Project->Settings->Link->Object/LibraryModules,添加庫文件:SQLakw32.lib,Caw32.lib。這兩個文件之間用空格分開。謝謝觀賞2019-8-28六、編譯運行C程序-1.環(huán)境初始化(3)初始化SQLSer六、編譯運行C程序-2.預(yù)編譯C語言編譯程序不能識別應(yīng)用程序中的SQL語句,需要經(jīng)過預(yù)處理程序?qū)⑵滢D(zhuǎn)換成C語句。SQLServer的預(yù)處理程序是nsqlprep.exe。nsqlprep.exe在SQLServer安裝目錄的MSSQL\Binn下。若SQLServer數(shù)據(jù)庫采用的是默認(rèn)安裝方式,則需要把binn.rar的內(nèi)容拷貝到指定目錄下。nsqlprep.exe的常用語法格式與相關(guān)說明見表3。謝謝觀賞2019-8-28六、編譯運行C程序-2.預(yù)編譯C語言編譯程序不能識別應(yīng)用程序六、編譯運行C程序-3.編譯、鏈接與運行在VC++6.0中創(chuàng)建一個“WIN32ConsoleApplication”類型的Project,然后將預(yù)編譯生成的c文件加入Project,編譯鏈接即可生成訪問SQLServer的可執(zhí)行程序。VisualC++6.0進(jìn)行編譯連接時需要用到動態(tài)鏈接庫SQLakw32.dll與SQLaiw32.dll;盡管這兩個文件已經(jīng)隨同binn.rar被拷貝到SQLServer安裝目錄的MSSQL\Binn文件夾下,但仍然需要把它們的路徑加到系統(tǒng)路徑變量中,以使得程序運行時能找到它們,具體添加方法如下:
方法1:把這兩個文件拷貝到操作系統(tǒng)目錄下的system32子目錄中。
方法2:“我的電腦”->“屬性”->“高級”->“環(huán)境變量”->“path,編輯”,在變量值中加入路徑值;新路徑已有路徑間用“;”間隔。謝謝觀賞2019-8-28六、編譯運行C程序-3.編譯、鏈接與運行在VC++6.0中創(chuàng)8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.3不用游標(biāo)的SQL語句不用游標(biāo)的SQL語句的種類說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句非CURRENT形式的增刪改語句謝謝觀賞2019-8-288.1.3不用游標(biāo)的SQL語句不用游標(biāo)的SQL語句的種類謝不用游標(biāo)的SQL語句(續(xù))一、查詢結(jié)果為單記錄的SELECT語句二、非CURRENT形式的增刪改語句謝謝觀賞2019-8-28不用游標(biāo)的SQL語句(續(xù))一、查詢結(jié)果為單記錄的SELECT一、查詢結(jié)果為單記錄的SELECT語句這類語句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量[例2]根據(jù)學(xué)生號碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;謝謝觀賞2019-8-28一、查詢結(jié)果為單記錄的SELECT語句這類語句不需要使用游標(biāo)查詢結(jié)果為單記錄的SELECT語句(續(xù))(1)INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3)如果查詢結(jié)果實際上并不是單條記錄,而是多條記錄,則程序出錯,RDBMS會在SQLCA中返回錯誤信息謝謝觀賞2019-8-28查詢結(jié)果為單記錄的SELECT語句(續(xù))(1)INTO子句指示變量(補充)指示變量是與宿主變量相關(guān)聯(lián)的一類SQL變量,它被用來監(jiān)督和管理與其相關(guān)聯(lián)的宿主變量,每一個宿主變量都可以定義一個指示變量。指示變量的具體作用如下:(1)
向數(shù)據(jù)庫表列輸入NULL值(2)
檢查從數(shù)據(jù)庫表列中選取的數(shù)據(jù)是否是NULL值,或是否發(fā)生截斷問題謝謝觀賞2019-8-28指示變量(補充)指示變量是與宿主變量相關(guān)聯(lián)的一類SQL變量,指示變量(補充)指示變量的值,及其代表的含義如下:0操作成功-1該指示變量對應(yīng)的宿主變量返回了或插入、更新成了NULL值-2從數(shù)據(jù)庫存放數(shù)據(jù)到對應(yīng)的宿主變量時,數(shù)據(jù)超長,并且不能推斷出截斷了多少字節(jié)的長度>0在FETHC或SELECT語句時,因數(shù)據(jù)超長而被截斷存放在了對應(yīng)的宿主變量中,指示變量存放對應(yīng)列的長度謝謝觀賞2019-8-28指示變量(補充)指示變量的值,及其代表的含義如下:謝謝觀賞2查詢結(jié)果為單記錄的SELECT語句(續(xù))[例3]查詢某個學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號賦給了主變量givensno,將課程號賦給了主變量givencno。
EXECSQLSELECTSno,Cno,GradeINTO:Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/FROMSCWHERESno=:givensnoANDCno=:givencno;
如果Gradeid<0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績?yōu)榭罩?。謝謝觀賞2019-8-28查詢結(jié)果為單記錄的SELECT語句(續(xù))[例3]查詢某個學(xué)二、非CURRENT形式的增刪改語句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量[例4]修改某個學(xué)生選修1號課程的成績。
EXECSQLUPDATESCSETGrade=:newgrade/*修改的成績已賦給主變量*/WHERESno=:givensno;/*學(xué)號賦給主變量givensno*/謝謝觀賞2019-8-28二、非CURRENT形式的增刪改語句在UPDATE的SET子非CURRENT形式的增刪改語句(續(xù))[例5]將計算機系全體學(xué)生年齡置NULL值。
Sageid=-1;
EXECSQLUPDATEStudentSETSage=:Raise:SageidWHERESdept=‘CS’;將指示變量Sageid賦一個負(fù)值后,無論主變量Raise為何值,RDBMS都會將CS系所有學(xué)生的年齡置空值。等價于:
EXECSQLUPDATEStudentSETSage=NULLWHERESdept='CS';謝謝觀賞2019-8-28非CURRENT形式的增刪改語句(續(xù))[例5]將計算機系全非CURRENT形式的增刪改語句(續(xù))[例6]某個學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。
EXECSQLDELETEFROMSCWHERESno=(SELECTSnoFROMStudentWHERESname=:stdname);謝謝觀賞2019-8-28非CURRENT形式的增刪改語句(續(xù))[例6]某個學(xué)生退學(xué)非CURRENT形式的增刪改語句(續(xù))[例7]某個學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號已賦給主變量stdno,課程號已賦給主變量couno。
gradeid=-1;/*用作指示變量,賦為負(fù)值*/ EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);
由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值謝謝觀賞2019-8-28非CURRENT形式的增刪改語句(續(xù))[例7]某個學(xué)生新選8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.4使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句謝謝觀賞2019-8-288.1.4使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL語句謝謝一、查詢結(jié)果為多條記錄的SELECT語句使用游標(biāo)的步驟1.說明游標(biāo)2.打開游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄4.關(guān)閉游標(biāo)謝謝觀賞2019-8-28一、查詢結(jié)果為多條記錄的SELECT語句使用游標(biāo)的步驟謝謝1.說明游標(biāo)使用DECLARE語句語句格式
EXECSQLDECLARE<游標(biāo)名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時DBMS并不執(zhí)行SELECT指定的查詢操作。謝謝觀賞2019-8-281.說明游標(biāo)使用DECLARE語句謝謝觀賞2019-8-22.打開游標(biāo)使用OPEN語句語句格式
EXECSQLOPEN<游標(biāo)名>;功能打開游標(biāo)實際上是執(zhí)行相應(yīng)的SELECT語句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時游標(biāo)處于活動狀態(tài),指針指向查詢結(jié)果集中第一條記錄之前謝謝觀賞2019-8-282.打開游標(biāo)使用OPEN語句謝謝觀賞2019-8-283.推進(jìn)游標(biāo)指針并取當(dāng)前記錄使用FETCH語句語句格式
EXECSQLFETCH[[NEXT|PRIOR|FIRST|LAST]FROM]<游標(biāo)名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;謝謝觀賞2019-8-283.推進(jìn)游標(biāo)指針并取當(dāng)前記錄使用FETCH語句謝謝觀賞20推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù))功能指定方向推動游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理NEXT|PRIOR|FIRST|LAST:指定推動游標(biāo)指針的方式
NEXT:向前推進(jìn)一條記錄
PRIOR:向回退一條記錄
FIRST:推向第一條記錄
LAST:推向最后一條記錄缺省值為NEXT謝謝觀賞2019-8-28推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù))功能謝謝觀賞2019-8-284.關(guān)閉游標(biāo)使用CLOSE語句語句格式
EXECSQLCLOSE<游標(biāo)名>;功能關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源說明游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系謝謝觀賞2019-8-284.關(guān)閉游標(biāo)使用CLOSE語句謝謝觀賞2019-8-28二、CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途面向集合的操作一次修改或刪除所有滿足條件的記錄謝謝觀賞2019-8-28二、CURRENT形式的UPDATE語句和DELETE語句CCURRENT形式的UPDATE語句和DELETE語句(續(xù))如果只想修改或刪除其中某個記錄用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之UPDATE語句和DELETE語句中的子句:
WHERECURRENTOF<游標(biāo)名>表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄謝謝觀賞2019-8-28CURRENT形式的UPDATE語句和DELETE語句(續(xù))CURRENT形式的UPDATE語句和DELETE語句(續(xù))不能使用CURRENT形式的UPDATE語句和DELETE語句:當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當(dāng)于定義了一個不可更新的視圖謝謝觀賞2019-8-28CURRENT形式的UPDATE語句和DELETE語句(續(xù))CURRENT形式的UPDATE語句和DELETE語句(續(xù))DECLARE
My_Cursor
CURSOR
--定義游標(biāo)FOR
(SELECT
*
FROM
dbo.MemberAccount)
--查出需要的集合放到游標(biāo)中OPEN
My_Cursor;
--打開游標(biāo)FETCH
NEXT
FROM
My_Cursor
;
--讀取第一行數(shù)據(jù)WHILE
@@FETCH_STATUS
=
0
BEGIN
--UPDATE
dbo.MemberAccount
SET
UserName
=
UserName
+
'A'
WHERE
CURRENT
OF
My_Cursor;
--更新
--DELETE
FROM
dbo.MemberAccount
WHERE
CURRENT
OF
My_Cursor;
--刪除
FETCH
NEXT
FROM
My_Cursor;
--讀取下一行數(shù)據(jù)
ENDCLOSE
My_Cursor;
--關(guān)閉游標(biāo)DEALLOCATE
My_Cursor;
--釋放游標(biāo)SQLServer當(dāng)中的實例:謝謝觀賞2019-8-28CURRENT形式的UPDATE語句和DELETE語句(續(xù))8.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.5動態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語句能夠滿足一般要求無法滿足要到執(zhí)行時才能夠確定要提交的SQL語句動態(tài)嵌入式SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式謝謝觀賞2019-8-288.1.5動態(tài)SQL靜態(tài)嵌入式SQL謝謝觀賞2019-8動態(tài)SQL簡介(續(xù))一、使用SQL語句主變量二、動態(tài)參數(shù)謝謝觀賞2019-8-28動態(tài)SQL簡介(續(xù))一、使用SQL語句主變量謝謝觀賞201一、使用SQL語句主變量SQL語句主變量:程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行謝謝觀賞2019-8-28一、使用SQL語句主變量SQL語句主變量:謝謝觀賞2019-使用SQL語句主變量(續(xù))[例9]創(chuàng)建基本表TESTEXECSQLBEGINDECLARESECTION;constchar*stmt="CREATETABLEtest(aint);";/*SQL語句主變量*/EXECSQLENDDECLARESECTION;......EXECSQLEXECUTEIMMEDIATE:stmt; /*執(zhí)行語句*/謝謝觀賞2019-8-28使用SQL語句主變量(續(xù))[例9]創(chuàng)建基本表TEST謝謝二、動態(tài)參數(shù)動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定和主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時完成綁定而是通過(prepare)語句準(zhǔn)備主變量和執(zhí)行(execute)時綁定數(shù)據(jù)或主變量來完成謝謝觀賞2019-8-28二、動態(tài)參數(shù)動態(tài)參數(shù)謝謝觀賞2019-8-28動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟:
1.聲明SQL語句主變量。
2.準(zhǔn)備SQL語句(PREPARE)。
EXECSQLPREPARE<語句名>FROM<SQL語句主變量>;
3.執(zhí)行準(zhǔn)備好的語句(EXECUTE)
EXECSQLEXECUTE<語句名>[INTO<主變量表>][USING< 主變量或常量>];
謝謝觀賞2019-8-28動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟:謝謝觀賞2019-8-28動態(tài)參數(shù)(續(xù))[例10]向TEST中插入元組。EXECSQLBEGINDECLARESECTION;constchar*stmt="INSERTINTOtestVALUES(?);";/*聲明SQL主變量*/EXECSQLENDDECLARESECTION;......EXECSQLPREPAREmystmtFROM:stmt;/*準(zhǔn)備語句*/......EXECSQLEXECUTEmystmtUSING100;/*執(zhí)行語句*/EXECSQLEXECUTEmystmtUSING200;/*執(zhí)行語句*/謝謝觀賞2019-8-28動態(tài)參數(shù)(續(xù))[例10]向TEST中插入元組。謝謝觀賞2018.1嵌入式SQL8.1.1嵌入式SQL的處理過程8.1.2嵌入式SQL語句與主語言之間的通信8.1.3不使用游標(biāo)的SQL語句8.1.4使用游標(biāo)的SQL語句8.1.5動態(tài)SQL8.1.6小結(jié)謝謝觀賞2019-8-288.1嵌入式SQL8.1.1嵌入式SQL的處理過程謝謝觀8.1.6小結(jié)在嵌入式SQL中,SQL語句與主語言語句分工非常明確
SQL語句直接與數(shù)據(jù)庫打交道,取出數(shù)據(jù)庫中的數(shù)據(jù)。主語言語句控制程序流程對取出的數(shù)據(jù)做進(jìn)一步加工處理謝謝觀賞2019-8-288.1.6小結(jié)在嵌入式SQL中,SQL語句與主語言語句分小結(jié)(續(xù))SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式謝謝觀賞2019-8-28小結(jié)(續(xù))SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程謝謝觀賞2019-8-28第八章數(shù)據(jù)庫編程8.1嵌入式SQL謝謝觀賞2019-8-8.2存儲過程SQL-invokedroutines:存儲過程(SQL-invokedprocedure)函數(shù)(SQL-invokedfunction)謝謝觀賞2019-8-288.2存儲過程SQL-invokedroutines:謝8.2存儲過程8.2.1Transact-SQL的塊結(jié)構(gòu)8.2.2變量常量的定義8.2.3控制結(jié)構(gòu)8.2.4存儲過程8.2.5小結(jié)本課程教學(xué)以SQLServer為例謝謝觀賞2019-8-288.2存儲過程8.2.1Transact-SQL的塊結(jié)8.2.1Transact-SQL的塊結(jié)構(gòu)Transact-SQL
:SQL的擴展增加了過程化語句功能基本結(jié)構(gòu)是塊塊之間可以互相嵌套每個塊完成一個邏輯操作謝謝觀賞2019-8-288.2.1Transact-SQL的塊結(jié)構(gòu)Transac8.2.1Transact-SQL的塊結(jié)構(gòu)Transact-SQL塊的基本結(jié)構(gòu):
1.定義部分
DECLARE ------變量、常量、游標(biāo)、異常等定義的變量、常量等只能在該基本塊中使用當(dāng)基本塊執(zhí)行結(jié)束時,定義就不再存在謝謝觀賞2019-8-288.2.1Transact-SQL的塊結(jié)構(gòu)Transac8.2.1Transact-SQL的塊結(jié)構(gòu)Transact-SQL的基本結(jié)構(gòu)(續(xù)):
2.執(zhí)行部分
BEGIN ------SQL語句、Transact-SQL的流程控制語句
END;謝謝觀賞2019-8-288.2.1Transact-SQL的塊結(jié)構(gòu)Transac8.2.2變量常量的定義變量的聲明:通過DECLARE語句操作初始化Transact-SQL變量,語法格式為:DECLARE@變量名稱
數(shù)據(jù)類型;注意:指定名稱,名稱的第一個字符必須為一個@指定系統(tǒng)提供的或用戶定義的數(shù)據(jù)類型和長度將值設(shè)置為NULL例如:DECLARE@MyCounterint;--聲明int型局部變量@MyCounter如果需要同時聲明多個局部變量,使用逗號隔開謝謝觀賞2019-8-288.2.2變量常量的定義變量的聲明:謝謝觀賞2019-88.2.2變量常量的定義例如:DECLARE@LastNamenvarchar(30),@FirstNamenvarchar(20),@StateProvincenchar(2);可以通過set來設(shè)置局部變量的初值。例如:set@MyCounter=0;局部變量通常用于計數(shù)器(計算循環(huán)執(zhí)行次數(shù)或者控制循環(huán)執(zhí)行次數(shù))、保存數(shù)值以供控制流語句測試、保存存儲過程返回代碼要返回的數(shù)值或者函數(shù)的返回值。謝謝觀賞2019-8-288.2.2變量常量的定義例如:謝謝觀賞2019-8-288.2.2變量常量的定義T-SQL里的全局變量以@@開頭,由系統(tǒng)維護(hù),不可以被創(chuàng)建。常見全局變量:@@ERROR:每條Transact-SQL語句執(zhí)行后,將會對@@error賦值。0代表語句執(zhí)行成功。1代表失敗。謝謝觀賞2019-8-288.2.2變量常量的定義T-SQL里的全局變量以@@開頭8.2.3控制結(jié)構(gòu)T-SQL中的流程控制語句是指用來控制程序執(zhí)行和流程分支的命令,主要用于控制SQL語句、語句塊或者存儲過程執(zhí)行流程。
幾個主要的流程控制語句:BEGIN…END語句IF…ELSE語句WHILE語句CASE語句謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)T-SQL中的流程控制語句是指用來控制8.2.3控制結(jié)構(gòu)BEGIN…END語句將多個T-SQL語句組成一個語句塊,視作一個單元處理。語法格式為:
begin
{sql_statement
|
statement_block}end
詳見:謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)BEGIN…END語句謝謝觀賞20198.2.3控制結(jié)構(gòu)IF…ELSE語句判斷語句,可以沒有ELSE字句部分,可嵌套。語法格式為:if
boolean_expression
{sql_statement
|
statement_block}
[
else
{sql_statement|statement_block}
]
詳見:IF@cost<=@comparepriceBEGIN
……ENDELSEBEGIN……END謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)IF…ELSE語句IF@cost<8.2.3控制結(jié)構(gòu)
WHILE語句用于重復(fù)執(zhí)行SQL語句,可內(nèi)嵌BREAK和CONTINUE。語法格式為:WHILEBoolean_expression{sql_statement|statement_block|BREAK|CONTINUE}詳見:
WHILE(SELECTAVG(ListPrice)FROMProduction.Product)<$300BEGIN
……END謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)
WHILE語句WHILE(SELE8.2.3控制結(jié)構(gòu)CASE語句可以計算多個條件,并將其中一個符合條件的結(jié)果表達(dá)式返回。語法格式為:CASEinput_expressionWHENwhen_expressionTHENresult_expression
[...n][ELSEelse_result_expression]END或者SearchedCASEexpression:CASE
WHENBoolean_expressionTHENresult_expression
[...n][ELSEelse_result_expression]END詳見:CASE應(yīng)用例子:
謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)CASE語句謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)CASE語句實例謝謝觀賞2019-8-288.2.3控制結(jié)構(gòu)CASE語句實例謝謝觀賞2019-8-8.2存儲過程8.2.1Transact-SQL的塊結(jié)構(gòu)8.2.2變量常量的定義8.2.3控制結(jié)構(gòu)8.2.4存儲過程8.2.5小結(jié)謝謝觀賞2019-8-288.2存儲過程8.2.1Transact-SQL的塊結(jié)8.2.4存儲過程Transact-SQL塊類型:命名塊:編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運行速度較快。存儲過程和函數(shù)是命名塊匿名塊:每次執(zhí)行時都要進(jìn)行編譯,它不能被存儲到數(shù)據(jù)庫中,也不能在其他的Transact-SQL塊中調(diào)用謝謝觀賞2019-8-288.2.4存儲過程Transact-SQL塊類型:謝謝觀存儲過程(續(xù))一、存儲過程的優(yōu)點二、存儲過程的用戶接口三、游標(biāo)謝謝觀賞2019-8-28存儲過程(續(xù))一、存儲過程的優(yōu)點謝謝觀賞2019-8-2存儲過程(續(xù))存儲過程:由Transact-SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,使用時只要調(diào)用即可一、存儲過程的優(yōu)點:
1.運行效率高
2.降低了客戶機和服務(wù)器之間的通信量
3.方便實施企業(yè)規(guī)則謝謝觀賞2019-8-28存儲過程(續(xù))存儲過程:由Transact-SQL語句書寫的存儲過程(續(xù))二、存儲過程的用戶接口:
1.創(chuàng)建存儲過程
2.執(zhí)行存儲過程
3.刪除存儲過程謝謝觀賞2019-8-28存儲過程(續(xù))二、存儲過程的用戶接口:謝謝觀賞2019-8存儲過程(續(xù))CREATEPROCEDUREsp_Select_All_EmployeesASSELECTemployeeid,firstname,lastnameFROMEmployeesORDERBYlastname,firstname創(chuàng)建存儲過程謝謝觀賞2019-8-28存儲過程(續(xù))CREATEPROCEDUREsp_Sel存儲過程(續(xù))CREATEPROCEDUREsp_Orders_By_EmployeeId@employeeidintASSELECTorderid,customeridFROMordersWHEREemployeeid=@employeeid
/*
其中@employeeid為輸入?yún)?shù),且后面為該參數(shù)類型*/創(chuàng)建一個帶參數(shù)的存儲過程謝謝觀賞2019-8-28存儲過程(續(xù))CREATEPROCEDUREsp_Ord存儲過程(續(xù))CREATEPROCEDUREsp_Orders_By_EmployeeId2@employeeidint,@ordercountint=0outputASSELECTorderid,customeridFROMordersWHEREemployeeid=@employeeid;SELECT@ordercount=count(*)FROMordersWHEREemployeeid=@employeeidreturn@ordercount創(chuàng)建一個傳入?yún)?shù)、返回值和輸出參數(shù)的存儲過程謝謝觀賞2019-8-28存儲過程(續(xù))CREATEPROCEDUREsp_Ord存儲過程(續(xù))修改存儲過程ALTERPROCEDURE--存儲程序名稱
--改變的參數(shù)AS--改變后的T-SQL語句查看存儲過程executesp_helptext--存儲過程名稱重命名存儲過程EXECUTEsp_rename--需要改的存儲過程名稱--改后的存儲過程名稱調(diào)用存儲過程EXECUTEsp_Orders_By_EmployeeId22@value謝謝觀賞2019-8-28存儲過程(續(xù))修改存儲過程謝謝觀賞2019-8-28三、游標(biāo)在Transact-SQL中,如果SELECT語句只返回一條記錄,可以將該結(jié)果存放到變量中。當(dāng)查詢返回多條記錄時,就要使用游標(biāo)對結(jié)果集進(jìn)行處理一個游標(biāo)與一個SQL語句相關(guān)聯(lián)。Transact-SQL中的游標(biāo)由Transact-SQL引擎管理謝謝觀賞2019-8-28三、游標(biāo)在Transact-SQL中,如果SELECT語Transact-SQL游標(biāo)的概念游標(biāo)(Cursor)使用戶可逐行訪問由SQLServer返回的結(jié)果集使用游標(biāo)的一個主要的原因就是把集合操作轉(zhuǎn)換成單個記錄處理方式用SQL語言從數(shù)據(jù)庫中檢索數(shù)據(jù)后,結(jié)果放在內(nèi)存的一塊區(qū)域中,且結(jié)果往往是一個含有多個記錄的集合游標(biāo)機制允許用戶在SQLServer內(nèi)逐行地訪問這些記錄,按照用戶自己的意愿來顯示和處理這些記錄謝謝觀賞2019-8-28Transact-SQL游標(biāo)的概念游標(biāo)(Cursor)使用戶游標(biāo)的優(yōu)點允許程序?qū)τ刹樵冋Z句select返回的行集合中的每一行執(zhí)行相同或不同的操作,而不是對整個行集合執(zhí)行同一個操作提供對基于游標(biāo)位置的表中的行進(jìn)行刪除和更新的能力
游標(biāo)實際上作為面向集合的數(shù)據(jù)庫管理系統(tǒng)(RDBMS)和面向行的程序設(shè)計之間的橋梁,使這兩種處理方式通過游標(biāo)溝通起來謝謝觀賞2019-8-28游標(biāo)的優(yōu)點允許程序?qū)τ刹樵冋Z句select返回的行集合中的每游標(biāo)的使用使用游標(biāo)的順序聲名游標(biāo)打開游標(biāo)讀取數(shù)據(jù)關(guān)閉游標(biāo)刪除游標(biāo)謝謝觀賞2019-8-28游標(biāo)的使用使用游標(biāo)的順序謝謝觀賞2019-8-28聲明游標(biāo)最簡單游標(biāo)聲明:DECLARE<游標(biāo)名>CURSORFOR<SQL語句>;
其中,select語句可以是簡單查詢,也可以是復(fù)雜的接連查詢和嵌套查詢
例子:
declarecursor_stucursorforselect*fromStudent
這樣就對表Student表聲明了一個游標(biāo)cursor_stu謝謝觀賞2019-8-28聲明游標(biāo)最簡單游標(biāo)聲明:謝謝觀賞2019-8-28打開游標(biāo)語法格式:OPEN<游標(biāo)名>OPENcursor_stu謝謝觀賞2019-8-28打開游標(biāo)語法格式:OPEN<游標(biāo)名>謝謝觀賞2019-8-讀取數(shù)據(jù)FETCH[NEXT|PRIOR|FIRST|LAST]FROM{游標(biāo)名
|@游標(biāo)變量名}[INTO@變量名[,…]]
參數(shù)說明:NEXT
取下一行的數(shù)據(jù),并把下一行作為當(dāng)前行(遞增)。由于打開游標(biāo)后,行指針是指向該游標(biāo)第1行之前,所以第一次執(zhí)行FETCHNEXT操作將取得游標(biāo)集中的第1行數(shù)據(jù)。NEXT為默認(rèn)的游標(biāo)提取選項INTO@變量名[,…]
把提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個變量從左到右與游標(biāo)結(jié)果集中的相應(yīng)列相關(guān)聯(lián)。各變量的數(shù)據(jù)類型必須與相應(yīng)的結(jié)果列的數(shù)據(jù)類型匹配或是結(jié)果列數(shù)據(jù)類型所支持的隱性轉(zhuǎn)換。變量的數(shù)目必須與游標(biāo)選擇列表中的列的數(shù)目一致
謝謝觀賞2019-8-28讀取數(shù)據(jù)FETCH[NEXT|PRIOR讀取數(shù)據(jù)當(dāng)游標(biāo)被打開時,行指針將指向該游標(biāo)集第1行之前,如果要讀取游標(biāo)集中的第1行數(shù)據(jù),必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數(shù)據(jù):Fetchnextfromcursor_stu
或Fetchfirstfromcursor_stu謝謝觀賞2019-8-28讀取數(shù)據(jù)當(dāng)游標(biāo)被打開時,行指針將指向該游標(biāo)集第1行之前,如果讀取數(shù)據(jù)這樣就取出了游標(biāo)里的數(shù)據(jù),還需要將取出的數(shù)據(jù)賦給變量
//聲明2個變量
declare@snoNVARCHAR(5)
declare@snamechar(8)
//將取出的值傳入剛才聲明的2個變量
Fetchnextfromcursor_stuinto@sno,@sname謝謝觀賞2019-8-28讀取數(shù)據(jù)這樣就取出了游標(biāo)里的數(shù)據(jù),還需要將取出的數(shù)據(jù)賦給變量關(guān)閉游標(biāo)和刪除游標(biāo)CLOSE<游標(biāo)名>實例:closecursor_stuDEALLOCATE<游標(biāo)名>實例:deallocatecursor_stu謝謝觀賞2019-8-28關(guān)閉游標(biāo)和刪除游標(biāo)CLOSE<游標(biāo)名>謝謝觀賞2019-8實例為了運行創(chuàng)建的游標(biāo),可以將游標(biāo)寫在存儲過程里,方便我們看到游標(biāo)的整個使用過程,在sqlserver2008中新建一個存儲過程:---在存儲過程中使用游標(biāo)---createprocedurecursor_testas---聲明兩個變量declare@snoVARCHAR(5)declare@snamechar(8)---聲明一個游標(biāo)declarecursor_stucursorforselectsno,snamefromStudent---打開游標(biāo)OPENcursor_stu--從游標(biāo)里取出數(shù)據(jù)賦值到我們剛才聲明的2個變量中Fetchnextfromcursor_stuinto@sno,@sname--后面代碼見下一頁PPT謝謝觀賞2019-8-28實例為了運行創(chuàng)建的游標(biāo),可以將游標(biāo)寫在存儲過程里,方便我們看實例--續(xù)上一頁PPT--判斷游標(biāo)的狀態(tài)--0fetch語句成功---1fetch語句失敗或此行不在結(jié)果集中---2被提取的行不存在while(@@fetch_status=0)begin--顯示出我們每次用游標(biāo)取出的值
print'游標(biāo)成功取出一條數(shù)據(jù)'print@snoprint@sname
--用游標(biāo)去取下一條記錄
fetchnextfromcursor_stuinto@sno,@snameend--關(guān)閉游標(biāo)closecursor_studeallocatecursor_stu謝謝觀賞2019-8-28實例--續(xù)上一頁PPT謝謝觀賞2019-8-288.2存儲過程8.2.1Transact-SQL的塊結(jié)構(gòu)8.2.2變量常量的定義8.2.3控制結(jié)構(gòu)8.2.4存儲過程8.2.5小結(jié)謝謝觀賞2019-8-288.2存儲過程8.2.1Transact-SQL的塊結(jié)構(gòu)8.2.5小結(jié)存儲過程的優(yōu)點經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,運行效率高降低客戶機和服務(wù)器之間的通信量有利于集中控制,方便維護(hù)謝謝觀賞2019-8-288.2.5小結(jié)存儲過程的優(yōu)點謝謝觀賞2019-8-28第八章數(shù)據(jù)庫編程8.1嵌入式SQL8.2存儲過程8.3ODBC編程謝謝觀賞2019-8-28第八章數(shù)據(jù)庫編程8.1嵌入式SQL謝謝觀賞2019-8-8.3ODBC編程ODBC優(yōu)點:移植性好能同時訪問不同的數(shù)據(jù)庫共享多個數(shù)據(jù)資源謝謝觀賞2019-8-288.3ODBC編程ODBC優(yōu)點:謝謝觀賞2019-8-288.3ODBC編程8.3.1數(shù)據(jù)庫互連概述8.3.2ODBC工作原理概述8.3.3ODBCAPI基礎(chǔ)8.3.4ODBC的工作流程8.3.5小結(jié)謝謝觀賞2019-8-288.3ODBC編程8.3.1數(shù)據(jù)庫互連概述謝謝觀賞208.3.1數(shù)據(jù)庫互連概述ODBC產(chǎn)生的原因:由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個RDBMS下編寫的應(yīng)用程序就不能在另一個RDBMS下運行許多應(yīng)用程序需要共享多個部門的數(shù)據(jù)資源,訪問不同的RDBMS謝謝觀賞2019-8-288.3.1數(shù)據(jù)庫互連概述ODBC產(chǎn)生的原因:謝謝觀賞20數(shù)據(jù)庫互連概述(續(xù))ODBC:是微軟公司開放服務(wù)體系(WindowsOpenServicesArchitecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個組成部分提供了一組訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)APIODBC約束力:規(guī)范應(yīng)用開發(fā)規(guī)范RDBMS應(yīng)用接口謝謝觀賞2019-8-28數(shù)據(jù)庫互連概述(續(xù))ODBC:謝謝觀賞2019-8-288.3ODBC編程8.3.1數(shù)據(jù)庫互連概述8.3.2ODBC工作原理概述
8.3.3小結(jié)謝謝觀賞2019-8-288.3ODBC編程8.3.1數(shù)據(jù)庫互連概述謝謝觀賞208.3.2ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu):一、用戶應(yīng)用程序二、驅(qū)動程序管理器三、數(shù)據(jù)庫驅(qū)動程序四、ODBC數(shù)據(jù)源管理謝謝觀賞2019-8-288.3.2ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu)一、應(yīng)用程序ODBC應(yīng)用程序包括的內(nèi)容:
請求連接數(shù)據(jù)庫;向數(shù)據(jù)源發(fā)送SQL語句;為SQL語句執(zhí)行結(jié)果分配存儲空間,定義所讀取的數(shù)據(jù)格式;獲取數(shù)據(jù)庫操作結(jié)果,或處理錯誤;進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請求事務(wù)的提交和回滾操作;斷開與數(shù)據(jù)源的連接。
謝謝觀賞2019-8-28一、應(yīng)用程序ODBC應(yīng)用程序包括的內(nèi)容:謝謝觀賞2019二、驅(qū)動程序管理器驅(qū)動程序管理器:用來管理各種驅(qū)動程序包含在ODBC32.DLL中管理應(yīng)用程序和驅(qū)動程序之間的通信建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序主要功能:裝載ODBC驅(qū)動程序選擇和連接正確的驅(qū)動程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等謝謝觀賞2019-8-28二、驅(qū)動程序管理器驅(qū)動程序管理器:用來管理各種驅(qū)動程序謝三、數(shù)據(jù)庫驅(qū)動程序ODBC通過驅(qū)動程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性O(shè)DBC應(yīng)用程序不能直接存取數(shù)據(jù)庫其各種操作請求由驅(qū)動程序管理器提交給某個RDBMS的ODBC驅(qū)動程序通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫。數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應(yīng)用程序。如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接到不同的驅(qū)動程序上。
謝謝觀賞2019-8-28三、數(shù)據(jù)庫驅(qū)動程序ODBC通過驅(qū)動程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫數(shù)據(jù)庫驅(qū)動程序(續(xù))ODBC驅(qū)動程序類型:單束數(shù)據(jù)源和應(yīng)用程序在同一臺機器上驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作驅(qū)動程序相當(dāng)于數(shù)據(jù)管理器多束
支持客戶機/服務(wù)器、客戶機/應(yīng)用服務(wù)器/數(shù)據(jù)庫服務(wù)器等網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問由驅(qū)動程序完成數(shù)據(jù)庫訪問請求的提交和結(jié)果集接收應(yīng)用程序使用驅(qū)動程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù)
謝謝觀賞2019-8-28數(shù)據(jù)庫驅(qū)動程序(續(xù))ODBC驅(qū)動程序類型:謝謝觀賞2019-8.3.3小結(jié)ODBC目的:為了提高應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性,使得應(yīng)用系統(tǒng)的移植變得容易ODBC優(yōu)點:使得應(yīng)用系統(tǒng)的開發(fā)與數(shù)據(jù)庫平臺的選擇、數(shù)據(jù)庫設(shè)計等工作并行進(jìn)行方便移植大大縮短整個系統(tǒng)的開發(fā)時間謝謝觀賞2019-8-288.3.3小結(jié)ODBC目的:為了提高應(yīng)用系統(tǒng)與數(shù)據(jù)庫平8.4JDBC編程Eclipse連接SQLServer2008數(shù)據(jù)庫JDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序謝謝觀賞2019-8-288.4JDBC編程Eclipse連接SQLServerEclipse連接SQLServer2008數(shù)據(jù)庫一、開啟SQLServer身份驗證模式在連接數(shù)據(jù)庫之前必須保證SQL
Server
2008是采用SQL
Server身份驗證方式而不是windows身份驗證方式。SQLServer2008裝好后,默認(rèn)協(xié)議是沒有開啟的,可打開配置工具下的SQLServer配置管理器中開啟;謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫一、開Eclipse連接SQLServer2008數(shù)據(jù)庫補充:設(shè)置SQL
Server
2008的身份驗證方式謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫補充:Eclipse連接SQLServer2008數(shù)據(jù)庫補充:設(shè)置SQL
Server
2008的身份驗證方式設(shè)置sa的密碼并啟用sa登錄名謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫補充:Eclipse連接SQLServer2008數(shù)據(jù)庫補充:設(shè)置SQL
Server
2008的身份驗證方式謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫補充:Eclipse連接SQLServer2008數(shù)據(jù)庫驗證sa登錄在桌面上新建一個文本文件,文件名為TestSQL.UDL,雙擊這個文件打開“數(shù)據(jù)鏈接屬性”對話框,點擊“提供程序”選項卡,如右圖:補充:設(shè)置SQL
Server
2008的身份驗證方式謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫驗證sEclipse連接SQLServer2008數(shù)據(jù)庫點擊“下一步”按鈕進(jìn)入“高級”選項卡,輸入數(shù)據(jù)源為:local,即我們安裝的SQL
Server
2008實例,并選擇“使用指定的用戶名稱和密碼”,輸入登錄名sa和sa的密碼,最后,我們點擊“測試連接”按鈕,測試sa登錄??梢钥吹竭B接成功!為了下一次使用方便,勾選“允許保存密碼”,最后,點擊“確定”按鈕保存這個數(shù)據(jù)鏈接。謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫點擊“Eclipse連接SQLServer2008數(shù)據(jù)庫謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫謝謝觀Eclipse連接SQLServer2008數(shù)據(jù)庫二、SQL
Server
2008的配置必須保證SQL
Server
2008是采用SQL
Server身份驗證方式下開始配置1、安裝好SQL
Server
2008后,運行
開始
→
所有程序
→
Microsoft
SQL
Server
2008
→
配置工具
→
SQL
Server配置管理器,在打開的窗口的左邊找到
MSSQLSERVER的協(xié)議,在右邊右單擊
TCP/IP,選擇
已啟用。如果Named
Pipes
未啟用也設(shè)為啟用。謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫二、SEclipse連接SQLServer2008數(shù)據(jù)庫圖1謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫圖1謝Eclipse連接SQLServer2008數(shù)據(jù)庫圖2謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫圖2謝Eclipse連接SQLServer2008數(shù)據(jù)庫2、雙擊圖2右邊的
TCP/IP,在彈出的窗口中選擇
IP地址
標(biāo)簽,把
IPAll
中的
TCP端口
設(shè)成
1433,并將上方所有的
已啟用
選項設(shè)置成
是。如圖3所示:圖3謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫2、雙Eclipse連接SQLServer2008數(shù)據(jù)庫3、然后重啟數(shù)據(jù)庫,重啟完畢后,接下來使用命令測試1433端口是否打開。開始菜單
→
運行cmd
→
在命令提示符下輸入:telnet
1433,(注意telnet與127之間有空格,1與1433之間有空格)若提示“不能打開到主機的連接,在端口
1433:
連接失敗”,則說明1433端口沒有打開,需要重新進(jìn)行以上配置。若連接成功,顯示如圖4所示:謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫3、然Eclipse連接SQLServer2008數(shù)據(jù)庫圖4謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫圖4謝Eclipse連接SQLServer2008數(shù)據(jù)庫補充:如何設(shè)置開啟win7中的telnet服務(wù)打開控制面板在控制面板中選擇“程序”項,打開程序設(shè)置頁面選擇“打開或關(guān)閉windows功能”項,打開window功能設(shè)置窗口將其中的“telnet服務(wù)器”、“telnet客戶端”前面打上勾。默認(rèn)是沒有打上勾的,所以打上勾后,點擊“確定”完成開啟謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫補充:Eclipse連接SQLServer2008數(shù)據(jù)庫三、環(huán)境變量CLASSPATH配置1、下載Microsoft
JDBC
Driver
for
SQL
Server可以網(wǎng)絡(luò)搜索找到最新版本驅(qū)動下載JDBC的驅(qū)動文件,例如下載得到的文件是sqljdbc_6.0.8112.100_chs.exe,解壓文件。假設(shè)將其解壓到C:\Microsoft
JDBC
Driver
6.0
for
SQL
Server目錄下。謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫三、環(huán)Eclipse連接SQLServer2008數(shù)據(jù)庫2、在桌面上右擊
我的電腦(見圖5),依次選擇
屬性
→
高級
→
環(huán)境變量,在
系統(tǒng)變量中雙擊
CLASSPATH變量,追加“;C:\SQLServer2008JDBCDriver\sqljdbc_6.0\chs\jre8\sqljdbc42.jar”若不存在,應(yīng)當(dāng)新建CLASSPATH變量,并且將其值設(shè)為“C:\SQLServer2008JDBCDriver\sqljdbc_6.0\chs\jre8\sqljdbc42.jar”謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫2、在Eclipse連接SQLServer2008數(shù)據(jù)庫圖5謝謝觀賞2019-8-28Eclipse連接SQLServer2008數(shù)據(jù)庫圖5謝Eclipse連接SQLServer2008數(shù)據(jù)庫三、使用Eclipse測試連接SQL
Server
2008數(shù)據(jù)庫1、打開SQL
Server
2008,在其中新建數(shù)據(jù)庫
Test,然后退出SQL
Server
20082、運行Eclipse,新建一個Java
Project
名為
Test3、右單擊工程名,依次選擇
Build
Path
→
Configure
Build
Path,在打開的窗口的右邊選擇
Libraries標(biāo)簽,然后單擊
Add
External
JARs,找到
sqljdbc42.jar
文件并打開,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年貴州農(nóng)業(yè)職業(yè)學(xué)院單招職業(yè)傾向性測試題庫帶答案
- 2025年度綠化項目管理與勞務(wù)派遣合同
- 2025年度教育機構(gòu)分紅合作協(xié)議范本(含師資培訓(xùn))
- 2025年度房地產(chǎn)企業(yè)勞動合同管理制度與購房合同附件
- 2025年度出國工人勞務(wù)合同(含緊急救援與安全應(yīng)急)
- 2025年度城市綜合體開發(fā)項目多人合伙股東合作協(xié)議
- 2025年度健康醫(yī)療副總經(jīng)理聘用與市場拓展合同
- 2025年度員工向公司借款額度限制合同
- 2025年度住宅小區(qū)施工圍擋安裝及安全管理合同
- 2023-2024學(xué)年廣東省珠海市香洲區(qū)第二中學(xué)高三下學(xué)期三模生物試卷
- 水泥攪拌樁記錄表格范本
- DL∕T 458-2020 板框式旋轉(zhuǎn)濾網(wǎng)
- GB∕T 8163-2018 輸送流體用無縫鋼管
- Windows Azure云平臺基本操作手冊
- 短視頻:策劃制作與運營課件
- T∕ASC 17-2021 電動汽車充換電設(shè)施系統(tǒng)設(shè)計標(biāo)準(zhǔn)
- 水閘設(shè)計步驟計算書(多表)
- PowerPoint使用技巧培訓(xùn)課件(共35張)
- SMA瀝青路面的設(shè)計與施工
- 腎內(nèi)科相關(guān)基礎(chǔ)知識學(xué)習(xí)教案
- (完整版)Frenchay構(gòu)音障礙評定
評論
0/150
提交評論