《數(shù)據(jù)庫(kù)系統(tǒng)原理》第8章 數(shù)據(jù)庫(kù)編程學(xué)習(xí)培訓(xùn)課件_第1頁(yè)
《數(shù)據(jù)庫(kù)系統(tǒng)原理》第8章 數(shù)據(jù)庫(kù)編程學(xué)習(xí)培訓(xùn)課件_第2頁(yè)
《數(shù)據(jù)庫(kù)系統(tǒng)原理》第8章 數(shù)據(jù)庫(kù)編程學(xué)習(xí)培訓(xùn)課件_第3頁(yè)
《數(shù)據(jù)庫(kù)系統(tǒng)原理》第8章 數(shù)據(jù)庫(kù)編程學(xué)習(xí)培訓(xùn)課件_第4頁(yè)
《數(shù)據(jù)庫(kù)系統(tǒng)原理》第8章 數(shù)據(jù)庫(kù)編程學(xué)習(xí)培訓(xùn)課件_第5頁(yè)
已閱讀5頁(yè),還剩137頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、廈門大學(xué)計(jì)算機(jī)科學(xué)系 2017版第8章 數(shù)據(jù)庫(kù)編程(2017版) 廈門大學(xué)計(jì)算機(jī)科學(xué)系本科生課程數(shù)據(jù)庫(kù)系統(tǒng)原理第八章 數(shù)據(jù)庫(kù)編程8.1 嵌入式SQL8.2 存儲(chǔ)過(guò)程8.3 ODBC編程8.4 JDBC編程8.1 嵌入式SQLSQL語(yǔ)言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語(yǔ)言是非過(guò)程性語(yǔ)言事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語(yǔ)句要做某些必要的擴(kuò)充8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)S

2、QL8.1.6 小結(jié)8.1.1 嵌入式SQL的處理過(guò)程主語(yǔ)言嵌入式SQL是將SQL語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入的程序設(shè)計(jì)語(yǔ)言,如C、C+、Java,稱為宿主語(yǔ)言,簡(jiǎn)稱主語(yǔ)言。處理過(guò)程預(yù)編譯方法嵌入式SQL的處理過(guò)程(續(xù)) 主語(yǔ)言程序 含ESQL語(yǔ)句RDBMS的預(yù)處理程序ESQL語(yǔ)句轉(zhuǎn)換為函數(shù)調(diào)用主語(yǔ)言編譯程序目標(biāo)語(yǔ)言程序ESQL基本處理過(guò)程嵌入式SQL的處理過(guò)程(續(xù)) 為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句, 所有SQL語(yǔ)句必須加前綴EXEC SQL,以(;)結(jié)束: EXEC SQL ;8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不

3、使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)SQL8.1.6 小結(jié)8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信將SQL嵌入到高級(jí)語(yǔ)言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語(yǔ)句SQL語(yǔ)句 描述性的面向集合的語(yǔ)句 負(fù)責(zé)操縱數(shù)據(jù)庫(kù)高級(jí)語(yǔ)言語(yǔ)句 過(guò)程性的面向記錄的語(yǔ)句 負(fù)責(zé)控制程序流程它們之間應(yīng)該如何通信?嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信(續(xù)) 數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間的通信:1. SQL通信區(qū)向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)信息使主語(yǔ)言能夠據(jù)此控制程序流程2. 主變量主語(yǔ)言向SQL語(yǔ)句提供參數(shù)將SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語(yǔ)言進(jìn)一步處理3. 游標(biāo)解決集合性

4、操作語(yǔ)言與過(guò)程性操作語(yǔ)言的不匹配一、SQL通信區(qū)SQLCA: SQL Communication AreaSQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語(yǔ)句執(zhí)行后,RDBMS反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運(yùn)行環(huán)境這些信息將送到SQL通信區(qū)SQLCA中應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,據(jù)此決定接下來(lái)執(zhí)行的語(yǔ)句SQL通信區(qū)SQLCA使用方法:定義SQLCA 用EXEC SQL INCLUDE SQLCA定義使用SQLCASQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語(yǔ)句成功,否則表示出錯(cuò)sq

5、lerrmc用來(lái)保留與sqlcode中的狀態(tài)碼對(duì)應(yīng) 的錯(cuò)誤信息文本應(yīng)用程序每執(zhí)行完一條SQL 語(yǔ)句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語(yǔ)句執(zhí)行情況并做相應(yīng)處理備注:在C語(yǔ)言中,被存放在sqlca.h的SQLCA結(jié)構(gòu)體中嵌入SQL語(yǔ)句的C程序都必須要加入一條語(yǔ)句,即EXEC SQL INCLUDE sqlca.h二、主變量 主變量嵌入式SQL語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入或輸出數(shù)據(jù)在SQL語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱為主變量(Host Variable)主變量(續(xù)) 主變量的類型輸入主變量輸出主變量一個(gè)主變量有可能既是輸入主變量又是輸出主變量主變量(續(xù)) 指示變量:一個(gè)主

6、變量可以附帶一個(gè)指示變量(Indicator Variable)什么是指示變量 一個(gè)整形變量,用來(lái)指示所指主變量的值或條件指示變量的用途主變量(續(xù)) 在SQL語(yǔ)句中使用主變量和指示變量的方法1) 說(shuō)明主變量和指示變量BEGIN DECLARE SECTION. . (說(shuō)明主變量和指示變量).END DECLARE SECTION主變量(續(xù)) C語(yǔ)言中的主變量聲明主變量(續(xù)) 2) 使用主變量說(shuō)明之后的主變量可以在SQL語(yǔ)句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語(yǔ)句中的主變量名前要加冒號(hào)(:)作為標(biāo)志3) 使用指示變量 指示變量前也必須加冒號(hào)標(biāo)志

