數(shù)據(jù)庫系統(tǒng)概論:第8章 數(shù)據(jù)庫編程_第1頁
數(shù)據(jù)庫系統(tǒng)概論:第8章 數(shù)據(jù)庫編程_第2頁
數(shù)據(jù)庫系統(tǒng)概論:第8章 數(shù)據(jù)庫編程_第3頁
數(shù)據(jù)庫系統(tǒng)概論:第8章 數(shù)據(jù)庫編程_第4頁
數(shù)據(jù)庫系統(tǒng)概論:第8章 數(shù)據(jù)庫編程_第5頁
已閱讀5頁,還剩134頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)庫系統(tǒng)概論An Introduction to Database System第八章 數(shù)據(jù)庫編程第八章 數(shù)據(jù)庫編程8.1 嵌入式SQL8.2 過程化SQL8.3 存儲過程和函數(shù)8.4 ODBC編程*8.5 OLE DB*8.6 JDBC編程8.7 小結(jié)8.1 嵌入式SQLSQL語言提供了兩種不同的使用方式交互式嵌入式為什么要引入嵌入式SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級語言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語句要做某些必要的擴(kuò)充8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過程8.1.2 嵌入式SQL語句與主語言之間的通信8.1.3 不用游標(biāo)的SQL語句8

2、.1.4 使用游標(biāo)的SQL語句8.1.5 動態(tài)SQL8.1.1 嵌入式SQL的處理過程主語言嵌入式SQL是將SQL語句嵌入程序設(shè)計(jì)語言中,被嵌入的程序設(shè)計(jì)語言,如C、C+、Java,稱為宿主語言,簡稱主語言。處理過程預(yù)編譯方法嵌入式SQL的處理過程(續(xù)) 關(guān)系數(shù)據(jù)庫管理系統(tǒng)預(yù)處理程序轉(zhuǎn)換嵌入式SQL語句為函數(shù)調(diào)用含嵌入式SQL語句的主語言程序轉(zhuǎn)換后的主語言程序主語言編譯程序編譯處理目標(biāo)語言程序嵌入式SQL的處理過程(續(xù)) 為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXEC SQL, 主語言為C語言時(shí),語句格式:EXEC SQL ;8.1 嵌入式SQL8.1.1 嵌入式SQL的處理

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

4、實(shí)現(xiàn)(3)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言處理,主要用主變量和游標(biāo)實(shí)現(xiàn)1. SQL通信區(qū)SQLCA: SQL Communication AreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,系統(tǒng)反饋給應(yīng)用程序信息 描述系統(tǒng)當(dāng)前工作狀態(tài) 描述運(yùn)行環(huán)境這些信息將送到SQL通信區(qū)中應(yīng)用程序從SQL通信區(qū)中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句SQL通信區(qū)(續(xù))SQLCA使用方法定義SQLCA 用EXEC SQL INCLUDE SQLCA定義使用SQLCASQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表

5、示SQL語句成功,否則表示出錯應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理2. 主變量 主變量嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為主變量(Host Variable)主變量(續(xù)) 主變量的類型輸入主變量由應(yīng)用程序?qū)ζ滟x值,SQL語句引用輸出主變量由SQL語句對其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序主變量(續(xù)) 指示變量是一個整型變量,用來“指示”所指主變量的值或條件一個主變量可以附帶一個指示變量(Indicator Variable)指示變量的用途指示輸入主變量是否為空值

6、檢測輸出變量是否為空值,值是否被截?cái)嘀髯兞浚ɡm(xù)) 在SQL語句中使用主變量和指示變量的方法說明主變量和指示變量BEGIN DECLARE SECTION. (說明主變量和指示變量).END DECLARE SECTION主變量(續(xù)) 在SQL語句中使用主變量和指示變量的方法(續(xù))使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達(dá)式的地方出現(xiàn)為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標(biāo)志使用指示變量 指示變量前也必須加冒號標(biāo)志 必須緊跟在所指主變量之后主變量(續(xù)) 在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接引用

7、,不必加冒號3. 游標(biāo)為什么要使用游標(biāo)SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式 游標(biāo)(續(xù))游標(biāo)游標(biāo)是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標(biāo)區(qū)都有一個名字用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理4. 建立和關(guān)閉數(shù)據(jù)庫連接(1)建立數(shù)據(jù)庫連接 EXEC SQL CONNECT TO targetAS conn

8、ection-nameUSER user-name; target是要連接的數(shù)據(jù)庫服務(wù)器常見的服務(wù)器標(biāo)識串,如: 包含服務(wù)器標(biāo)識的SQL串常量 DEFAULT 建立和關(guān)閉數(shù)據(jù)庫連接(續(xù))connect-name是可選的連接名,連接名必須是一個有效的標(biāo)識符 在整個程序內(nèi)只有一個連接時(shí)可以不指定連接名程序運(yùn)行過程中可以修改當(dāng)前連接 EXEC SQL SET CONNECTION connection-name |DEFAULT;建立和關(guān)閉數(shù)據(jù)庫連接(續(xù))(2)關(guān)閉數(shù)據(jù)庫連接 EXEC SQL DISCONNECT connection;5. 程序?qū)嵗?.1 依次檢查某個系的學(xué)生記錄,交互式更新某

