版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
SQL過程化SQL過程和函數(shù)ODBC編程*8.5
OLE
DB*8.6
JDBC編程8.7
小結(jié)SQL語言提供了兩種不同的使用方式交互式為什么要引入
SQLSQL語言是非過程性語言事務(wù)處理應(yīng)用需要高級語言這兩種方式細節(jié)上有差別,在程序設(shè)計的環(huán)境下,SQL語句要做某些必要的擴充SQL的處理過程SQL語句與主語言之間的通信不用游標的SQL語句使用游標的SQL語句動態(tài)SQL主語言
SQL是將SQL語句嵌入程序設(shè)計語言中,被嵌入的程序設(shè)計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。處理過程預(yù)編譯方法含SQL語句的主語言程序關(guān)系數(shù)據(jù)庫管理系統(tǒng)預(yù)處理程序轉(zhuǎn)換
SQL語句為函數(shù)調(diào)用轉(zhuǎn)換后的
主語言程序主語言編譯程序編譯處理目標語言程序為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXEC
SQL,主語言為C語言時,語句格式:EXEC
SQL
<SQL語句>;SQL的處理過程SQL語句與主語言之間的通信不用游標的SQL語句使用游標的SQL語句動態(tài)SQL將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句SQL語句描述性的面向集合的語句負責
數(shù)據(jù)庫高級語言語句過程性的面向記錄的語句負責控制邏輯流程它們之間應(yīng)該如何通信?數(shù)據(jù)庫工作單元與源程序工作單元之間的通信向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息,使主語言能夠據(jù)此控制程序流程,主要用SQL通信區(qū)實現(xiàn)主語言向SQL語句提供參數(shù),主要用主變量實現(xiàn)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交主語言處理,主要用主變量和游標實現(xiàn)SQLCA:
SQL
Communication
AreaSQLCA是一個數(shù)據(jù)結(jié)構(gòu)SQLCA的用途SQL語句執(zhí)行后,系統(tǒng)反饋給應(yīng)用程序信息描述系統(tǒng)當前工作狀態(tài)描述運行環(huán)境這些信息將送到SQL通信區(qū)中應(yīng)用程序從SQL通信區(qū)中取出這些狀態(tài)信息,據(jù)此決定接下來執(zhí)行的語句SQLCA使用方法定義SQLCA用EXEC
SQL
INCLUDE
SQLCA定義使用SQLCASQLCA中有一個存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯應(yīng)用程序每執(zhí)行完一條SQL
語句之后都應(yīng)該測試一下
SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理主變量
SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)在SQL語句中使用的主語言程序變量簡稱為主變量(Host
Variable)主變量的類型輸入主變量由應(yīng)用程序?qū)ζ滟x值,SQL語句輸出主變量由SQL語句對其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序指示變量是一個整型變量,用來“指示”所指主變量的值或條件一個主變量可以附帶一個指示變量(Indicator
Variable)指示變量的用途指示輸入主變量是否為空值檢測輸出變量是否為空值,值是否被截斷在SQL語句中使用主變量和指示變量的方法說明主變量和指示變量BEGIN
DECLARE
SECTION......
(說明主變量和指示變量)...END
DECLARE
SECTION在SQL語句中使用主變量和指示變量的方法(續(xù))使用主變量說明之后的主變量可以在SQL語句中任何一個能夠使用表達式的地方出現(xiàn)為了與數(shù)據(jù)庫對象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(:)作為標志使用指示變量指示變量前也必須加冒號標志必須緊跟在所指主變量之后在SQL語句之外(主語言語句中)使用主變量和指示變量的方法可以直接
,不必加冒號為什么要使用游標SQL語言與主語言具有不同數(shù)據(jù)處理方式SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄主語言是面向記錄的,一組主變量一次只能存放一條記錄僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求
SQL引入了游標的概念,用來協(xié)調(diào)這兩種不同的處理方式游標游標是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果每個游標區(qū)都有一個名字用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理1
建立數(shù)據(jù)庫連接EXEC
SQL
CONNECT
TOname][USER
user-name];[AS
connection-是要連接的數(shù)據(jù)庫服務(wù)器常見的服務(wù)器標識串,如<dbname>@<hostname>:<port>包含服務(wù)器標識的SQL串常量DEFAULTconnect-name是可選的連接名,連接名必須是一個有效的標識符在整個程序內(nèi)只有
接時可以不指定連接名程序運行過程中可以修改當前連接EXEC
SQL
SET
CONNECTION
connection-name|DEFAULT;(2)關(guān)閉數(shù)據(jù)庫連接EXEC
SQL
DISCONNECT
[connection];[例8.1]
依次檢查某個系的學生記錄,交互式更新某些學生
。/*主變量說明開始*//*主變量說明結(jié)束*/EXEC
SQL
BEGIN
DECLARE
SECTION;char
Deptname[20];char
Hsno[9];char
Hsname[20];char
Hssex[2];
int
HSage;int
NEWAGE;EXEC
SQL
END
DECLARE
SECTION;long
SQLCODE;EXEC
SQL
INCLUDE
SQLCA;/*定義SQL通信區(qū)*//*C語言主程序開始*/int
main(void){int count
=
0;char
yn;/*變量yn代表yes或no*/printf("Please
choose
the
department
name(CS/MA/IS):
");scanf("%s",deptname);/*為主變量deptname賦值*/EXEC
SQL
CONNECT
TO
TEST@localhost:54321
USER"SYSTEM"/"MANAGER";/*連接數(shù)據(jù)庫TEST*//*定義游標SX*//*SX對應(yīng)的語句*/EXEC
SQL
DECLARE
SX
CURSOR
FORSELECT
Sno,Sname,Ssex,SageFROM
StudentWHERE
SDept
=
:deptname;EXEC
SQL
OPEN
SX;/*打開游標SX,指向查詢結(jié)果的第一行*//*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/for
(
;
;
){EXEC
SQL
FETCH
SX
INTO
:HSno,:Hsname,:HSsex,:HSage;/*推進游標,將當前數(shù)據(jù)放入主變量*/if
(SQLCA.SQLCODE!=
0)/*SQLCODE!=0,表示操作不成功*/break;if(count++
==
0)/*利用SQLCA中的狀態(tài)信息決定何時退出循環(huán)*//*如果是第一行的話,先打出行頭*/printf("\n%-10s
%-20s
%-10s
%-10s\n","Sno“,"Sname“,"Ssex",
"Sage");printf("%-10s
%-20s
%-10s
%-10d\n“,HSno,Hsname,Hssex,HSage);/*打印查詢結(jié)果*/printf(“UPDATE
AGE(y/n)?”);
/*詢問用戶是否要更新該學生的
*/do{scanf("%c",&yn);}while(yn
!=
'N'
&&
yn
!=
'n'
&&
yn
!=
'Y'
&&
yn
!=
'y');/*如果選擇更新操作*/if
(yn
==
'y'
||
yn
==
'Y'){/*用戶輸入新/*到主變量中*/SQL更新語句*/printf("INPUT
NEW
AGE:");scanf("%d",&NEWAGE);EXEC
SQL
UPDATE
Student}SET
Sage
=
:NEWAGEWHERE
CURRENT
OF
SX;/*對當前游標指向的學生進行更新*/}EXEC
SQL
CLOSE
SX;EXEC
SQL
COMMITWORK;/*關(guān)閉游標SX,不再和查詢結(jié)果對應(yīng)*//*提交更新*/EXEC
SQL
DISCONNECT
TEST;/*斷開數(shù)據(jù)庫連接*/}SQL的處理過程SQL語句與主語言之間的通信不用游標的SQL語句使用游標的SQL語句動態(tài)SQL不用游標的SQL語句的種類說明性語句數(shù)據(jù)定義語句數(shù)據(jù)控制語句查詢結(jié)果為單記錄的SELECT語句非CURRENT形式的增刪改語句1.查詢結(jié)果為單記錄的SELECT語句2.非CURRENT形式的增刪改語句這類語句不需要使用游標,只需用INTO子句指定存放查詢結(jié)果的主變量。[例8.2]
根據(jù)學生號碼查詢學生信息。EXEC
SQL
SELECT
Sno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROM
StudentWHERE
Sno=:givensno;/*把要查詢的學生的學號賦給為了主變量givensno*/INTO子句、WHERE子句和HAVING短語的條件表達式中均可以使用主變量查詢返回的記錄中,可能某些列為空值NULL
如果查詢結(jié)果實際上并不是單條記錄,而是多條記錄,則程序出錯,關(guān)系數(shù)據(jù)庫管理系統(tǒng)會在
SQLCA中返回錯誤信息[例8.3]
查詢某個學生選修某門課程的成績。假設(shè)已經(jīng)把將要查詢的學生的學號賦給了主變量givensno,將課程號賦給了主變量
o。EXEC
SQL
SELECTINTOo,Gradeo,:Hgrade:Gradeid/*指示變量Gradeid*/FROM
SCWHERE
Sno=:givensno
AND
o;如果Gradeid<0,不論Hgrade為何值,均認為該學生成績?yōu)榭罩?。在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量[例8.4]修改某個學生選修1號課程的成績。EXEC
SQL
UPDATE
SCSET
Grade=:newgrade/*修改的成績已賦給主變量:newgrade*/WHERE
Sno=:givensno;/*學號賦給主變量:givensno*/[例8.5]
某個學生新選修了某門課程,將有關(guān)記錄SC表中。假設(shè)
的學號已賦給主變量stdno,課程號已賦給主變量couno。/*gradeid為指示變量,賦為負值*/gradeid=-1;
EXEC
SQL
INSERTINTO
SC(o,Grade)VALUES(:stdno,:couno,:gr
:gradeid);/*:stdno,:couno,:gr為主變量*/由于該學生剛選修課程,成績應(yīng)為空,所以要把指示變量賦為負值SQL的處理過程SQL語句與主語言之間的通信不用游標的SQL語句使用游標的SQL語句動態(tài)SQL必須使用游標的SQL語句查詢結(jié)果為多條記錄的SELECT語句CURRENT形式的UPDATE語句CURRENT形式的DELETE語句1.查詢結(jié)果為多條記錄的SELECT語句2.CURRENT形式的UPDATE和DELETE語句使用游標的步驟說明游標打開游標推進游標指針并取當前記錄關(guān)閉游標使用DECLARE語句語句格式EXEC
SQL
DECLARE<游標名>CURSORFOR<SELECT語句>;功能是一條說明性語句,這時關(guān)系數(shù)據(jù)庫管理系統(tǒng)并不執(zhí)行SELECT語句使用OPEN語句語句格式EXEC
SQL
OPEN<游標名>;功能打開游標實際上是執(zhí)行相應(yīng)的SELECT語句,把查詢結(jié)果取到緩沖區(qū)中這時游標處于活動狀態(tài),指針指向查詢結(jié)果集中的第一條記錄使用FETCH語句語句格式EXEC
SQL
FETCH<游標名>INTO<主變量>[<指示變量>][,<主變量>[<指示變量>]]...;功能指定方向推動游標指針,同時將緩沖區(qū)中的當前記錄取出來送至主變量供主語言進一步處理使用CLOSE語句語句格式EXEC
SQL
CLOSE<游標名>;功能關(guān)閉游標,
結(jié)果集占用的緩沖區(qū)及其他資源說明游標被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系被關(guān)閉的游標可以再次被打開,與新的查詢結(jié)果相聯(lián)系CURRENT形式的UPDATE語句和DELETE語句的用途非CURRENT形式的UPDATE語句和DELETE語句面向集合的操作一次修改或刪除所有滿足條件的記錄CURRENT形式的UPDATE語句和DELETE語句的用途(續(xù))如果只想修改或刪除其中某個記錄用帶游標的SELECT語句查出所有滿足條件的記錄從中進一步找出要修改或刪除的記錄用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之UPDATE語句和DELETE語句中要用子句WHERE
CURRENT
OF<游標名>表示修改或刪除的是最近一次取出的記錄,即游標指針指向的記錄不能使用CURRENT形式的UPDATE語句和DELETE語句當游標定義中的SELECT語句帶有UNION或ORDERBY子句該SELECT語句相當于定義了一個不可更新的視圖SQL的處理過程SQL語句與主語言之間的通信不用游標的SQL語句使用游標的SQL語句動態(tài)SQL靜態(tài)靜態(tài)SQLSQL語句能夠滿足一般要求要到執(zhí)行時才能夠確定要提交的SQL語句、查詢的條件動態(tài)
SQL允許在程序運行過程中臨時“組裝”SQL語句支持動態(tài)組裝SQL語句和動態(tài)參數(shù)兩種形式使用SQL語句主變量動態(tài)參數(shù)執(zhí)行準備好的語句(EXECUTE)SQL語句主變量程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行[例8.6]
創(chuàng)建基本表TEST。EXEC
SQL
BEGIN
DECLARE
SECTION;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語句*/動態(tài)參數(shù)SQL語句中的可變元素使用參數(shù)符號(?)表示該位置的數(shù)據(jù)在運行時設(shè)定和主變量的區(qū)別動態(tài)參數(shù)的輸入不是編譯時完成綁定而是通過PREPARE語句準備主變量和執(zhí)行語句
EXECUTE綁定數(shù)據(jù)或主變量來完成使用動態(tài)參數(shù)的步驟SQL語句主變量準備SQL語句(PREPARE)EXEC
SQL
PREPARE<語句名>FROM
<SQL語句主變量>;EXEC
SQL
EXECUTE<語句名>[INTO<主變量表>][USING<主變量或常量>];[例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;/*準備語句*/...EXEC
SQL
EXECUTE
mystmt
USING
100;值100
*//*執(zhí)行語句,設(shè)定INSERT語句EXEC
SQL
EXECUTE
mystmt
USING
200;/*
執(zhí)行語句,設(shè)定INSERT語句值200
*/SQL過程化SQL過程和函數(shù)ODBC編程*8.5
OLE
DB*8.6
JDBC編程8.7
小結(jié)過程化SQL的塊結(jié)構(gòu)變量和常量的定義流程控制過程化SQLSQL的擴展增加了過程化語句功能基本結(jié)構(gòu)是塊塊之間可以互相嵌套每個塊完成一個邏輯操作過程化SQL塊的基本結(jié)構(gòu)定義部分DECLARE
變量、常量、游標、異常等定義的變量、常量等只能在該基本塊中使用當基本塊執(zhí)行結(jié)束時,定義就不再存在過程化SQL塊的基本結(jié)構(gòu)(續(xù))2.執(zhí)行部分BEGINSQL語句、過程化SQL的流程控制語句EXCEPTION異常處理部分END;過程化SQL的塊結(jié)構(gòu)變量和常量的定義流程控制1.變量定義變量名數(shù)據(jù)類型[[NOT
NULL]:=初值表達式]或變量名數(shù)據(jù)類型[[NOT
NULL]初值表達式]常量定義常量名數(shù)據(jù)類型CONSTANT:=常量表達式常量必須要給一個值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,過程化SQL將返回一個異常賦值語句變量名稱:=表達式過程化SQL的塊結(jié)構(gòu)變量和常量的定義流程控制過程化SQL功能條件控制語句循環(huán)控制語句錯誤處理1.條件控制語句IF-THEN,IF-THEN-ELSE和嵌套的IF語句1IF
condition
THENSequence_of_statements;END
IF;IF
condition
THENSequence_of_statements1;ELSESequence_of_statements2;END
IF;23
在THEN和ELSE子句中還可以再包含IF語句,即IF語句可以嵌套2.
循環(huán)控制語句LOOP,WHILE-LOOP和FOR-LOOP(1)簡單的循環(huán)語句LOOPLOOPSequence_of_statements;END
LOOP;多數(shù)數(shù)據(jù)庫服務(wù)器的過程化SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束2.循環(huán)控制語句(續(xù))2WHILE-LOOPWHILE
condition
LOOPSequence_of_statements;END
LOOP;每次執(zhí)行循環(huán)體語句之前,首先對條件進行求值如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列如果條件為假,則跳過循環(huán)并把控制傳遞給下一個語句2.循環(huán)控制語句(續(xù))(3)FOR-LOOPFOR
count
IN
[REVERSE]
bound1
…
bound2
LOOPSequence_of_statements;END
LOOP;3.錯誤處理如果過程化SQL在執(zhí)行時出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句SQL標準對數(shù)據(jù)庫服務(wù)器提供什么樣的異常處理做出了建議,要求過程化SQL管理器提供完善的異常處理機制SQL過程化SQL過程和函數(shù)ODBC編程*8.5
OLE
DB*8.6
JDBC編程8.7
小結(jié)過程函數(shù)*8.3.3
過程化SQL中的游標過程化SQL塊類型命名塊編譯后保存在數(shù)據(jù)庫中,可以被反復(fù)調(diào)用,運行速度較快,過程和函數(shù)是命名塊到數(shù)據(jù)庫中,塊每次執(zhí)行時都要進行編譯,它不能被也不能在其他過程化SQL塊中調(diào)用1.2.過程的優(yōu)點過程的用戶接口
過程:由過程化SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后在數(shù)據(jù)庫服務(wù)器中,使用時只要調(diào)用即可。過程的優(yōu)點運行效率高降低了客戶機和服務(wù)器之間的通信量方便實施企業(yè)規(guī)則過程的用戶接口創(chuàng)建
過程執(zhí)行
過程修改
過程刪除
過程1
創(chuàng)建
過程CREATE
OR
REPLACE
PROCEDURE
過程名([參數(shù)1,參數(shù)2,...])AS<過程化SQL塊>;過程名:數(shù)據(jù)庫服務(wù)器合法的對象標識參數(shù)列表:用名字來標識調(diào)用時給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù),默認為輸入?yún)?shù)過程體:是一個<過程化SQL塊>,包括部分和可執(zhí)行語句部分[例8.8]
利用
過程來實現(xiàn)下面的應(yīng)用:從賬戶1轉(zhuǎn)指定數(shù)額的款項到賬戶2中。CREATE
OR
REPLACE
PROCEDURETRANSFER(inAccount
INT,outAccount INT,amount
FLOAT)/*定義 過程TRANSFER,其參數(shù)為轉(zhuǎn)入賬戶、轉(zhuǎn)出賬戶、轉(zhuǎn)賬額度*/AS
DECLARE/*定義變量*/totalDepositOut
Float;totalDepositIn
Float;inAccountnum
INT;BEGIN/*檢查轉(zhuǎn)出賬戶的余額*/SELECT
Total
INTO
totalDepositOut
FROM
AccoutWHERE
accountnum=outAccount;IF
totalDepositOutIS
NULL
THEN/*如果轉(zhuǎn)出賬戶不存在或賬戶中沒有存款*//*回滾事務(wù)*/ROLLBACK;RETURN;END
IF;/*如果賬戶存款不足*//*回滾事務(wù)*/IF
totalDeposit
Out<
amount
THENROLLBACK;RETURN;END
IF;SELECT
Accountnum
INTO
inAccountnum
FROM
AccountWHERE
accountnum=inAccount;/*如果轉(zhuǎn)入賬戶不存在*//*回滾事務(wù)*/IF
inAccount
IS
NULL
THENROLLBACK;RETURN;ENDIF;UPDATE
Account
SET
total=total-amountWHERE
accountnum=outAccount;/*
修改轉(zhuǎn)出賬戶余額,減去轉(zhuǎn)出額*/UPDATE
Account
SET
total=total
+
amountWHEREaccountnum=inAccount;/*
修改轉(zhuǎn)入賬戶余額,增加轉(zhuǎn)入額*//*
提交轉(zhuǎn)賬事務(wù)*/COMMIT;END;(2)執(zhí)行
過程CALL/PERFORM PROCEDURE
過程名([參數(shù)1,參數(shù)2,...]);使用CALL或者PERFORM等方式激活
過程的執(zhí)行在過程化SQL中,數(shù)據(jù)庫服務(wù)器支持在過程體中調(diào)用其他存儲過程[例8.9]
從賬戶01003815868轉(zhuǎn)10000元到
01003813828賬戶中。CALL
PROCEDURETRANSFER(01003813828,01003815868,10000);3
修改
過程ALTER
PROCEDURE
過程名1 RENAME
TO
過程名2;4
刪除
過程DROP PROCEDURE
過程名();過程函數(shù)*8.3.3
過程化SQL中的游標函數(shù)和
過程的異同同:都是持久性
模塊異:函數(shù)必須指定返回的類型1.函數(shù)的定義語句格式CREATE
OR
REPLACE
FUNCTION
函數(shù)名
([參數(shù)1,參數(shù)2,…])
RETURNS
<類型> AS
<過程化SQL塊>;函數(shù)的執(zhí)行語句格式CALL/SELECT
函數(shù)名([參數(shù)1,參數(shù)2,…]);修改函數(shù)重命名ALTER
FUNCTION
過程名1
RENAME
TO
過程名2;重新編譯ALTER
FUNCTION
過程名COMPILE;SQL過程化SQL過程和函數(shù)ODBC編程*8.5
OLE
DB*8.6
JDBC編程8.7
小結(jié)ODBC優(yōu)點移植性好能同時不同的數(shù)據(jù)庫共享多個數(shù)據(jù)資源ODBC概述ODBC工作原理概述ODBC
API
基礎(chǔ)ODBC的工作流程ODBC產(chǎn)生的原因由于不同的數(shù)據(jù)庫管理系統(tǒng)的存在,在某個關(guān)系數(shù)據(jù)庫管理系統(tǒng)下編寫的應(yīng)用程序就不能在另一個關(guān)系數(shù)據(jù)庫管理系統(tǒng)下運行許多應(yīng)用程序需要共享多個部門的數(shù)據(jù)資源,不同的關(guān)系數(shù)據(jù)庫管理系統(tǒng)ODBC是微軟公司開放服務(wù)體系(Windows
Open
ServicesArchitecture,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)用接口ODBC概述ODBC工作原理概述ODBC
API
基礎(chǔ)ODBC的工作流程ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu)用戶應(yīng)用程序ODBC驅(qū)動程序管理器數(shù)據(jù)庫驅(qū)動程序數(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ò)An
Introduction
to
Database
System圖8.3
ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu)空間,定義所
的數(shù)ODBC應(yīng)用程序包括的內(nèi)容請求連接數(shù)據(jù)庫向數(shù)據(jù)源發(fā)送SQL語句為SQL語句執(zhí)行結(jié)果分配據(jù)格式獲取數(shù)據(jù)庫操作結(jié)果或處理錯誤進行數(shù)據(jù)處理并向用戶提交處理結(jié)果請求事務(wù)的提交和回滾操作斷開與數(shù)據(jù)源的連接驅(qū)動程序管理器:用來管理各種驅(qū)動程序包含在ODBC32.DLL中管理應(yīng)用程序和驅(qū)動程序之間的通信建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當前所安裝的數(shù)據(jù)庫ODBC驅(qū)動程序主要功能:裝載ODBC驅(qū)動程序選擇和連接正確的驅(qū)動程序管理數(shù)據(jù)源檢查ODBC調(diào)用參數(shù)的記錄ODBC函數(shù)的調(diào)用等ODBC通過驅(qū)動程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性O(shè)DBC應(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ū)動程序上ODBC驅(qū)動程序類型單束數(shù)據(jù)源和應(yīng)用程序在同一臺機器上驅(qū)動程序直接完成對數(shù)據(jù)文件的I/O操作驅(qū)動程序相當于數(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ù)數(shù)據(jù)源:是最終用戶需要的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,是一種數(shù)據(jù)連接的抽象數(shù)據(jù)源對最終用戶是透明的ODBC給每個被
的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(Data
Source
Name,簡稱DSN),并
到所有必要的、用來存取數(shù)據(jù)的低層在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫名等最終用戶無須知道數(shù)據(jù)庫管理系統(tǒng)或其他數(shù)據(jù)管理、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動程序的細節(jié)例如,假設(shè)某個學校在SQL
Server和KingbaseES上創(chuàng)建了兩個數(shù)據(jù)庫:學校人事數(shù)據(jù)庫和教學科研數(shù)據(jù)庫。學校的信息系統(tǒng)要從這兩個數(shù)據(jù)庫中存取數(shù)據(jù)為了方便地與兩個數(shù)據(jù)庫連接,為學校人事數(shù)據(jù)庫創(chuàng)建一個數(shù)據(jù)源名
,為教學科研數(shù)據(jù)庫創(chuàng)建一個名為EDU的數(shù)據(jù)源當要 每一個數(shù)據(jù)庫時,只要與 和EDU連接即可,不需要記住使用的驅(qū)動程序、服務(wù)器名稱、數(shù)據(jù)庫名ODBC概述ODBC工作原理概述ODBC
API
基礎(chǔ)ODBC的工作流程ODBC
應(yīng)用程序編程接口的一致性API一致性包含
級、擴展1級、擴展2級SQL語法級、擴展SQL語法一致性包含最低限度SQL語法級、語法級函數(shù)概述句柄及其屬性數(shù)據(jù)類型ODBC
3.0
標準提供了76個函數(shù)接口分配和
環(huán)境句柄、連接句柄、語句句柄連接函數(shù)(SQLDriverconnect等)與信息相關(guān)的函數(shù)(SQLGetinfo、SQLGetFuction等)事務(wù)處理函數(shù)(如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)等ODBC不同版本上的函數(shù)和函數(shù)使用是有差異的,讀者必須注意使用的版本,目前
的版本是ODBC
3.8句柄是32位整數(shù)值,代表一個指針ODBC
3.0中句柄分類環(huán)境句柄連接句柄語句句柄描述符句柄應(yīng)用程序句柄之間的關(guān)系每個ODBC應(yīng)用程序需要建立一個ODBC環(huán)境,分配一個環(huán)境句柄,存取數(shù)據(jù)的全局性背景,如環(huán)境狀態(tài)、當前環(huán)境狀態(tài)、當前在環(huán)境上分配的連接句柄等一個環(huán)境句柄可以建立多個連接句柄,每
接句柄實現(xiàn)與一個數(shù)據(jù)源之間的連接句柄及其屬性(續(xù))An
Introduction
to
Database
SystemODBC應(yīng)用程序11環(huán)境句柄1n連接句柄1n語句句柄11數(shù)據(jù)源1n描述符句柄圖8.4
應(yīng)用程序句柄之間的關(guān)系應(yīng)用程序句柄之間的關(guān)系(續(xù))在
接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關(guān)的信息等在ODBC
3.0中又提出了描述符句柄的概念,它是描述
SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合ODBC數(shù)據(jù)類型SQL數(shù)據(jù)類型:用于數(shù)據(jù)源C數(shù)據(jù)類型:用于應(yīng)用程序的C代碼應(yīng)用程序可以通過SQLGetTypeInfo來獲取不同的驅(qū)動程序?qū)τ跀?shù)據(jù)類型的支持情況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)換ODBC概述ODBC工作原理概述ODBC
API
基礎(chǔ)ODBC的工作流程ODBC的工作流程[例8.11]將KingbaseES數(shù)據(jù)庫中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ù)源在應(yīng)用程序運行前,已經(jīng)在KingbaseES和SQLServer中分別建立了Student關(guān)系表應(yīng)用程序要執(zhí)行的操作在KingbaseES上執(zhí)行SELECT
*
FROM
Student;把獲取的結(jié)果集,通過多次執(zhí)行INSERT語句
到SQL
Server的Student表中操作步驟配置數(shù)據(jù)源初始化環(huán)境建立連接分配語句句柄執(zhí)行SQL語句結(jié)果集處理中止處理配置數(shù)據(jù)源有兩種方法運行數(shù)據(jù)源管理工具來進行配置使用Driver
Manager
提供的ConfigDsn函數(shù)來增加、修改或刪除數(shù)據(jù)源在[例8.12]中,采用第
法創(chuàng)建數(shù)據(jù)源。因為要同時用到KingbaseES和SQLServer,所以分別建立兩個數(shù)據(jù)源,將其取名為KingbaseES
ODBC和SQL
Server[例8.12]
創(chuàng)建數(shù)據(jù)源的詳細過程#include
<stdlib.h>#include
<stdio.h>#include
<windows.h>#include
<sql.h>#include
<sqlext.h>#include
<Sqltypes.h>#define
SNO_LEN
30#define
NAME_LEN
50#define
DEPART_LEN
100#define
SSEX_LEN
5創(chuàng)建數(shù)據(jù)源---第一步:定義句柄和變量int
main(){
/*
Step
1
定義句柄和變量*//*以king開頭的表示的是連接KingbaseES的變量*//*以server開頭的表示的是連接SQLServer的變量*/SQLHENVSQLHDBCkinghenv,serverhenv;kinghdbc,serverhdbc;SQLHSTMT
kinghstmt,serverhstmt;/*環(huán)境句柄*//*連接句柄*//*語句句柄*/SQLRETURN
ret;SQLCHAR
sName[NAME_LEN],sDepart[DEPART_LEN],sSex[SSEX_LEN],sSno[SNO_LEN];SQLINTEGER
sAge;SQLINTEGERcbAge=0,cbSno=SQL_NTS,cbSex=SQL_NTS,cbName=SQL_NTS,cbDepart=SQL_NTS;沒有和具體的驅(qū)動程序相關(guān)聯(lián),由DriverManager來進行控制,并配置環(huán)境屬性應(yīng)用程序通過調(diào)用連接函數(shù)和某個數(shù)據(jù)源進行連接后,Driver
Manager才調(diào)用所連的驅(qū)動程序中的SQLAllocHandle,來真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu)創(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_VERSION,(void*)SQL_OV_ODBC3,
0);應(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為用戶創(chuàng)建數(shù)據(jù)源---第三步:建立連接/*
Step
3
建立連接*/ret=SQLAllocHandle(SQL_HANDLE_DBC,
kinghenv,&kinghdbc);ret=SQLAllocHandle(SQL_HANDLE_DBC,
serverhenv,&serverhdbc);ret=SQLConnect(kinghdbc,“KingbaseES
ODBC”,SQL_NTS,“SYSTEM”,SQL_NTS,
"MANAGER",SQL_NTS);if
(!SQL_SUCCEEDED(ret))/*連接失敗時返回錯誤值*/return
-1;ret=SQLConnect(serverhdbc,"SQLServer",
SQL_NTS,"sa“,SQL_NTS,"sa",SQL_NTS);if
(!SQL_SUCCEEDED(ret))/*連接失敗時返回錯誤值*/return
-1;處理任何SQL語句之前,應(yīng)用程序還需要首先分配一個語句句柄語句句柄含有具體的SQL語句以及輸出的結(jié)果集等信息應(yīng)用程序還可以通過SQLtStmtAttr來設(shè)置語句屬性(也可以使用默認值)創(chuàng)建數(shù)據(jù)源---第四步/*
Step4
初始化語句句柄*/ret=SQLAllocHandle(SQL_HANDLE_STMT,kinghdbc,&kinghstmt);ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL
IS
INTEGER);數(shù)據(jù)產(chǎn)生結(jié)果集[例8.12]中分配了兩個語句句柄一個用來從KingbaseES中(kinghstmt)一個用來向SQL
Server數(shù)據(jù)(serverhstmt)[例8.12]中結(jié)果集綁定的方式為按列綁定應(yīng)用程序處理SQL語句的兩種方式預(yù)處理(SQLPrepare、SQLExecute適用于語句的多次執(zhí)行)直接執(zhí)行(SQLExecdirect)如果SQL語句含有參數(shù),應(yīng)用程序為每個參數(shù)調(diào)用SQLBindParameter,并把它們綁定至應(yīng)用程序變量應(yīng)用程序可以直接通過改變應(yīng)用程序緩沖區(qū)的內(nèi)容從而在程序中動態(tài)改變SQL語句的具體執(zhí)行應(yīng)用程序根據(jù)語句類型進行的處理有結(jié)果集的語句(select或是編目函數(shù)),則進行結(jié)果集處理沒有結(jié)果集的函數(shù),可以直接利用本語句句柄繼續(xù)執(zhí)行新的語句或是獲取行計數(shù)(本次執(zhí)行所影響的行數(shù))之后繼續(xù)執(zhí)行在
數(shù)據(jù)時,采用了預(yù)編譯的方式,首先通過SQLPrepare來預(yù)處理SQL語句,然后將每一列綁定到用戶緩沖區(qū)創(chuàng)建數(shù)據(jù)源---第五步:執(zhí)行SQL語句/*
Step5
兩種方式執(zhí)行語句*//*
預(yù)編譯帶有參數(shù)的語句*/ret=SQLPrepare(serverhstmt,"INSERT
INTOSTUDENT(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,
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年互聯(lián)網(wǎng)醫(yī)療健康服務(wù)平臺合作協(xié)議
- 電子商務(wù)平臺合同管理及信息安全方案
- 2024年婚禮車隊租賃協(xié)議
- 2024年臨時建筑務(wù)工人員雇傭合同
- 2024年個人掛靠企業(yè)協(xié)議書
- 光伏電站大數(shù)據(jù)監(jiān)控技術(shù)合同(2024年版)
- 2024年合同法下的勞動合同
- 2024年工程項目管理的國際合同規(guī)范
- 2024年城市基礎(chǔ)設(shè)施建設(shè)打樁工程分包合同
- 2024年產(chǎn)品代理與合作合同
- 馬克思主義經(jīng)典著作選讀智慧樹知到課后章節(jié)答案2023年下四川大學
- 小學數(shù)學《倍的認識》教案基于學科核心素養(yǎng)的教學設(shè)計及教學反思
- 高中生如何交往人際關(guān)系主題班會課件
- GB/T 20638-2023步進電動機通用技術(shù)規(guī)范
- 垃圾滲濾液處理站運維及滲濾液處理投標方案(技術(shù)標)
- 3.3《不簡單的杠桿》課件
- 弗洛伊德生平及精神分析學說的發(fā)展歷程
- 四年級作文-記一次活動之有趣的搶凳子游戲(課堂PPT)
- 國企領(lǐng)導(dǎo)人員管理暫行規(guī)定
- 高校學生干部培訓(xùn)會新聞稿
- 招商引資面試題
評論
0/150
提交評論