7、 必須緊跟在所指主變量之后主變量(續(xù)) 在SQL語(yǔ)句之外(主語(yǔ)言語(yǔ)句中)使用主變量和指示變量的方法可以直接引用,不必加冒號(hào)三、游標(biāo)(cursor)為什么要使用游標(biāo) SQL語(yǔ)言與主語(yǔ)言具有不同數(shù)據(jù)處理方式SQL語(yǔ)言是面向集合的,一條SQL語(yǔ)句原則上可以產(chǎn)生或處理多條記錄主語(yǔ)言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同的處理方式 游標(biāo)(續(xù))游標(biāo)游標(biāo)是系統(tǒng)為用戶開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語(yǔ)句的執(zhí)行結(jié)果每個(gè)游標(biāo)區(qū)都有一個(gè)名字用戶可以用SQL語(yǔ)句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語(yǔ)

8、言進(jìn)一步處理游標(biāo)(續(xù))四、建立和關(guān)閉數(shù)據(jù)庫(kù)連接建立數(shù)據(jù)庫(kù)連接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要連接的數(shù)據(jù)庫(kù)服務(wù)器關(guān)閉數(shù)據(jù)庫(kù)連接 EXEC SQL DISCONNECT connection;C語(yǔ)言編寫(xiě)嵌入式SQL實(shí)例(1)C語(yǔ)言編寫(xiě)嵌入式SQL實(shí)例(2)C語(yǔ)言編寫(xiě)嵌入式SQL實(shí)例(3)通知C語(yǔ)言編寫(xiě)嵌入式SQL實(shí)例(4)C語(yǔ)言編寫(xiě)嵌入式SQL實(shí)例(5)六、編譯運(yùn)行C程序嵌入SQL的C應(yīng)用程序具體到VC+6.0、SQL Server2000下調(diào)試可分為五步:(1)環(huán)境初始化(2)預(yù)編譯(3

9、)編譯(4)鏈接(5)運(yùn)行六、編譯運(yùn)行C程序-1.環(huán)境初始化(1)SQL Server為其嵌入式SQL提供了一些特殊的接口;默認(rèn)的安裝方式并沒(méi)有安裝這些接口;因此,需要把devtools.rar解壓到SQL Server的系統(tǒng)目錄下;如果操作系統(tǒng)安裝在C盤,則SQL Server的系統(tǒng)目錄是:C:Program FilesMicrosoft SQL Server。(2)初始化Visual C+6.0編譯器環(huán)境。在命令行方式下運(yùn)行文件:Microsoft Visual StudioVC98Binvcvars32.bat。六、編譯運(yùn)行C程序-1.環(huán)境初始化(3)初始化SQL Server的預(yù)編譯環(huán)

10、境。在命令行方式下運(yùn)行文件:Devtoolssamplesesplcsetenv.bat。(4)VC+6.0環(huán)境配置。具體配置分為如下三步:1Tools-options-directories-IncludeFiles: C:Program FilesMicrosoft SQL Serverdevtoolsinclude2Tools-options-directories-LibFiles: C:Program FilesMicrosoft SQL Serverdevtoolsx86lib3Project-Settings-Link-Object/Library Modules,添加庫(kù)文件:S

11、QLakw32.lib,Caw32.lib。這兩個(gè)文件之間用空格分開(kāi)。六、編譯運(yùn)行C程序-2.預(yù)編譯C語(yǔ)言編譯程序不能識(shí)別應(yīng)用程序中的SQL語(yǔ)句,需要經(jīng)過(guò)預(yù)處理程序?qū)⑵滢D(zhuǎn)換成C語(yǔ)句。SQL Server的預(yù)處理程序是nsqlprep.exe。nsqlprep.exe在SQL Server安裝目錄的MSSQLBinn下。若SQL Server數(shù)據(jù)庫(kù)采用的是默認(rèn)安裝方式,則需要把binn.rar的內(nèi)容拷貝到指定目錄下。nsqlprep.exe的常用語(yǔ)法格式與相關(guān)說(shuō)明見(jiàn)表3。六、編譯運(yùn)行C程序-3.編譯、鏈接與運(yùn)行在VC+6.0中創(chuàng)建一個(gè)“WIN32 Console Application”類型的P

12、roject,然后將預(yù)編譯生成的c文件加入Project,編譯鏈接即可生成訪問(wèn)SQL Server的可執(zhí)行程序。Visual C+6.0進(jìn)行編譯連接時(shí)需要用到動(dòng)態(tài)鏈接庫(kù)SQLakw32.dll與SQLaiw32.dll;盡管這兩個(gè)文件已經(jīng)隨同binn.rar被拷貝到 SQL Server安裝目錄的MSSQLBinn文件夾下,但仍然需要把它們的路徑加到系統(tǒng)路徑變量中,以使得程序運(yùn)行時(shí)能找到它們,具體添加方法如下: 方法1:把這兩個(gè)文件拷貝到操作系統(tǒng)目錄下的system32子目錄中。 方法2:“我的電腦”-“屬性”-“高級(jí)”-“環(huán)境變量”-“path,編輯”,在變量值中加入路徑值;新路徑已有路徑間

13、用“;”間隔。8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)SQL8.1.6 小結(jié)8.1.3 不用游標(biāo)的SQL語(yǔ)句不用游標(biāo)的SQL語(yǔ)句的種類 說(shuō)明性語(yǔ)句 數(shù)據(jù)定義語(yǔ)句 數(shù)據(jù)控制語(yǔ)句 查詢結(jié)果為單記錄的SELECT語(yǔ)句 非CURRENT形式的增刪改語(yǔ)句 不用游標(biāo)的SQL語(yǔ)句(續(xù))一、查詢結(jié)果為單記錄的SELECT語(yǔ)句 二、非CURRENT形式的增刪改語(yǔ)句一、查詢結(jié)果為單記錄的SELECT語(yǔ)句這類語(yǔ)句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量 例