9、些學(xué)生年齡。EXEC SQL BEGIN DECLARE SECTION; /*主變量說明開始*/ char Deptname20;char Hsno9;char Hsname20; char Hssex2;int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION; /*主變量說明結(jié)束*/long SQLCODE;EXEC SQL INCLUDE SQLCA; /*定義SQL通信區(qū)*/程序?qū)嵗ɡm(xù))int main(void) /*C語言主程序開始*/int count = 0;char yn; /*變量yn代表yes或no*/printf(Pleas

10、e choose the department name(CS/MA/IS): ); scanf(%s,deptname); /*為主變量deptname賦值*/EXEC SQL CONNECT TO TESTlocalhost:54321 USER SYSTEM/MANAGER; /*連接數(shù)據(jù)庫TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)SX*/SELECT Sno,Sname,Ssex,Sage /*SX對應(yīng)的語句*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開游標(biāo)SX,指向查

11、詢結(jié)果的第一行*/程序?qū)嵗ɡm(xù))for ( ; ; ) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推進(jìn)游標(biāo),將當(dāng)前數(shù)據(jù)放入主變量*/if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/break; /*利用SQLCA中的狀態(tài)信息決定何時(shí)退出循環(huán)*/if(count+ = 0) /*如果是第一行的話,先打出行頭*/ printf(n%-10s %-20s %-10s %-10sn, Sno“,Sname“,Ssex, Sage);printf(%-

12、10s %-20s %-10s %-10dn“, HSno,Hsname,Hssex,HSage); /*打印查詢結(jié)果*/ printf(“UPDATE AGE(y/n)?”); /*詢問用戶是否要更新該學(xué)生的年齡*/ doscanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);程序?qū)嵗ɡm(xù)) if (yn = y | yn = Y) /*如果選擇更新操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAGE); /*用戶輸入新年齡到主變量中*/ EXEC SQL UPDATE Student /*

13、嵌入式SQL更新語句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; /*對當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/ EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)SX,不再和查詢結(jié)果對應(yīng)*/ EXEC SQL COMMIT WORK; /*提交更新*/ EXEC SQL DISCONNECT TEST; /*斷開數(shù)據(jù)庫連接*/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.3 不用游標(biāo)的SQL語句不用游標(biāo)的SQL語

14、句的種類 說明性語句 數(shù)據(jù)定義語句 數(shù)據(jù)控制語句 查詢結(jié)果為單記錄的SELECT語句 非CURRENT形式的增刪改語句 不用游標(biāo)的SQL語句(續(xù))1. 查詢結(jié)果為單記錄的SELECT語句 2. 非CURRENT形式的增刪改語句1. 查詢結(jié)果為單記錄的SELECT語句這類語句不需要使用游標(biāo),只需用INTO子句指定存放查詢結(jié)果的主變量。 例8.2 根據(jù)學(xué)生號碼查詢學(xué)生信息。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno; /*

15、把要查詢的學(xué)生的學(xué)號賦給為了主變量givensno*/查詢結(jié)果為單記錄的SELECT語句(續(xù))INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量查詢返回的記錄中,可能某些列為空值NULL 如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯,關(guān)系數(shù)據(jù)庫管理系統(tǒng)會在SQLCA中返回錯誤信息 查詢結(jié)果為單記錄的SELECT語句(續(xù))例8.3 查詢某個學(xué)生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號賦給了主變量givensno,將課程號賦給了主變量givencno。EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:H

16、grade:Gradeid /*指示變量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno;如果Gradeid 0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績?yōu)榭罩怠?. 非CURRENT形式的增刪改語句在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量 例8.4 修改某個學(xué)生選修1號課程的成績。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成績已賦給主變量:newgrade*/ WHERE Sno=:givensno;/*學(xué)號賦給主變量:givensno*

17、/非CURRENT形式的增刪改語句(續(xù))例8.5 某個學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號已賦給主變量stdno,課程號已賦給主變量couno。gradeid=-1; /*gradeid為指示變量,賦為負(fù)值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); /*:stdno,:couno,:gr為主變量*/ 由于該學(xué)生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負(fù)值8.1 嵌入式SQL8.1.1 嵌入式SQL的處理過程8.1.2 嵌入式SQL語句與主語言之間的通信8.1