14、2 根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO :Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno;查詢結(jié)果為單記錄的SELECT語(yǔ)句(續(xù))(1) INTO子句、WHERE子句和HAVING短語(yǔ)的條件表達(dá)式中均可以使用主變量(2)查詢返回的記錄中,可能某些列為空值NULL。(3) 如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯(cuò),RDBMS會(huì)在SQLCA中返回錯(cuò)誤信息 指示變

15、量(補(bǔ)充)指示變量是與宿主變量相關(guān)聯(lián)的一類SQL變量,它被用來(lái)監(jiān)督和管理與其相關(guān)聯(lián)的宿主變量,每一個(gè)宿主變量都可以定義一個(gè)指示變量。指示變量的具體作用如下:(1)向數(shù)據(jù)庫(kù)表列輸入NULL值(2)檢查從數(shù)據(jù)庫(kù)表列中選取的數(shù)據(jù)是否是NULL值,或是否發(fā)生截?cái)鄦?wèn)題指示變量(補(bǔ)充)指示變量的值,及其代表的含義如下:0 操作成功-1 該指示變量對(duì)應(yīng)的宿主變量返回了或插入、更新成了NULL 值-2 從數(shù)據(jù)庫(kù)存放數(shù)據(jù)到對(duì)應(yīng)的宿主變量時(shí),數(shù)據(jù)超長(zhǎng),并且不能推斷出截?cái)嗔硕嗌僮止?jié)的長(zhǎng)度0 在FETHC 或SELECT 語(yǔ)句時(shí),因數(shù)據(jù)超長(zhǎng)而被截?cái)啻娣旁诹藢?duì)應(yīng)的宿主變量中,指示變量存放對(duì)應(yīng)列的長(zhǎng)度查詢結(jié)果為單記錄的S

16、ELECT語(yǔ)句(續(xù))例3 查詢某個(gè)學(xué)生選修某門課程的成績(jī)。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了主變量givencno。 EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno;如果Gradeid 0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績(jī)?yōu)榭罩?。二、非CURRENT形式的增刪改語(yǔ)句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示

17、變量 例4 修改某個(gè)學(xué)生選修1號(hào)課程的成績(jī)。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績(jī)已賦給主變量*/ WHERE Sno=:givensno; /*學(xué)號(hào)賦給主變量givensno*/ 非CURRENT形式的增刪改語(yǔ)句(續(xù))例5 將計(jì)算機(jī)系全體學(xué)生年齡置NULL值。 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise :Sageid WHERE Sdept= CS; 將指示變量Sageid賦一個(gè)負(fù)值后,無(wú)論主變量Raise為何值,RDBMS都會(huì)將CS系所有學(xué)生的年齡置空值 。等價(jià)于: EXEC

18、SQL UPDATE Student SET Sage=NULL WHERE Sdept= CS;非CURRENT形式的增刪改語(yǔ)句(續(xù))例6 某個(gè)學(xué)生退學(xué)了,現(xiàn)要將有關(guān)他的所有選課記錄刪除掉。假設(shè)該學(xué)生的姓名已賦給主變量stdname。 EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname); 非CURRENT形式的增刪改語(yǔ)句(續(xù))例7 某個(gè)學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量couno。 gradeid=-1; /*用作

19、指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); 由于該學(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量賦為負(fù)值 8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)SQL8.1.6 小結(jié)8.1.4 使用游標(biāo)的SQL語(yǔ)句必須使用游標(biāo)的SQL語(yǔ)句查詢結(jié)果為多條記錄的SELECT語(yǔ)句CURRENT形式的UPDATE語(yǔ)句CURRENT形式的DELETE語(yǔ)句

20、一、 查詢結(jié)果為多條記錄的SELECT語(yǔ)句使用游標(biāo)的步驟1. 說(shuō)明游標(biāo)2. 打開(kāi)游標(biāo)3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄 4. 關(guān)閉游標(biāo)1. 說(shuō)明游標(biāo)使用DECLARE語(yǔ)句語(yǔ)句格式EXEC SQL DECLARE CURSOR FOR ;功能是一條說(shuō)明性語(yǔ)句,這時(shí)DBMS并不執(zhí)行SELECT指定的查詢操作。2. 打開(kāi)游標(biāo)使用OPEN語(yǔ)句語(yǔ)句格式 EXEC SQL OPEN ;功能打開(kāi)游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語(yǔ)句,把所有滿足查詢條件的記錄從指定表取到緩沖區(qū)中這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中第一條記錄之前3.推進(jìn)游標(biāo)指針并取當(dāng)前記錄 使用FETCH語(yǔ)句語(yǔ)句格式 EXEC SQL FET

21、CH NEXT|PRIOR| FIRST|LAST FROM INTO ,.;推進(jìn)游標(biāo)指針并取當(dāng)前記錄(續(xù))功能指定方向推動(dòng)游標(biāo)指針,然后將緩沖區(qū)中的當(dāng)前記錄取出來(lái)送至主變量供主語(yǔ)言進(jìn)一步處理NEXT|PRIOR|FIRST|LAST:指定推動(dòng)游標(biāo)指針的方式 NEXT:向前推進(jìn)一條記錄 PRIOR:向回退一條記錄 FIRST:推向第一條記錄 LAST:推向最后一條記錄 缺省值為NEXT4. 關(guān)閉游標(biāo)使用CLOSE語(yǔ)句語(yǔ)句格式 EXEC SQL CLOSE ;功能關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源說(shuō)明游標(biāo)被關(guān)閉后,就不再和原來(lái)的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開(kāi),與新的查詢結(jié)果相

22、聯(lián)系二、CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句的用途 面向集合的操作 一次修改或刪除所有滿足條件的記錄CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句(續(xù))如果只想修改或刪除其中某個(gè)記錄用帶游標(biāo)的SELECT語(yǔ)句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句修改或刪除之UPDATE語(yǔ)句和DELETE語(yǔ)句中的子句: WHERE CURRENT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄 CURRENT形式的UPDATE語(yǔ)句和DELETE

23、語(yǔ)句(續(xù))不能使用CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句 :當(dāng)游標(biāo)定義中的SELECT語(yǔ)句帶有UNION或ORDER BY子句 該SELECT語(yǔ)句相當(dāng)于定義了一個(gè)不可更新的視圖 CURRENT形式的UPDATE語(yǔ)句和DELETE語(yǔ)句(續(xù))DECLAREMy_CursorCURSOR-定義游標(biāo)FOR(SELECT*FROMdbo.MemberAccount)-查出需要的集合放到游標(biāo)中OPENMy_Cursor;-打開(kāi)游標(biāo)FETCHNEXTFROMMy_Cursor;-讀取第一行數(shù)據(jù)WHILEFETCH_STATUS=0BEGIN-UPDATEdbo.MemberAccountSE

24、TUserName=UserName+AWHERECURRENTOFMy_Cursor;-更新-DELETEFROMdbo.MemberAccountWHERECURRENTOFMy_Cursor;-刪除FETCHNEXTFROMMy_Cursor;-讀取下一行數(shù)據(jù)ENDCLOSEMy_Cursor;-關(guān)閉游標(biāo)DEALLOCATEMy_Cursor;-釋放游標(biāo)SQL Server當(dāng)中的實(shí)例:8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)SQL8.1.6 小結(jié)

25、8.1.5 動(dòng)態(tài)SQL靜態(tài)嵌入式SQL靜態(tài)嵌入式SQL語(yǔ)句能夠滿足一般要求 無(wú)法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語(yǔ)句 動(dòng)態(tài)嵌入式SQL允許在程序運(yùn)行過(guò)程中臨時(shí)“組裝”SQL語(yǔ)句支持動(dòng)態(tài)組裝SQL語(yǔ)句和動(dòng)態(tài)參數(shù)兩種形式 動(dòng)態(tài)SQL簡(jiǎn)介(續(xù))一、使用SQL語(yǔ)句主變量 二、動(dòng)態(tài)參數(shù)一、使用SQL語(yǔ)句主變量SQL語(yǔ)句主變量:程序主變量包含的內(nèi)容是SQL語(yǔ)句的內(nèi)容,而不是原來(lái)保存數(shù)據(jù)的輸入或輸出變量SQL語(yǔ)句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語(yǔ)句,然后立即執(zhí)行 使用SQL語(yǔ)句主變量(續(xù))例9 創(chuàng)建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char

26、 *stmt = CREATE TABLE test(a int); /* SQL語(yǔ)句主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 執(zhí)行語(yǔ)句 */二、動(dòng)態(tài)參數(shù)動(dòng)態(tài)參數(shù)SQL語(yǔ)句中的可變?cè)厥褂脜?shù)符號(hào)(?)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定和主變量的區(qū)別動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定而是通過(guò) (prepare)語(yǔ)句準(zhǔn)備主變量和執(zhí)行(execute)時(shí)綁定數(shù)據(jù)或主變量來(lái)完成 動(dòng)態(tài)參數(shù)(續(xù))使用動(dòng)態(tài)參數(shù)的步驟:1.聲明SQL語(yǔ)句主變量。2.準(zhǔn)備SQL語(yǔ)句(PREPARE)。 EXEC SQL PRE

27、PARE FROM ; 3.執(zhí)行準(zhǔn)備好的語(yǔ)句(EXECUTE)EXEC SQL EXECUTE INTO USING ;動(dòng)態(tài)參數(shù)(續(xù))例10向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*聲明SQL主變量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL PREPARE mystmt FROM :stmt; /* 準(zhǔn)備語(yǔ)句 */. .EXEC SQL EXECUTE mystmt USING 100; /* 執(zhí)行語(yǔ)句 */EX

28、EC SQL EXECUTE mystmt USING 200; /* 執(zhí)行語(yǔ)句 */8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過(guò)程8.1.2 嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信8.1.3 不使用游標(biāo)的SQL語(yǔ)句8.1.4 使用游標(biāo)的SQL語(yǔ)句8.1.5 動(dòng)態(tài)SQL8.1.6 小結(jié)8.1.6 小 結(jié)在嵌入式SQL中,SQL語(yǔ)句與主語(yǔ)言語(yǔ)句分工非常明確 SQL語(yǔ)句直接與數(shù)據(jù)庫(kù)打交道,取出數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 主語(yǔ)言語(yǔ)句控制程序流程對(duì)取出的數(shù)據(jù)做進(jìn)一步加工處理小結(jié)(續(xù))SQL語(yǔ)言是面向集合的,一條SQL語(yǔ)句原則上可以產(chǎn)生或處理多條記錄主語(yǔ)言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變

29、量并不能完全滿足SQL語(yǔ)句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來(lái)協(xié)調(diào)這兩種不同的處理方式第八章 數(shù)據(jù)庫(kù)編程8.1 嵌入式SQL8.2 存儲(chǔ)過(guò)程8.3 ODBC編程8.2 存儲(chǔ)過(guò)程SQL-invoked routines:存儲(chǔ)過(guò)程(SQL-invoked procedure)函數(shù)(SQL-invoked function)8.2 存儲(chǔ)過(guò)程8.2.1 Transact-SQL的塊結(jié)構(gòu)8.2.2 變量常量的定義8.2.3 控制結(jié)構(gòu)8.2.4 存儲(chǔ)過(guò)程8.2.5 小結(jié)本課程教學(xué)以SQL Server為例8.2.1 Transact-SQL的塊結(jié)構(gòu)Transact-SQL :SQL的