18、.3 不用游標(biāo)的SQL語句8.1.4 使用游標(biāo)的SQL語句8.1.5 動態(tài)SQL8.1.4 使用游標(biāo)的SQL語句必須使用游標(biāo)的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句使用游標(biāo)的SQL語句(續(xù))1. 查詢結(jié)果為多條記錄的SELECT語句2. CURRENT形式的UPDATE和DELETE語句1. 查詢結(jié)果為多條記錄的SELECT語句使用游標(biāo)的步驟(1)說明游標(biāo)(2)打開游標(biāo)(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄 (4)關(guān)閉游標(biāo)(1)說明游標(biāo)使用DECLARE語句語句格式EXEC SQL DECLARE CURSOR FOR ;

19、功能是一條說明性語句,這時(shí)關(guān)系數(shù)據(jù)庫管理系統(tǒng)并不執(zhí)行SELECT語句(2)打開游標(biāo)使用OPEN語句語句格式 EXEC SQL OPEN ;功能打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把查詢結(jié)果取到緩沖區(qū)中這時(shí)游標(biāo)處于活動狀態(tài),指針指向查詢結(jié)果集中的第一條記錄(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄 使用FETCH語句語句格式 EXEC SQL FETCH INTO ,.;功能指定方向推動游標(biāo)指針,同時(shí)將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理(4)關(guān)閉游標(biāo)使用CLOSE語句語句格式 EXEC SQL CLOSE ;功能關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源說明游標(biāo)被關(guān)閉后,就不再和原

20、來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系2. CURRENT形式的UPDATE語句和DELETE語句CURRENT形式的UPDATE語句和DELETE語句的用途非CURRENT形式的UPDATE語句和DELETE語句面向集合的操作一次修改或刪除所有滿足條件的記錄CURRENT形式的UPDATE語句和DELETE語句(續(xù))CURRENT形式的UPDATE語句和DELETE語句的用途(續(xù))如果只想修改或刪除其中某個記錄用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄從中進(jìn)一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之UPD

21、ATE語句和DELETE語句中要用子句WHERE CURRENT OF 表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄 CURRENT形式的UPDATE語句和DELETE語句(續(xù))不能使用CURRENT形式的UPDATE語句和DELETE語句當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDER BY子句 該SELECT語句相當(dā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)SQL 8.1.5 動態(tài)SQL靜態(tài)嵌入式SQL靜

22、態(tài)嵌入式SQL語句能夠滿足一般要求 無法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語句、查詢的條件 動態(tài)嵌入式SQL允許在程序運(yùn)行過程中臨時(shí)“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式 動態(tài)SQL(續(xù))1. 使用SQL語句主變量 2. 動態(tài)參數(shù)3. 執(zhí)行準(zhǔn)備好的語句(EXECUTE)1. 使用SQL語句主變量SQL語句主變量程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行 使用SQL語句主變量(續(xù))例8.6 創(chuàng)建基本表TEST。EXEC SQL BEGIN DECLARE SECTION;

23、const char *stmt=CREATE TABLE test(a int); /*SQL語句主變量,內(nèi)容是創(chuàng)建表的SQL語句*/EXEC SQL END DECLARE SECTION; . EXEC SQL EXECUTE IMMEDIATE :stmt; /*執(zhí)行動態(tài)SQL語句*/2. 動態(tài)參數(shù)動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定和主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定而是通過 PREPARE語句準(zhǔn)備主變量和執(zhí)行語句EXECUTE綁定數(shù)據(jù)或主變量來完成 動態(tài)參數(shù)(續(xù))使用動態(tài)參數(shù)的步驟(1)聲明SQL語句主變量(2)準(zhǔn)備SQL語句(PR

24、EPARE)EXEC SQL PREPARE FROM ;3. 執(zhí)行準(zhǔn)備好的語句(EXECUTE)EXEC SQL EXECUTE INTO USING ;執(zhí)行準(zhǔn)備好的語句(EXECUTE)(續(xù))例8.7 向TEST中插入元組。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*聲明SQL主變量內(nèi)容是INSERT語句 */EXEC SQL END DECLARE SECTION;. EXEC SQL PREPARE mystmt FROM :stmt; /*準(zhǔn)備語句*/. EXEC SQ

25、L EXECUTE mystmt USING 100; /*執(zhí)行語句,設(shè)定INSERT語句插入值100 */EXEC SQL EXECUTE mystmt USING 200; /* 執(zhí)行語句,設(shè)定INSERT語句插入值200 */第八章 數(shù)據(jù)庫編程8.1 嵌入式SQL8.2 過程化SQL8.3 存儲過程和函數(shù)8.4 ODBC編程*8.5 OLE DB*8.6 JDBC編程8.7 小結(jié)8.2 過程化SQL8.2.1 過程化SQL的塊結(jié)構(gòu)8.2.2 變量和常量的定義8.2.3 流程控制8.2.1 過程化SQL的塊結(jié)構(gòu)過程化SQL SQL的擴(kuò)展 增加了過程化語句功能 基本結(jié)構(gòu)是塊塊之間可以互相嵌套

26、 每個塊完成一個邏輯操作 過程化SQL的塊結(jié)構(gòu)(續(xù))過程化SQL塊的基本結(jié)構(gòu)1. 定義部分 DECLARE 變量、常量、游標(biāo)、異常等 定義的變量、常量等只能在該基本塊中使用當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在過程化SQL的塊結(jié)構(gòu)(續(xù))過程化SQL塊的基本結(jié)構(gòu)(續(xù))2. 執(zhí)行部分 BEGIN SQL語句、過程化SQL的流程控制語句 EXCEPTION 異常處理部分 END;8.2 過程化SQL8.2.1 過程化SQL的塊結(jié)構(gòu)8.2.2 變量和常量的定義8.2.3 流程控制8.2.2 變量和常量的定義1. 變量定義變量名 數(shù)據(jù)類型 NOT NULL:=初值表達(dá)式或變量名 數(shù)據(jù)類型 NOT NULL

27、初值表達(dá)式2. 常量定義常量名 數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式常量必須要給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,過程化SQL將返回一個異常3. 賦值語句變量名稱 :=表達(dá)式8.2 過程化SQL8.2.1 過程化SQL的塊結(jié)構(gòu)8.2.2 變量和常量的定義8.2.3 流程控制8.2.3 流程控制過程化SQL功能1. 條件控制語句2. 循環(huán)控制語句 3. 錯誤處理 流程控制(續(xù))1. 條件控制語句 IF-THEN,IF-THEN-ELSE和嵌套的IF語句 (1)IF condition THEN Sequence_of_statements; END IF;

28、 (2)IF condition THEN Sequence_of_statements1; ELSE Sequence_of_statements2; END IF;(3)在THEN和ELSE子句中還可以再包含IF語句,即IF語句可以嵌套 流程控制(續(xù))2. 循環(huán)控制語句 LOOP,WHILE-LOOP和FOR-LOOP (1)簡單的循環(huán)語句LOOP LOOP Sequence_of_statements; END LOOP; 多數(shù)數(shù)據(jù)庫服務(wù)器的過程化SQL都提供EXIT、BREAK或 LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束流程控制(續(xù))2. 循環(huán)控制語句(續(xù))(2)WHILE

29、-LOOP WHILE condition LOOP Sequence_of_statements; END LOOP;每次執(zhí)行循環(huán)體語句之前,首先對條件進(jìn)行求值如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列如果條件為假,則跳過循環(huán)并把控制傳遞給下一個語句 流程控制(續(xù))2. 循環(huán)控制語句(續(xù))(3)FOR-LOOP FOR count IN REVERSE bound1 bound2 LOOP Sequence_of_statements; END LOOP;流程控制(續(xù))3. 錯誤處理如果過程化SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句 SQL標(biāo)

30、準(zhǔn)對數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求過程化SQL管理器提供完善的異常處理機(jī)制 第八章 數(shù)據(jù)庫編程8.1 嵌入式SQL8.2 過程化SQL8.3 存儲過程和函數(shù)8.4 ODBC編程*8.5 OLE DB*8.6 JDBC編程8.7 小結(jié)8.3 存儲過程和函數(shù)8.3.1 存儲過程8.3.2 函數(shù)*8.3.3 過程化SQL中的游標(biāo)8.3.1 存儲過程過程化SQL塊類型命名塊編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運(yùn)行速度較快,過程和函數(shù)是命名塊 匿名塊每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲到數(shù)據(jù)庫中,也不能在其他過程化SQL塊中調(diào)用 存儲過程(續(xù))1. 存儲過程的優(yōu)點(diǎn) 2. 存儲過程的用

31、戶接口 存儲過程(續(xù))存儲過程:由過程化SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中,使用時(shí)只要調(diào)用即可。存儲過程的優(yōu)點(diǎn)(1)運(yùn)行效率高(2)降低了客戶機(jī)和服務(wù)器之間的通信量(3)方便實(shí)施企業(yè)規(guī)則存儲過程(續(xù))存儲過程的用戶接口(1)創(chuàng)建存儲過程 (2)執(zhí)行存儲過程 (3)修改存儲過程(4)刪除存儲過程 2. 存儲過程的用戶接口(1)創(chuàng)建存儲過程CREATE OR REPLACE PROCEDURE 過程名(參數(shù)1,參數(shù)2,.) AS ;過程名:數(shù)據(jù)庫服務(wù)器合法的對象標(biāo)識參數(shù)列表:用名字來標(biāo)識調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù)

32、,默認(rèn)為輸入?yún)?shù)過程體:是一個,包括聲明部分和可執(zhí)行語句部分 存儲過程的用戶接口(續(xù))例8.8 利用存儲過程來實(shí)現(xiàn)下面的應(yīng)用:從賬戶1轉(zhuǎn)指定數(shù)額的款項(xiàng)到賬戶2中。CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount INT,amount FLOAT) /*定義存儲過程TRANSFER,其參數(shù)為轉(zhuǎn)入賬戶、轉(zhuǎn)出賬戶、轉(zhuǎn)賬額度*/AS DECLARE/*定義變量*/ totalDepositOut Float; totalDepositIn Float;inAccountnum INT;存儲過程的用戶接口(續(xù)) BEGIN /*檢

33、查轉(zhuǎn)出賬戶的余額 */ SELECT Total INTO totalDepositOut FROM Accout WHERE accountnum=outAccount; IF totalDepositOut IS NULL THEN /*如果轉(zhuǎn)出賬戶不存在或賬戶中沒有存款*/ ROLLBACK; /*回滾事務(wù)*/ RETURN; END IF; 存儲過程的用戶接口(續(xù))IF totalDeposit Out amount THEN /*如果賬戶存款不足*/ROLLBACK; /*回滾事務(wù)*/RETURN;END IF;SELECT Accountnum INTO inAccountnum