30、擴(kuò)展 增加了過(guò)程化語(yǔ)句功能 基本結(jié)構(gòu)是塊塊之間可以互相嵌套 每個(gè)塊完成一個(gè)邏輯操作 8.2.1 Transact-SQL的塊結(jié)構(gòu)Transact-SQL塊的基本結(jié)構(gòu): 1.定義部分 DECLARE -變量、常量、游標(biāo)、異常等 定義的變量、常量等只能在該基本塊中使用當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在8.2.1 Transact-SQL的塊結(jié)構(gòu)Transact-SQL的基本結(jié)構(gòu)(續(xù)): 2.執(zhí)行部分 BEGIN -SQL語(yǔ)句、 Transact-SQL的流程控制語(yǔ)句 END;8.2.2 變量常量的定義變量的聲明:通過(guò)DECLARE 語(yǔ)句操作初始化 Transact-SQL 變量,語(yǔ)法格式為:DEC

31、LARE 變量名稱 數(shù)據(jù)類型;注意:指定名稱,名稱的第一個(gè)字符必須為一個(gè) 指定系統(tǒng)提供的或用戶定義的數(shù)據(jù)類型和長(zhǎng)度將值設(shè)置為 NULL例如:DECLARE MyCounter int; -聲明int型局部變量MyCounter如果需要同時(shí)聲明多個(gè)局部變量,使用逗號(hào)隔開(kāi)8.2.2 變量常量的定義例如:DECLARE LastName nvarchar(30), FirstName nvarchar(20), StateProvince nchar(2);可以通過(guò)set來(lái)設(shè)置局部變量的初值。例如:set MyCounter=0;局部變量通常用于計(jì)數(shù)器(計(jì)算循環(huán)執(zhí)行次數(shù)或者控制循環(huán)執(zhí)行次數(shù))、保存數(shù)

32、值以供控制流語(yǔ)句測(cè)試、保存存儲(chǔ)過(guò)程返回代碼要返回的數(shù)值或者函數(shù)的返回值。8.2.2 變量常量的定義T-SQL里的全局變量以開(kāi)頭,由系統(tǒng)維護(hù),不可以被創(chuàng)建。常見(jiàn)全局變量:ERROR:每條Transact-SQL語(yǔ)句執(zhí)行后,將會(huì)對(duì)error賦值。0代表語(yǔ)句執(zhí)行成功。1代表失敗。8.2.3 控制結(jié)構(gòu)T-SQL中的流程控制語(yǔ)句是指用來(lái)控制程序執(zhí)行和流程分支的命令,主要用于控制SQL語(yǔ)句、語(yǔ)句塊或者存儲(chǔ)過(guò)程執(zhí)行流程。幾個(gè)主要的流程控制語(yǔ)句:BEGINEND語(yǔ)句IFELSE語(yǔ)句WHILE語(yǔ)句CASE語(yǔ)句8.2.3 控制結(jié)構(gòu)BEGINEND語(yǔ)句將多個(gè)T-SQL語(yǔ)句組成一個(gè)語(yǔ)句塊,視作一個(gè)單元處理。語(yǔ)法格式為

33、:beginsql_statement|statement_blockend詳見(jiàn):/en-us/library/ms190487.aspx8.2.3 控制結(jié)構(gòu)IFELSE語(yǔ)句判斷語(yǔ)句,可以沒(méi)有ELSE字句部分,可嵌套。語(yǔ)法格式為:ifboolean_expressionsql_statement|statement_block elsesql_statement|statement_block詳見(jiàn):/en-us/library/ms182717.aspxIF cost = comparepriceBEGIN ENDELSEBEGINEND8.2.3 控制結(jié)構(gòu)WHILE語(yǔ)句用于重復(fù)執(zhí)行SQL語(yǔ)句

34、,可內(nèi)嵌BREAK和CONTINUE。語(yǔ)法格式為:WHILE Boolean_expression sql_statement | statement_block | BREAK | CONTINUE 詳見(jiàn):/en-us/library/ms178642.aspx WHILE (SELECT AVG(ListPrice) FROM Production.Product) $300BEGIN END8.2.3 控制結(jié)構(gòu)CASE語(yǔ)句可以計(jì)算多個(gè)條件,并將其中一個(gè)符合條件的結(jié)果表達(dá)式返回。語(yǔ)法格式為:CASE input_expressionWHEN when_expression THEN res

35、ult_expression .n ELSE else_result_expression END 或者Searched CASE expression: CASE WHEN Boolean_expression THEN result_expression .n ELSE else_result_expression END詳見(jiàn):/en-us/library/ms181765.aspxCASE應(yīng)用例子: http:/sql/sql_case8.2.3 控制結(jié)構(gòu)CASE語(yǔ)句實(shí)例8.2 存儲(chǔ)過(guò)程8.2.1 Transact-SQL的塊結(jié)構(gòu)8.2.2 變量常量的定義8.2.3 控制結(jié)構(gòu)8.2.4