34、FROM AccountWHERE accountnum=inAccount;IF inAccount IS NULL THEN /*如果轉(zhuǎn)入賬戶不存在*/ ROLLBACK; /*回滾事務(wù)*/RETURN;ENDIF;存儲過程的用戶接口(續(xù))UPDATE Account SET total=total-amount WHERE accountnum=outAccount; /* 修改轉(zhuǎn)出賬戶余額,減去轉(zhuǎn)出額 */UPDATE Account SET total=total + amount WHERE accountnum=inAccount; /* 修改轉(zhuǎn)入賬戶余額,增加轉(zhuǎn)入額 */COM

35、MIT; /* 提交轉(zhuǎn)賬事務(wù) */END;存儲過程的用戶接口(續(xù))(2)執(zhí)行存儲過程 CALL/PERFORM PROCEDURE 過程名(參數(shù)1,參數(shù)2,.);使用CALL或者PERFORM等方式激活存儲過程的執(zhí)行在過程化SQL中,數(shù)據(jù)庫服務(wù)器支持在過程體中調(diào)用其他存儲過程存儲過程的用戶接口(續(xù))例8.9 從賬戶01003815868轉(zhuǎn)10000元到01003813828賬戶中。 CALL PROCEDURE TRANSFER(01003813828,01003815868,10000);存儲過程的用戶接口(續(xù))(3)修改存儲過程 ALTER PROCEDURE 過程名1 RENAME TO

36、 過程名2;(4)刪除存儲過程 DROP PROCEDURE 過程名();8.3 存儲過程和函數(shù)8.3.1 存儲過程8.3.2 函數(shù)*8.3.3 過程化SQL中的游標(biāo)8.3.2 函數(shù)函數(shù)和存儲過程的異同同:都是持久性存儲模塊異:函數(shù)必須指定返回的類型函數(shù)(續(xù))1. 函數(shù)的定義語句格式CREATE OR REPLACE FUNCTION 函數(shù)名 (參數(shù)1,參數(shù)2,) RETURNS AS ;2. 函數(shù)的執(zhí)行語句格式CALL/SELECT 函數(shù)名 (參數(shù)1,參數(shù)2,);3. 修改函數(shù)重命名ALTER FUNCTION 過程名1 RENAME TO 過程名2;重新編譯ALTER FUNCTION 過

37、程名 COMPILE;第八章 數(shù)據(jù)庫編程8.1 嵌入式SQL8.2 過程化SQL8.3 存儲過程和函數(shù)8.4 ODBC編程*8.5 OLE DB*8.6 JDBC編程8.7 小結(jié)8.4 ODBC編程ODBC優(yōu)點(diǎn)移植性好能同時(shí)訪問不同的數(shù)據(jù)庫共享多個數(shù)據(jù)資源 8.4 ODBC編程8.4.1 ODBC概述8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基礎(chǔ) 8.4.4 ODBC的工作流程8.4.1 ODBC概述ODBC產(chǎn)生的原因由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個關(guān)系數(shù)據(jù)庫管理系統(tǒng)下編寫的應(yīng)用程序就不能在另一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)下運(yùn)行 許多應(yīng)用程序需要共享多個部門的數(shù)據(jù)資源,訪問

38、不同的關(guān)系數(shù)據(jù)庫管理系統(tǒng)ODBC概述(續(xù))ODBC是微軟公司開放服務(wù)體系(Windows Open Services Architecture,WOSA)中有關(guān)數(shù)據(jù)庫的一個組成部分 提供了一組訪問數(shù)據(jù)庫的應(yīng)用程序編程接口(Application Programming Interface,API )ODBC約束力規(guī)范應(yīng)用開發(fā)規(guī)范關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用接口8.4 ODBC編程8.4.1 ODBC概述8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基礎(chǔ) 8.4.4 ODBC的工作流程8.4.2 ODBC工作原理概述ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu) 1. 用戶應(yīng)用程序 2. ODBC驅(qū)動程