36、存儲(chǔ)過(guò)程8.2.5 小結(jié)8.2.4 存儲(chǔ)過(guò)程Transact-SQL塊類型:命名塊:編譯后保存在數(shù)據(jù)庫(kù)中,可以被反復(fù)調(diào)用,運(yùn)行速度較快。存儲(chǔ)過(guò)程和函數(shù)是命名塊 匿名塊:每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫(kù)中,也不能在其他的Transact-SQL塊中調(diào)用 存儲(chǔ)過(guò)程(續(xù))一、 存儲(chǔ)過(guò)程的優(yōu)點(diǎn) 二、 存儲(chǔ)過(guò)程的用戶接口 三、 游標(biāo) 存儲(chǔ)過(guò)程(續(xù))存儲(chǔ)過(guò)程:由Transact-SQL語(yǔ)句書(shū)寫(xiě)的過(guò)程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要調(diào)用即可 一、存儲(chǔ)過(guò)程的優(yōu)點(diǎn):1. 運(yùn)行效率高2. 降低了客戶機(jī)和服務(wù)器之間的通信量 3. 方便實(shí)施企業(yè)規(guī)則存儲(chǔ)過(guò)程(續(xù))二、 存儲(chǔ)過(guò)程的用戶接口:1

37、. 創(chuàng)建存儲(chǔ)過(guò)程 2. 執(zhí)行存儲(chǔ)過(guò)程 3. 刪除存儲(chǔ)過(guò)程 存儲(chǔ)過(guò)程(續(xù))CREATE PROCEDURE sp_Select_All_Employees ASSELECT employeeid,firstname,lastname FROM Employees ORDER BY lastname , firstname創(chuàng)建存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程(續(xù))CREATE PROCEDURE sp_Orders_By_EmployeeId employeeid int AS SELECT orderid , customerid FROM orders WHERE employeeid = employeei

38、d /* 其中 employeeid 為輸入?yún)?shù),且后面為該參數(shù)類型 */創(chuàng)建一個(gè)帶參數(shù)的存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程(續(xù))CREATE PROCEDURE sp_Orders_By_EmployeeId2 employeeid int, ordercount int = 0 output AS SELECT orderid,customerid FROM orders WHERE employeeid = employeeid; SELECT ordercount = count(*) FROM orders WHERE employeeid = employeeid return ordercount

39、創(chuàng)建一個(gè)傳入?yún)?shù)、返回值和輸出參數(shù)的存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程(續(xù))修改存儲(chǔ)過(guò)程ALTER PROCEDURE -存儲(chǔ)程序名稱 -改變的參數(shù)AS -改變后的T-SQL語(yǔ)句查看存儲(chǔ)過(guò)程execute sp_helptext -存儲(chǔ)過(guò)程名稱重命名存儲(chǔ)過(guò)程EXECUTE sp_rename -需要改的存儲(chǔ)過(guò)程名稱 -改后的存儲(chǔ)過(guò)程名稱調(diào)用存儲(chǔ)過(guò)程EXECUTE sp_Orders_By_EmployeeId2 2 value三、游 標(biāo) 在Transact-SQL中,如果SELECT語(yǔ)句只返回一條記錄,可以將該結(jié)果存放到變量中。當(dāng)查詢返回多條記錄時(shí),就要使用游標(biāo)對(duì)結(jié)果集進(jìn)行處理一個(gè)游標(biāo)與一個(gè)SQL語(yǔ)句相關(guān)聯(lián)。T

40、ransact-SQL中的游標(biāo)由Transact-SQL引擎管理 Transact-SQL游標(biāo)的概念游標(biāo)(Cursor)使用戶可逐行訪問(wèn)由SQL Server返回的結(jié)果集使用游標(biāo)的一個(gè)主要的原因就是把集合操作轉(zhuǎn)換成單個(gè)記錄處理方式用SQL語(yǔ)言從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)后,結(jié)果放在內(nèi)存的一塊區(qū)域中,且結(jié)果往往是一個(gè)含有多個(gè)記錄的集合游標(biāo)機(jī)制允許用戶在SQL Server內(nèi)逐行地訪問(wèn)這些記錄,按照用戶自己的意愿來(lái)顯示和處理這些記錄游標(biāo)的優(yōu)點(diǎn)允許程序?qū)τ刹樵冋Z(yǔ)句select返回的行集合中的每一行執(zhí)行相同或不同的操作,而不是對(duì)整個(gè)行集合執(zhí)行同一個(gè)操作提供對(duì)基于游標(biāo)位置的表中的行進(jìn)行刪除和更新的能力游標(biāo)實(shí)際上作

41、為面向集合的數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)和面向行的程序設(shè)計(jì)之間的橋梁,使這兩種處理方式通過(guò)游標(biāo)溝通起來(lái)游標(biāo)的使用使用游標(biāo)的順序 聲名游標(biāo)打開(kāi)游標(biāo)讀取數(shù)據(jù)關(guān)閉游標(biāo)刪除游標(biāo)聲明游標(biāo)最簡(jiǎn)單游標(biāo)聲明: DECLARE CURSOR FOR ;其中,select語(yǔ)句可以是簡(jiǎn)單查詢,也可以是復(fù)雜的接連查詢和嵌套查詢例子:declare cursor_stu cursor for select * from Student這樣就對(duì)表Student表聲明了一個(gè)游標(biāo)cursor_stu打開(kāi)游標(biāo)語(yǔ)法格式:OPEN OPEN cursor_stu讀取數(shù)據(jù) FETCH NEXT | PRIOR | FIRST | L

42、AST FROM 游標(biāo)名 | 游標(biāo)變量名 INTO 變量名 , 參數(shù)說(shuō)明:NEXT 取下一行的數(shù)據(jù),并把下一行作為當(dāng)前行(遞增)。由于打開(kāi)游標(biāo)后,行指針是指向該游標(biāo)第1行之前,所以第一次執(zhí)行FETCH NEXT操作將取得游標(biāo)集中的第1行數(shù)據(jù)。NEXT為默認(rèn)的游標(biāo)提取選項(xiàng)INTO 變量名, 把提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個(gè)變量從左到右與游標(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ù)目一致讀取數(shù)據(jù)當(dāng)游標(biāo)被打開(kāi)時(shí),行指針將指向該游標(biāo)集第1行之前,如果要讀取游標(biāo)集中的第1行數(shù)據(jù),必須移