39、序管理器 3. 數(shù)據(jù)庫驅(qū)動程序4. 數(shù)據(jù)源ODBC工作原理概述(續(xù))數(shù)據(jù)源KingbaseES數(shù)據(jù)源Oracle數(shù)據(jù)源SQL Server用戶應(yīng)用程序ODBC應(yīng)用程序編程接口ODBC驅(qū)動程序管理器數(shù)據(jù)庫驅(qū)動程序2數(shù)據(jù)庫驅(qū)動程序1數(shù)據(jù)庫驅(qū)動程序3網(wǎng)絡(luò)圖8.3 ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu)1. 用戶應(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ù)源的連接2. ODBC驅(qū)動程序管理器 驅(qū)動程序管理器:用來管理各種驅(qū)動程序 包含在ODB

40、C32.DLL中 管理應(yīng)用程序和驅(qū)動程序之間的通信 建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序ODBC驅(qū)動程序管理器(續(xù)) 主要功能:裝載ODBC驅(qū)動程序選擇和連接正確的驅(qū)動程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的合法性記錄ODBC函數(shù)的調(diào)用等3. 數(shù)據(jù)庫驅(qū)動程序ODBC通過驅(qū)動程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺的獨(dú)立性 ODBC應(yīng)用程序不能直接存取數(shù)據(jù)庫其各種操作請求由驅(qū)動程序管理器提交給某個關(guān)系數(shù)據(jù)庫管理系統(tǒng)的ODBC驅(qū)動程序通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應(yīng)用程序如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接到不同的驅(qū)動程序上

41、數(shù)據(jù)庫驅(qū)動程序(續(xù))ODBC驅(qū)動程序類型單束數(shù)據(jù)源和應(yīng)用程序在同一臺機(jī)器上驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作驅(qū)動程序相當(dāng)于數(shù)據(jù)管理器 多束 支持客戶機(jī)服務(wù)器、客戶機(jī)應(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ù) 4. ODBC數(shù)據(jù)源管理 數(shù)據(jù)源:是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,是一種數(shù)據(jù)連接的抽象ODBC數(shù)據(jù)源管理 (續(xù))數(shù)據(jù)源對最終用戶是透明的 ODBC給每個被訪問的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(Data Source Name,簡稱DSN),并映射到所有必

42、要的、用來存取數(shù)據(jù)的低層軟件在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等最終用戶無須知道數(shù)據(jù)庫管理系統(tǒng)或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動程序的細(xì)節(jié)ODBC數(shù)據(jù)源管理(續(xù))例如,假設(shè)某個學(xué)校在SQL Server和KingbaseES上創(chuàng)建了兩個數(shù)據(jù)庫:學(xué)校人事數(shù)據(jù)庫和教學(xué)科研數(shù)據(jù)庫。學(xué)校的信息系統(tǒng)要從這兩個數(shù)據(jù)庫中存取數(shù)據(jù)為了方便地與兩個數(shù)據(jù)庫連接,為學(xué)校人事數(shù)據(jù)庫創(chuàng)建一個數(shù)據(jù)源名PERSON,為教學(xué)科研數(shù)據(jù)庫創(chuàng)建一個名為EDU的數(shù)據(jù)源當(dāng)要訪問每一個數(shù)據(jù)庫時(shí),只要與PERSON和EDU連接即可,不需要記住使用的驅(qū)動程序、服務(wù)器名稱、數(shù)據(jù)庫名 8.4 ODBC編程8.

43、4.1 ODBC概述8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基礎(chǔ) 8.4.4 ODBC的工作流程8.4.3 ODBC API 基礎(chǔ)ODBC 應(yīng)用程序編程接口的一致性 API一致性包含核心級、擴(kuò)展1級、擴(kuò)展2級語法一致性包含最低限度SQL語法級、核心SQL語法級、擴(kuò)展SQL語法級 ODBC API 基礎(chǔ)(續(xù))1. 函數(shù)概述2. 句柄及其屬性3. 數(shù)據(jù)類型1. 函數(shù)概述ODBC 3.0 標(biāo)準(zhǔn)提供了76個函數(shù)接口分配和釋放環(huán)境句柄、連接句柄、語句句柄連接函數(shù)(SQLDriverconnect等)與信息相關(guān)的函數(shù)(SQLGetinfo、SQLGetFuction等)事務(wù)處理函數(shù)

44、(如SQLEndTran)執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等)編目函數(shù),ODBC 3.0提供了11個編目函數(shù),如SQLTables、SQLColumn等。應(yīng)用程序可以通過對編目函數(shù)的調(diào)用來獲取數(shù)據(jù)字典的信息,如權(quán)限、表結(jié)構(gòu)等 函數(shù)概述(續(xù))ODBC不同版本上的函數(shù)和函數(shù)使用是有差異的,讀者必須注意使用的版本,目前最新的版本是ODBC 3.82. 句柄及其屬性句柄是32位整數(shù)值,代表一個指針 ODBC 3.0中句柄分類環(huán)境句柄連接句柄語句句柄描述符句柄 句柄及其屬性(續(xù))應(yīng)用程序句柄之間的關(guān)系每個ODBC應(yīng)用程序需要建立一個ODBC環(huán)境,分配一個環(huán)境句柄,存取數(shù)據(jù)的