43、動(dòng)行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數(shù)據(jù): Fetch next from cursor_stu 或 Fetch first from cursor_stu讀取數(shù)據(jù)這樣就取出了游標(biāo)里的數(shù)據(jù),還需要將取出的數(shù)據(jù)賦給變量/聲明2個(gè)變量declare sno NVARCHAR(5)declare sname char(8)/將取出的值傳入剛才聲明的2個(gè)變量Fetch next from cursor_stu into sno,sname關(guān)閉游標(biāo)和刪除游標(biāo)CLOSE 實(shí)例:close cursor_stuDEALLOCATE 實(shí)例:deallocate cursor_stu實(shí)

44、例為了運(yùn)行創(chuàng)建的游標(biāo),可以將游標(biāo)寫(xiě)在存儲(chǔ)過(guò)程里,方便我們看到游標(biāo)的整個(gè)使用過(guò)程,在sqlserver2008中新建一個(gè)存儲(chǔ)過(guò)程:-在存儲(chǔ)過(guò)程中使用游標(biāo)-create procedure cursor_testas-聲明兩個(gè)變量declare sno VARCHAR(5)declare sname char(8)-聲明一個(gè)游標(biāo)declare cursor_stu cursor for select sno,sname from Student-打開(kāi)游標(biāo)OPEN cursor_stu-從游標(biāo)里取出數(shù)據(jù)賦值到我們剛才聲明的2個(gè)變量中Fetch next from cursor_stu into sn

45、o,sname-后面代碼見(jiàn)下一頁(yè)P(yáng)PT實(shí)例-續(xù)上一頁(yè)P(yáng)PT-判斷游標(biāo)的狀態(tài)-0 fetch語(yǔ)句成功 -1 fetch語(yǔ)句失敗或此行不在結(jié)果集中 -2 被提取的行不存在while (fetch_status=0) begin -顯示出我們每次用游標(biāo)取出的值 print 游標(biāo)成功取出一條數(shù)據(jù) print sno print sname -用游標(biāo)去取下一條記錄 fetch next from cursor_stu into sno,snameend -關(guān)閉游標(biāo)close cursor_studeallocate cursor_stu8.2 存儲(chǔ)過(guò)程8.2.1 Transact-SQL的塊結(jié)構(gòu)8.2.

46、2 變量常量的定義8.2.3 控制結(jié)構(gòu)8.2.4 存儲(chǔ)過(guò)程8.2.5 小結(jié)8.2.5 小 結(jié)存儲(chǔ)過(guò)程的優(yōu)點(diǎn)經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,運(yùn)行效率高 降低客戶機(jī)和服務(wù)器之間的通信量 有利于集中控制,方便維護(hù) 第八章 數(shù)據(jù)庫(kù)編程8.1 嵌入式SQL8.2 存儲(chǔ)過(guò)程8.3 ODBC編程8.3 ODBC編程O(píng)DBC優(yōu)點(diǎn):移植性好能同時(shí)訪問(wèn)不同的數(shù)據(jù)庫(kù)共享多個(gè)數(shù)據(jù)資源 8.3 ODBC編程8.3.1 數(shù)據(jù)庫(kù)互連概述8.3.2 ODBC工作原理概述 8.3.3 ODBC API 基礎(chǔ) 8.3.4 ODBC的工作流程8.3.5 小結(jié)8.3.1 數(shù)據(jù)庫(kù)互連概述ODBC產(chǎn)生的原因:由于不同的數(shù)據(jù)庫(kù)管理系統(tǒng)

47、的存在,在某個(gè)RDBMS下編寫(xiě)的應(yīng)用程序就不能在另一個(gè)RDBMS下運(yùn)行 許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問(wèn)不同的RDBMS 數(shù)據(jù)庫(kù)互連概述(續(xù))ODBC:是微軟公司開(kāi)放服務(wù)體系(Windows Open Services Architecture,WOSA)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分 提供了一組訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)API ODBC約束力:規(guī)范應(yīng)用開(kāi)發(fā)規(guī)范RDBMS應(yīng)用接口8.3 ODBC編程8.3.1 數(shù)據(jù)庫(kù)互連概述8.3.2 ODBC工作原理概述 8.3.3 小結(jié)8.3.2 ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu) :一、 用戶應(yīng)用程序 二、 驅(qū)動(dòng)程序管理器 三、 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序

48、四、 ODBC數(shù)據(jù)源管理 一、 應(yīng)用程序ODBC應(yīng)用程序包括的內(nèi)容: 請(qǐng)求連接數(shù)據(jù)庫(kù);向數(shù)據(jù)源發(fā)送SQL語(yǔ)句;為SQL語(yǔ)句執(zhí)行結(jié)果分配存儲(chǔ)空間,定義所讀取的數(shù)據(jù)格式;獲取數(shù)據(jù)庫(kù)操作結(jié)果,或處理錯(cuò)誤;進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請(qǐng)求事務(wù)的提交和回滾操作;斷開(kāi)與數(shù)據(jù)源的連接。 二、驅(qū)動(dòng)程序管理器 驅(qū)動(dòng)程序管理器:用來(lái)管理各種驅(qū)動(dòng)程序 包含在ODBC32.DLL中 管理應(yīng)用程序和驅(qū)動(dòng)程序之間的通信 建立、配置或刪除數(shù)據(jù)源并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫(kù)ODBC驅(qū)動(dòng)程序主要功能:裝載ODBC驅(qū)動(dòng)程序選擇和連接正確的驅(qū)動(dòng)程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等 三、數(shù)據(jù)庫(kù)驅(qū)動(dòng)