45、全局性背景,如環(huán)境狀態(tài)、當(dāng)前環(huán)境狀態(tài)診斷、當(dāng)前在環(huán)境上分配的連接句柄等一個環(huán)境句柄可以建立多個連接句柄,每一個連接句柄實(shí)現(xiàn)與一個數(shù)據(jù)源之間的連接句柄及其屬性(續(xù))ODBC應(yīng)用程序環(huán)境句柄連接句柄語句句柄數(shù)據(jù)源描述符句柄111n1n111n圖8.4 應(yīng)用程序句柄之間的關(guān)系句柄及其屬性(續(xù))應(yīng)用程序句柄之間的關(guān)系(續(xù))在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關(guān)的信息等在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合3. 數(shù)據(jù)類型 ODBC數(shù)據(jù)類型SQL數(shù)據(jù)類型:用于數(shù)據(jù)源 C數(shù)據(jù)類型 :用于應(yīng)用程序的C

46、代碼 應(yīng)用程序可以通過SQLGetTypeInfo來獲取不同的驅(qū)動程序?qū)τ跀?shù)據(jù)類型的支持情況 數(shù)據(jù)類型(續(xù))SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則SQL數(shù)據(jù)類型C數(shù)據(jù)類型SQL數(shù)據(jù)類型數(shù)據(jù)源之間轉(zhuǎn)換應(yīng)用程序變量傳送到語句參數(shù)(SQLBindparameter)C數(shù)據(jù)類型從結(jié)果集列中返回到應(yīng)用程序變量(SQLBindcol)應(yīng)用程序變量之間轉(zhuǎn)換8.4 ODBC編程8.4.1 ODBC概述8.4.2 ODBC工作原理概述 8.4.3 ODBC API 基礎(chǔ) 8.4.4 ODBC的工作流程8.4.4 ODBC的工作流程ODBC的工作流程ODBC的工作流程(續(xù))例8.11 將KingbaseES數(shù)據(jù)

47、庫中Student表的數(shù)據(jù)備份到SQL Server數(shù)據(jù)庫中。該應(yīng)用涉及兩個不同的關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)源使用ODBC來開發(fā)應(yīng)用程序,只要改變應(yīng)用程序中連接函數(shù)(SQLConnect)的參數(shù),就可以連接不同關(guān)系數(shù)據(jù)庫管理系統(tǒng)的驅(qū)動程序,連接兩個數(shù)據(jù)源ODBC的工作流程(續(xù))在應(yīng)用程序運(yùn)行前,已經(jīng)在KingbaseES和SQL Server中分別建立了Student關(guān)系表應(yīng)用程序要執(zhí)行的操作在KingbaseES上執(zhí)行SELECT * FROM Student;把獲取的結(jié)果集,通過多次執(zhí)行INSERT語句插入到SQL Server的Student表中 ODBC的工作流程(續(xù))操作步驟1. 配

48、置數(shù)據(jù)源2. 初始化環(huán)境3. 建立連接 4. 分配語句句柄5. 執(zhí)行SQL語句6. 結(jié)果集處理7. 中止處理1. 配置數(shù)據(jù)源配置數(shù)據(jù)源有兩種方法運(yùn)行數(shù)據(jù)源管理工具來進(jìn)行配置使用Driver Manager 提供的ConfigDsn函數(shù)來增加、修改或刪除數(shù)據(jù)源在例8.12中,采用第一種方法創(chuàng)建數(shù)據(jù)源。因?yàn)橐瑫r(shí)用到KingbaseES和SQL Server,所以分別建立兩個數(shù)據(jù)源,將其取名為KingbaseES ODBC和SQL Server 配置數(shù)據(jù)源(續(xù))例8.12 創(chuàng)建數(shù)據(jù)源的詳細(xì)過程 #include #include #include #include #include #includ

49、e #define SNO_LEN 30#define NAME_LEN 50#define DEPART_LEN 100#define SSEX_LEN 5配置數(shù)據(jù)源(續(xù))創(chuàng)建數(shù)據(jù)源-第一步:定義句柄和變量int main()/* Step 1 定義句柄和變量 */*以king開頭的表示的是連接KingbaseES的變量*/*以server開頭的表示的是連接SQLServer的變量*/SQLHENV kinghenv,serverhenv; /*環(huán)境句柄*/SQLHDBC kinghdbc,serverhdbc; /*連接句柄*/SQLHSTMT kinghstmt,serverhstmt;

50、 /*語句句柄*/SQLRETURN ret;SQLCHAR sNameNAME_LEN,sDepartDEPART_LEN,sSexSSEX_LEN,sSnoSNO_LEN;SQLINTEGER sAge;SQLINTEGER cbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,cbName=SQL_NTS,cbDepart=SQL_NTS;2. 初始化環(huán)境沒有和具體的驅(qū)動程序相關(guān)聯(lián),由Driver Manager來進(jìn)行控制 ,并配置環(huán)境屬性 應(yīng)用程序通過調(diào)用連接函數(shù)和某個數(shù)據(jù)源進(jìn)行連接后,Driver Manager才調(diào)用所連的驅(qū)動程序中的SQLAllocHandle,

51、來真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu) 初始化環(huán)境(續(xù))創(chuàng)建數(shù)據(jù)源-第二步:初始化環(huán)境/* Step 2 初始化環(huán)境 */ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &kinghenv);ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &serverhenv);ret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);ret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_V

52、ERSION, (void*)SQL_OV_ODBC3, 0);3. 建立連接 應(yīng)用程序調(diào)用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數(shù)據(jù)源連接 SQLConnect連接函數(shù)的輸入?yún)?shù)為:配置好的數(shù)據(jù)源名稱用戶ID口令 例8.12中KingbaseES ODBC為數(shù)據(jù)源名字,SYSTEM為用戶名,MANAGER為用戶密碼 建立連接(續(xù))創(chuàng)建數(shù)據(jù)源-第三步:建立連接/* Step 3 建立連接 */ret=SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, &kinghdb

53、c);ret=SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);ret=SQLConnect(kinghdbc,“KingbaseES ODBC”, SQL_NTS,“SYSTEM”,SQL_NTS, MANAGER,SQL_NTS);if (!SQL_SUCCEEDED(ret)/*連接失敗時(shí)返回錯誤值*/return -1;ret=SQLConnect(serverhdbc, SQLServer, SQL_NTS, sa“,SQL_NTS,sa,SQL_NTS);if (!SQL_SUCCEEDED(ret) )/*連接失敗時(shí)返

54、回錯誤值*/return -1;4. 分配語句句柄處理任何SQL語句之前,應(yīng)用程序還需要首先分配一個語句句柄 語句句柄含有具體的SQL語句以及輸出的結(jié)果集等信息 應(yīng)用程序還可以通過SQLtStmtAttr來設(shè)置語句屬性(也可以使用默認(rèn)值) 分配語句句柄(續(xù))創(chuàng)建數(shù)據(jù)源-第四步/* Step 4 初始化語句句柄 */ret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER) SQL_BIND_BY_COLUMN,

55、SQL_IS_INTEGER);ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc, &serverhstmt);例8.12中分配了兩個語句句柄一個用來從KingbaseES中讀取數(shù)據(jù)產(chǎn)生結(jié)果集(kinghstmt)一個用來向SQL Server插入數(shù)據(jù)(serverhstmt) 例8.12中結(jié)果集綁定的方式為按列綁定5. 執(zhí)行SQL語句應(yīng)用程序處理SQL語句的兩種方式預(yù)處理(SQLPrepare、SQLExecute適用于語句的多次執(zhí)行)直接執(zhí)行(SQLExecdirect) 如果SQL語句含有參數(shù),應(yīng)用程序?yàn)槊總€參數(shù)調(diào)用SQLBindParamete

56、r,并把它們綁定至應(yīng)用程序變量 應(yīng)用程序可以直接通過改變應(yīng)用程序緩沖區(qū)的內(nèi)容從而在程序中動態(tài)改變SQL語句的具體執(zhí)行執(zhí)行SQL語句(續(xù))應(yīng)用程序根據(jù)語句類型進(jìn)行的處理有結(jié)果集的語句(select或是編目函數(shù)),則進(jìn)行結(jié)果集處理沒有結(jié)果集的函數(shù),可以直接利用本語句句柄繼續(xù)執(zhí)行新的語句或是獲取行計(jì)數(shù)(本次執(zhí)行所影響的行數(shù))之后繼續(xù)執(zhí)行在插入數(shù)據(jù)時(shí),采用了預(yù)編譯的方式,首先通過SQLPrepare來預(yù)處理SQL語句,然后將每一列綁定到用戶緩沖區(qū) 執(zhí)行SQL語句(續(xù))創(chuàng)建數(shù)據(jù)源-第五步:執(zhí)行SQL語句/* Step 5 兩種方式執(zhí)行語句 */* 預(yù)編譯帶有參數(shù)的語句 */ret=SQLPrepare(

57、serverhstmt,INSERT INTO STUDENT(SNO,SNAME, SSEX, SAGE,SDEPT) VALUES (?, ?, ?, ?, ?), SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sSno,0, &cbSno); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,sName,0,&cbName);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,2,0,s

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論