49、程序ODBC通過(guò)驅(qū)動(dòng)程序來(lái)提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性 ODBC應(yīng)用程序不能直接存取數(shù)據(jù)庫(kù)其各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交給某個(gè)RDBMS的ODBC驅(qū)動(dòng)程序通過(guò)調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來(lái)存取數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的操作結(jié)果也通過(guò)驅(qū)動(dòng)程序返回給應(yīng)用程序。如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫(kù),就要?jiǎng)討B(tài)地鏈接到不同的驅(qū)動(dòng)程序上。 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(續(xù))ODBC驅(qū)動(dòng)程序類型:?jiǎn)问鴶?shù)據(jù)源和應(yīng)用程序在同一臺(tái)機(jī)器上驅(qū)動(dòng)程序直接完成對(duì)數(shù)據(jù)文件的I/O操作驅(qū)動(dòng)程序相當(dāng)于數(shù)據(jù)管理器 多束 支持客戶機(jī)/服務(wù)器、客戶機(jī)/應(yīng)用服務(wù)器/數(shù)據(jù)庫(kù)服務(wù)器等網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)訪問(wèn)由驅(qū)動(dòng)程序完成數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求的提交和結(jié)果集接收應(yīng)用程序使用驅(qū)動(dòng)

50、程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù) 8.3.3 小結(jié) ODBC目的:為了提高應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性,使得應(yīng)用系統(tǒng)的移植變得容易 ODBC優(yōu)點(diǎn):使得應(yīng)用系統(tǒng)的開(kāi)發(fā)與數(shù)據(jù)庫(kù)平臺(tái)的選擇、數(shù)據(jù)庫(kù)設(shè)計(jì)等工作并行進(jìn)行方便移植 大大縮短整個(gè)系統(tǒng)的開(kāi)發(fā)時(shí)間 8.4 JDBC編程Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)JDBC(Java Data Base Connectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)

51、庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)一、開(kāi)啟SQL Server身份驗(yàn)證模式在連接數(shù)據(jù)庫(kù)之前必須保證SQLServer2008是采用SQLServer身份驗(yàn)證方式而不是windows身份驗(yàn)證方式。SQL Server 2008裝好后,默認(rèn)協(xié)議是沒(méi)有開(kāi)啟的,可打開(kāi)配置工具下的 SQL Server配置管理器中開(kāi)啟;Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)補(bǔ)充:設(shè)置SQLServer2008的身份驗(yàn)證方式Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)補(bǔ)充:設(shè)置SQLServer2008的身份驗(yàn)證方式設(shè)置sa的密碼并啟用sa登錄

52、名Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)補(bǔ)充:設(shè)置SQLServer2008的身份驗(yàn)證方式Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)驗(yàn)證sa登錄在桌面上新建一個(gè)文本文件,文件名為TestSQL.UDL,雙擊這個(gè)文件打開(kāi)“數(shù)據(jù)鏈接屬性”對(duì)話框,點(diǎn)擊“提供程序”選項(xiàng)卡,如右圖:補(bǔ)充:設(shè)置SQLServer2008的身份驗(yàn)證方式Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)點(diǎn)擊“下一步”按鈕進(jìn)入“高級(jí)”選項(xiàng)卡,輸入數(shù)據(jù)源為:local,即我們安裝的SQLServer2008實(shí)例,并選擇“使用指定的用戶名稱和密碼”,輸入登錄名sa和sa的密碼,最后,我們點(diǎn)擊“測(cè)試連

53、接”按鈕,測(cè)試sa登錄??梢钥吹竭B接成功!為了下一次使用方便,勾選“允許保存密碼”,最后,點(diǎn)擊“確定”按鈕保存這個(gè)數(shù)據(jù)鏈接。Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)二、SQLServer2008的配置必須保證SQLServer2008是采用SQLServer身份驗(yàn)證方式下開(kāi)始配置1、安裝好SQLServer2008后,運(yùn)行開(kāi)始所有程序MicrosoftSQLServer2008配置工具SQLServer配置管理器,在打開(kāi)的窗口的左邊找到MSSQLSERVER的協(xié)議,在右邊右單擊TCP/IP,選擇已啟用。如果NamedPipes

54、未啟用也設(shè)為啟用。Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)圖1Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)圖2Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)2、雙擊圖2右邊的TCP/IP,在彈出的窗口中選擇IP地址標(biāo)簽,把IPAll中的TCP端口設(shè)成1433,并將上方所有的已啟用選項(xiàng)設(shè)置成是。如圖3所示:圖3Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)3、然后重啟數(shù)據(jù)庫(kù),重啟完畢后,接下來(lái)使用命令測(cè)試1433端口是否打開(kāi)。開(kāi)始菜單運(yùn)行cmd在命令提示符下輸入:telnet1433,(注意telnet與127之間有空格,1與1433之間有空格)若提示“不

55、能打開(kāi)到主機(jī)的連接,在端口1433:連接失敗”,則說(shuō)明1433端口沒(méi)有打開(kāi),需要重新進(jìn)行以上配置。若連接成功,顯示如圖4所示:Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)圖4Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)補(bǔ)充:如何設(shè)置開(kāi)啟win7中的telnet服務(wù)打開(kāi)控制面板在控制面板中選擇“程序”項(xiàng),打開(kāi)程序設(shè)置頁(yè)面選擇“打開(kāi)或關(guān)閉windows功能”項(xiàng),打開(kāi)window功能設(shè)置窗口將其中的“telnet服務(wù)器”、“telnet客戶端”前面打上勾。默認(rèn)是沒(méi)有打上勾的,所以打上勾后,點(diǎn)擊“確定”完成開(kāi)啟Eclipse連接SQL Server 2008數(shù)據(jù)庫(kù)三、環(huán)境變量CLASSPATH配置1、下

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論