日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)

發(fā)布時(shí)間:2023/12/15 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)庫(kù)從入門到精通:戳我

嵌入式SQL

SQL語言提供了兩種不同的使用方式

  • 交互式
  • 嵌入式

為什么要引入嵌入式SQL

  • SQL語言是非過程性語言
  • 事務(wù)處理應(yīng)用需要高級(jí)語言

這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語句要做某些必要的擴(kuò)充

一、嵌入式SQL的處理過程
主語言

  • 嵌入式SQL是將SQL語句嵌入程序設(shè)計(jì)語言中,被嵌入的程序設(shè)計(jì)語言,如C、C++、Java,稱為宿主語言,簡(jiǎn)稱主語言。

處理過程

  • 預(yù)編譯方法

為了區(qū)分SQL語句與主語言語句,所有SQL語句必須加前綴EXEC SQL,
主語言為C語言時(shí),語句格式:

EXEC SQL <SQL語句>;

二、嵌入式SQL語句與主語言之間的通信
將SQL嵌入到高級(jí)語言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語句
1.SQL語句

  • 描述性的面向集合的語句
  • 負(fù)責(zé)操縱數(shù)據(jù)庫(kù)

2.高級(jí)語言語句

  • 過程性的面向記錄的語句
  • 負(fù)責(zé)控制邏輯流程

3.數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間的通信
(1)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息,使主語言能夠據(jù)此控制程序流程,主要用SQL通信區(qū)實(shí)現(xiàn)
(2)主語言向SQL語句提供參數(shù),主要用主變量實(shí)現(xiàn)
(3)將SQL語句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語言處理,主要用主變量和游標(biāo)實(shí)現(xiàn)

4.SQLCA: SQL Communication Area
SQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu)
(1)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í)行的語句

(2)SQLCA使用方法

  • 定義SQLCA
    用EXEC SQL INCLUDE SQLCA定義
  • 使用SQLCA
    a. SQLCA中有一個(gè)存放每次執(zhí)行SQL語句后返回代碼的變量SQLCODE
    b. 如果SQLCODE等于預(yù)定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯(cuò)
    c. 應(yīng)用程序每執(zhí)行完一條SQL 語句之后都應(yīng)該測(cè)試一下SQLCODE的值,以了解該SQL語句執(zhí)行情況并做相應(yīng)處理

5.主變量

  • 嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數(shù)據(jù)
  • 在SQL語句中使用的主語言程序變量簡(jiǎn)稱為主變量 (Host Variable)

主變量的類型

  • 輸入主變量
    由應(yīng)用程序?qū)ζ滟x值,SQL語句引用
  • 輸出主變量
    由SQL語句對(duì)其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序

6.指示變量

  • 是一個(gè)整型變量,用來“指示”所指主變量的值或條件
  • 一個(gè)主變量可以附帶一個(gè)指示變量(Indicator Variable)
  • 指示變量的用途
    指示輸入主變量是否為空值
    檢測(cè)輸出變量是否為空值,值是否被截?cái)?/li>

7.在SQL語句中使用主變量和指示變量的方法

(1)說明主變量和指示變量

BEGIN DECLARE SECTION...... (說明主變量和指示變量)... END DECLARE SECTION

(2)使用主變量

  • 說明之后的主變量可以在SQL語句中任何一個(gè)能夠使用表達(dá)式的地方出現(xiàn)
  • 為了與數(shù)據(jù)庫(kù)對(duì)象名(表名、視圖名、列名等)區(qū)別,SQL語句中的主變量名前要加冒號(hào)(:)作為標(biāo)志

(3)使用指示變量

  • 指示變量前也必須加冒號(hào)標(biāo)志
  • 必須緊跟在所指主變量之后

(4)在SQL語句之外(主語言語句中)使用主變量和指示變量的方法:
可以直接引用,不必加冒號(hào)

8.使用游標(biāo)的原因

  • SQL語言與主語言具有不同數(shù)據(jù)處理方式
  • SQL語言是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄
  • 主語言是面向記錄的,一組主變量一次只能存放一條記錄
  • 僅使用主變量并不能完全滿足SQL語句向應(yīng)用程序輸出數(shù)據(jù)的要求
  • 嵌入式SQL引入了游標(biāo)的概念,用來協(xié)調(diào)這兩種不同的處理方式

9.游標(biāo)

  • 游標(biāo)是系統(tǒng)為用戶開設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果
  • 每個(gè)游標(biāo)區(qū)都有一個(gè)名字
  • 用戶可以用SQL語句逐一從游標(biāo)中獲取記錄,并賦給主變量,交由主語言進(jìn)一步處理

(1)建立數(shù)據(jù)庫(kù)連接

EXEC SQL CONNECT TO target[AS connection-name][USER user-name]; target是要連接的數(shù)據(jù)庫(kù)服務(wù)器 a.常見的服務(wù)器標(biāo)識(shí)串,如<dbname>@<hostname>:<port> b.包含服務(wù)器標(biāo)識(shí)的SQL串常量 c.DEFAULT d.connect-name是可選的連接名,連接名必須是一個(gè)有效的標(biāo)識(shí)符 e.在整個(gè)程序內(nèi)只有一個(gè)連接時(shí)可以不指定連接名 f.程序運(yùn)行過程中可以修改當(dāng)前連接 EXEC SQL SET CONNECTION connection-name|DEFAULT;

(2)關(guān)閉數(shù)據(jù)庫(kù)連接

EXEC SQL DISCONNECT [connection];

舉個(gè)例子
依次檢查某個(gè)系的學(xué)生記錄,交互式更新某些學(xué)生年齡。

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; /*主變量說明結(jié)束*/ long SQLCODE; EXEC SQL INCLUDE SQLCA; /*定義SQL通信區(qū)*/ int main(void) /*C語言主程序開始*/ {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ù)庫(kù)TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定義游標(biāo)SX*/SELECT Sno,Sname,Ssex,Sage /*SX對(duì)應(yīng)的語句*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打開游標(biāo)SX,指向查詢結(jié)果的第一行*/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 %-10s\n","Sno","Sname","Ssex", "Sage");printf("%-10s %-20s %-10s %-10d\n",HSno,Hsname,Hssex,HSage); /*打印查詢結(jié)果*/printf("UPDATE AGE(y/n)?"); /*詢問用戶是否要更新該學(xué)生的年齡*/do{scanf("%c",&yn);}while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');if (yn == 'y' || yn == 'Y') /*如果選擇更新操作*/{printf("INPUT NEW AGE:");scanf("%d",&NEWAGE); /*用戶輸入新年齡到主變量中*/EXEC SQL UPDATE Student /*嵌入式SQL更新語句*/SET Sage = :NEWAGEWHERE CURRENT OF SX;} /*對(duì)當(dāng)前游標(biāo)指向的學(xué)生年齡進(jìn)行更新*/}EXEC SQL CLOSE SX; /*關(guān)閉游標(biāo)SX,不再和查詢結(jié)果對(duì)應(yīng)*/EXEC SQL COMMIT WORK; /*提交更新*/EXEC SQL DISCONNECT TEST; /*斷開數(shù)據(jù)庫(kù)連接*/ }

三、不用游標(biāo)的SQL語句
(1)不用游標(biāo)的SQL語句的種類

  • 說明性語句
  • 數(shù)據(jù)定義語句
  • 數(shù)據(jù)控制語句
  • 查詢結(jié)果為單記錄的SELECT語句
  • 非CURRENT形式的增刪改語句

這類語句不需要使用游標(biāo),只需用INTO子句指定存放查詢結(jié)果的主變量。

[] 根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。 EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROM StudentWHERE Sno=:givensno; /*把要查詢的學(xué)生的學(xué)號(hào)賦給為了主變量givensno*/
  • INTO子句、WHERE子句和HAVING短語的條件表達(dá)式中均可以使用主變量
  • 查詢返回的記錄中,可能某些列為空值NULL
  • 如果查詢結(jié)果實(shí)際上并不是單條記錄,而是多條記錄,則程序出錯(cuò),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)在SQLCA中返回錯(cuò)誤信息
[] 查詢某個(gè)學(xué)生選修某門課程的成績(jī)。假設(shè)已經(jīng)把將要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno,將課程號(hào)賦給了主變量givencno。 EXEC SQL SELECT Sno,Cno,GradeINTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示變量Gradeid*/FROM SCWHERE Sno=:givensno AND Cno=:givencno; 如果Gradeid < 0,不論Hgrade為何值,均認(rèn)為該學(xué)生成績(jī)?yōu)榭罩怠?
  • 在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量
[] 修改某個(gè)學(xué)生選修1號(hào)課程的成績(jī)。 EXEC SQL UPDATE SCSET Grade=:newgrade /*修改的成績(jī)已賦給主變量:newgrade*/WHERE Sno=:givensno; /*學(xué)號(hào)賦給主變量:givensno*/ [] 某個(gè)學(xué)生新選修了某門課程,將有關(guān)記錄插入SC表中。假設(shè)插入的學(xué)號(hào)已賦給主變量stdno,課程號(hào)已賦給主變量couno。 gradeid=-1/*gradeid為指示變量,賦為負(fù)值*/ EXEC SQL INSERTINTO SC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr :gradeid)/*:stdno,:couno,:gr為主變量*/ 由于該學(xué)生剛選修課程,成績(jī)應(yīng)為空,所以要把指示變量賦為負(fù)值

四、使用游標(biāo)的SQL語句
1.必須使用游標(biāo)的SQL語句

  • 查詢結(jié)果為多條記錄的SELECT語句
  • CURRENT形式的UPDATE語句
  • CURRENT形式的DELETE語句

2.使用游標(biāo)的步驟
(1)說明游標(biāo)
(2)打開游標(biāo)
(3)推進(jìn)游標(biāo)指針并取當(dāng)前記錄
(4)關(guān)閉游標(biāo)

3.使用DECLARE語句
(1)語句格式

EXEC SQL DECLARE <游標(biāo)名> CURSORFOR <SELECT語句>;

(2)功能

  • 是一條說明性語句,這時(shí)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)并不執(zhí)行SELECT語句

4.使用OPEN語句
(1)語句格式

EXEC SQL OPEN <游標(biāo)名>;

(2)功能

  • 打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把查詢結(jié)果取到緩沖區(qū)中
  • 這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中的第一條記錄

5.使用FETCH語句
(1)語句格式

EXEC SQL FETCH <游標(biāo)名> INTO <主變量>[<指示變量>][,<主變量>[<指示變量>]]...;

(2)功能

  • 指定方向推動(dòng)游標(biāo)指針,同時(shí)將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理

6.使用CLOSE語句
(1)語句格式

EXEC SQL CLOSE <游標(biāo)名>;

(2)功能

  • 關(guān)閉游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源

(3)說明

  • 游標(biāo)被關(guān)閉后,就不再和原來的查詢結(jié)果集相聯(lián)系
  • 被關(guān)閉的游標(biāo)可以再次被打開,與新的查詢結(jié)果相聯(lián)系

7.CURRENT形式的UPDATE語句和DELETE語句的用途
(1)非CURRENT形式的UPDATE語句和DELETE語句

  • 面向集合的操作
  • 一次修改或刪除所有滿足條件的記錄

(2)如果只想修改或刪除其中某個(gè)記錄

  • 用帶游標(biāo)的SELECT語句查出所有滿足條件的記錄
  • 從中進(jìn)一步找出要修改或刪除的記錄
  • 用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之
  • UPDATE語句和DELETE語句中要用子句
WHERE CURRENT OF <游標(biāo)名>

表示修改或刪除的是最近一次取出的記錄,即游標(biāo)指針指向的記錄
8.不能使用CURRENT形式的UPDATE語句和DELETE語句

  • 當(dāng)游標(biāo)定義中的SELECT語句帶有UNION或ORDER BY子句
  • 該SELECT語句相當(dāng)于定義了一個(gè)不可更新的視圖

五、動(dòng)態(tài)SQL

靜態(tài)嵌入式SQL

  • 靜態(tài)嵌入式SQL語句能夠滿足一般要求
  • 無法滿足要到執(zhí)行時(shí)才能夠確定要提交的SQL語句、查詢的條件

動(dòng)態(tài)嵌入式SQL

  • 允許在程序運(yùn)行過程中臨時(shí)“組裝”SQL語句
  • 支持動(dòng)態(tài)組裝SQL語句和動(dòng)態(tài)參數(shù)兩種形式

1. 使用SQL語句主變量

  • 程序主變量包含的內(nèi)容是SQL語句的內(nèi)容,而不是原來保存數(shù)據(jù)的輸入或輸出變量
  • SQL語句主變量在程序執(zhí)行期間可以設(shè)定不同的SQL語句,然后立即執(zhí)行

2. 動(dòng)態(tài)參數(shù)
動(dòng)態(tài)參數(shù)

  • SQL語句中的可變?cè)?/li>
  • 使用參數(shù)符號(hào)(?)表示該位置的數(shù)據(jù)在運(yùn)行時(shí)設(shè)定

和主變量的區(qū)別

  • 動(dòng)態(tài)參數(shù)的輸入不是編譯時(shí)完成綁定
  • 而是通過 PREPARE語句準(zhǔn)備主變量和執(zhí)行語句EXECUTE綁定數(shù)據(jù)或主變量來完成

使用動(dòng)態(tài)參數(shù)的步驟
(1)聲明SQL語句主變量
(2)準(zhǔn)備SQL語句(PREPARE)

EXEC SQL PREPARE <語句名> FROM <SQL語句主變量>; EXEC SQL EXECUTE <語句名> [INTO <主變量表>] [USING <主變量或常量>];

3. 執(zhí)行準(zhǔn)備好的語句(EXECUTE)

過程化SQL

一、過程化SQL的塊結(jié)構(gòu)
1.過程化SQL

  • SQL的擴(kuò)展
  • 增加了過程化語句功能
  • 基本結(jié)構(gòu)是塊
    塊之間可以互相嵌套
    每個(gè)塊完成一個(gè)邏輯操作

2.過程化SQL塊的基本結(jié)構(gòu)
(1)定義部分

DECLARE 變量、常量、游標(biāo)、異常等
  • 定義的變量、常量等只能在該基本塊中使用
  • 當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在
    (2)執(zhí)行部分
BEGINSQL語句、過程化SQL的流程控制語句 EXCEPTION異常處理部分 END;

二、變量和常量的定義
1. 變量定義

變量名 數(shù)據(jù)類型 [[NOT NULL]:=初值表達(dá)式] 變量名 數(shù)據(jù)類型 [[NOT NULL] 初值表達(dá)式]

2. 常量定義

常量名 數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式

常量必須要給一個(gè)值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,過程化SQL將返回一個(gè)異常
3. 賦值語句

變量名稱 :=表達(dá)式

三、流程控制
過程化SQL功能
1. 條件控制語句
IF-THEN,IF-THEN-ELSE和嵌套的IF語句
(1)

IF condition THENSequence_of_statements; END IF;

(2)

IF condition THENSequence_of_statements1; ELSESequence_of_statements2; END IF;

(3)在THEN和ELSE子句中還可以再包含IF語句,即IF語句可以嵌套

2. 循環(huán)控制語句
LOOP,WHILE-LOOP和FOR-LOOP
(1)簡(jiǎn)單的循環(huán)語句LOOP

LOOPSequence_of_statements; END LOOP;

多數(shù)數(shù)據(jù)庫(kù)服務(wù)器的過程化SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束。
(2)WHILE-LOOP

WHILE condition LOOPSequence_of_statements; END LOOP;
  • 每次執(zhí)行循環(huán)體語句之前,首先對(duì)條件進(jìn)行求值
  • 如果條件為真,則執(zhí)行循環(huán)體內(nèi)的語句序列
  • 如果條件為假,則跳過循環(huán)并把控制傳遞給下一個(gè)語句

(3)FOR-LOOP

FOR count IN [REVERSE] bound1 … bound2 LOOPSequence_of_statements; END LOOP;

3. 錯(cuò)誤處理

  • 如果過程化SQL在執(zhí)行時(shí)出現(xiàn)異常,則應(yīng)該讓程序在產(chǎn)生異常的語句處停下來,根據(jù)異常的類型去執(zhí)行異常處理語句
  • SQL標(biāo)準(zhǔn)對(duì)數(shù)據(jù)庫(kù)服務(wù)器提供什么樣的異常處理做出了建議,要求過程化SQL管理器提供完善的異常處理機(jī)制

存儲(chǔ)過程和函數(shù)

一、存儲(chǔ)過程
過程化SQL塊類型

  • 命名塊
    編譯后保存在數(shù)據(jù)庫(kù)中,可以被反復(fù)調(diào)用,運(yùn)行速度較快,過程和函數(shù)是命名塊
  • 匿名塊
    每次執(zhí)行時(shí)都要進(jìn)行編譯,它不能被存儲(chǔ)到數(shù)據(jù)庫(kù)中,也不能在其他過程化SQL塊中調(diào)用

1.存儲(chǔ)過程
由過程化SQL語句書寫的過程,經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,使用時(shí)只要調(diào)用即可。
2.存儲(chǔ)過程的優(yōu)點(diǎn)

  • 運(yùn)行效率高
  • 降低了客戶機(jī)和服務(wù)器之間的通信量
  • 方便實(shí)施企業(yè)規(guī)則

3.存儲(chǔ)過程的用戶接口

  • 創(chuàng)建存儲(chǔ)過程
CREATE OR REPLACE PROCEDURE 過程名([參數(shù)1,參數(shù)2,...]) AS <過程化SQL塊>;a.過程名:數(shù)據(jù)庫(kù)服務(wù)器合法的對(duì)象標(biāo)識(shí) b.參數(shù)列表:用名字來標(biāo)識(shí)調(diào)用時(shí)給出的參數(shù)值,必須指定值的數(shù)據(jù)類型。參數(shù)也可以定義輸入?yún)?shù)、輸出參數(shù)或輸入/輸出參數(shù),默認(rèn)為輸入?yún)?shù) c.過程體:是一個(gè)<過程化SQL塊>,包括聲明部分和可執(zhí)行語句部分
  • 執(zhí)行存儲(chǔ)過程
CALL/PERFORM PROCEDURE 過程名([參數(shù)1,參數(shù)2,...]);a.使用CALL或者PERFORM等方式激活存儲(chǔ)過程的執(zhí)行 b.在過程化SQL中,數(shù)據(jù)庫(kù)服務(wù)器支持在過程體中調(diào)用其他存儲(chǔ)過程
  • 修改存儲(chǔ)過程
ALTER PROCEDURE 過程名1 RENAME TO 過程名2;
  • 刪除存儲(chǔ)過程
DROP PROCEDURE 過程名();

二、函數(shù)
函數(shù)和存儲(chǔ)過程的異同

  • 同:都是持久性存儲(chǔ)模塊
  • 異:函數(shù)必須指定返回的類型

1. 函數(shù)的定義語句格式

CREATE OR REPLACE FUNCTION 函數(shù)名 ([參數(shù)1,參數(shù)2,]) RETURNS <類型> AS <過程化SQL塊>;

2. 函數(shù)的執(zhí)行語句格式

CALL/SELECT 函數(shù)名 ([參數(shù)1,參數(shù)2,]);

3. 修改函數(shù)
重命名

ALTER FUNCTION 過程名1 RENAME TO 過程名2;

重新編譯

ALTER FUNCTION 過程名 COMPILE;

ODBC編程

ODBC優(yōu)點(diǎn)

  • 移植性好
  • 能同時(shí)訪問不同的數(shù)據(jù)庫(kù)
  • 共享多個(gè)數(shù)據(jù)資源

一、ODBC概述
1.ODBC產(chǎn)生的原因

  • 由于不同的數(shù)據(jù)庫(kù)管理系統(tǒng)的存在,在某個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)下編寫的應(yīng)用程序就不能在另一個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)下運(yùn)行
  • 許多應(yīng)用程序需要共享多個(gè)部門的數(shù)據(jù)資源,訪問不同的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)

2.ODBC

  • 是微軟公司開放服務(wù)體系(Windows Open Services Architecture,WOSA)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分
  • 提供了一組訪問數(shù)據(jù)庫(kù)的應(yīng)用程序編程接口(Application Programming Interface,API )

3.ODBC約束力

  • 規(guī)范應(yīng)用開發(fā)
  • 規(guī)范關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)應(yīng)用接口

二、ODBC工作原理概述
1.ODBC應(yīng)用系統(tǒng)的體系結(jié)構(gòu)
(1)用戶應(yīng)用程序
(2)ODBC驅(qū)動(dòng)程序管理器
(3)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
(4)數(shù)據(jù)源

2.ODBC應(yīng)用程序包括的內(nèi)容

  • 請(qǐng)求連接數(shù)據(jù)庫(kù)
  • 向數(shù)據(jù)源發(fā)送SQL語句
  • 為SQL語句執(zhí)行結(jié)果分配存儲(chǔ)空間,定義所讀取的數(shù)據(jù)格式
  • 獲取數(shù)據(jù)庫(kù)操作結(jié)果或處理錯(cuò)誤
  • 進(jìn)行數(shù)據(jù)處理并向用戶提交處理結(jié)果
  • 請(qǐng)求事務(wù)的提交和回滾操作
  • 斷開與數(shù)據(jù)源的連接

3.驅(qū)動(dòng)程序管理器:用來管理各種驅(qū)動(dòng)程序

  • 包含在ODBC32.DLL中
  • 管理應(yīng)用程序和驅(qū)動(dòng)程序之間的通信
  • 建立、配置或刪除數(shù)據(jù)源,并查看系統(tǒng)當(dāng)前所安裝的數(shù)據(jù)庫(kù)ODBC驅(qū)動(dòng)程序

4.主要功能

  • 裝載ODBC驅(qū)動(dòng)程序
  • 選擇和連接正確的驅(qū)動(dòng)程序
  • 管理數(shù)據(jù)源
  • 檢查ODBC調(diào)用參數(shù)的合法性
  • 記錄ODBC函數(shù)的調(diào)用等

5.ODBC通過驅(qū)動(dòng)程序來提供應(yīng)用系統(tǒng)與數(shù)據(jù)庫(kù)平臺(tái)的獨(dú)立性
6.ODBC應(yīng)用程序不能直接存取數(shù)據(jù)庫(kù)

  • 其各種操作請(qǐng)求由驅(qū)動(dòng)程序管理器提交給某個(gè)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的ODBC驅(qū)動(dòng)程序
  • 通過調(diào)用驅(qū)動(dòng)程序所支持的函數(shù)來存取數(shù)據(jù)庫(kù)
  • 數(shù)據(jù)庫(kù)的操作結(jié)果也通過驅(qū)動(dòng)程序返回給應(yīng)用程序
  • 如果應(yīng)用程序要操縱不同的數(shù)據(jù)庫(kù),就要?jiǎng)討B(tài)地鏈接到不同的驅(qū)動(dòng)程序上

7.ODBC驅(qū)動(dòng)程序類型
單束

  • 數(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ù)訪問
  • 由驅(qū)動(dòng)程序完成數(shù)據(jù)庫(kù)訪問請(qǐng)求的提交和結(jié)果集接收
  • 應(yīng)用程序使用驅(qū)動(dòng)程序提供的結(jié)果集管理接口操縱執(zhí)行后的結(jié)果數(shù)據(jù)

8.數(shù)據(jù)源:是最終用戶需要訪問的數(shù)據(jù),包含了數(shù)據(jù)庫(kù)位置和數(shù)據(jù)庫(kù)類型等信息,是一種數(shù)據(jù)連接的抽象
數(shù)據(jù)源對(duì)最終用戶是透明的

  • ODBC給每個(gè)被訪問的數(shù)據(jù)源指定唯一的數(shù)據(jù)源名(Data Source Name,簡(jiǎn)稱DSN),并映射到所有必要的、用來存取數(shù)據(jù)的低層軟件
  • 在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、所連接的數(shù)據(jù)庫(kù)名等
  • 最終用戶無須知道數(shù)據(jù)庫(kù)管理系統(tǒng)或其他數(shù)據(jù)管理軟件、網(wǎng)絡(luò)以及有關(guān)ODBC驅(qū)動(dòng)程序的細(xì)節(jié)

三、ODBC API 基礎(chǔ)
ODBC 應(yīng)用程序編程接口的一致性
API一致性

  • 包含核心級(jí)、擴(kuò)展1級(jí)、擴(kuò)展2級(jí)

語法一致性

  • 包含最低限度SQL語法級(jí)、核心SQL語法級(jí)、擴(kuò)展SQL語法級(jí)

1. 函數(shù)概述
ODBC 3.0 標(biāo)準(zhǔn)提供了76個(gè)函數(shù)接口

  • 分配和釋放環(huán)境句柄、連接句柄、語句句柄
  • 連接函數(shù)(SQLDriverconnect等)
  • 與信息相關(guān)的函數(shù)(SQLGetinfo、SQLGetFuction等)
  • 事務(wù)處理函數(shù)(如SQLEndTran)
  • 執(zhí)行相關(guān)函數(shù)(SQLExecdirect、SQLExecute等)
  • 編目函數(shù),ODBC 3.0提供了11個(gè)編目函數(shù),如SQLTables、SQLColumn等。應(yīng)用程序可以通過對(duì)編目函數(shù)的調(diào)用來獲取數(shù)據(jù)字典的信息,如權(quán)限、表結(jié)構(gòu)等。

2. 句柄及其屬性
句柄是32位整數(shù)值,代表一個(gè)指針 。

ODBC 3.0中句柄分類

  • 環(huán)境句柄
  • 連接句柄
  • 語句句柄
  • 描述符句柄

應(yīng)用程序句柄之間的關(guān)系

  • 每個(gè)ODBC應(yīng)用程序需要建立一個(gè)ODBC環(huán)境,分配一個(gè)環(huán)境句柄,存取數(shù)據(jù)的全局性背景,如環(huán)境狀態(tài)、當(dāng)前環(huán)境狀態(tài)診斷、當(dāng)前在環(huán)境上分配的連接句柄等
  • 一個(gè)環(huán)境句柄可以建立多個(gè)連接句柄,每一個(gè)連接句柄實(shí)現(xiàn)與一個(gè)數(shù)據(jù)源之間的連接
  • 在一個(gè)連接中可以建立多個(gè)語句句柄,它不只是一個(gè)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代碼
  • 應(yīng)用程序可以通過SQLGetTypeInfo來獲取不同的驅(qū)動(dòng)程序?qū)τ跀?shù)據(jù)類型的支持情況
  • SQL數(shù)據(jù)類型和C數(shù)據(jù)類型之間的轉(zhuǎn)換規(guī)則

四、ODBC的工作流程

1. 配置數(shù)據(jù)源
方法:

  • 運(yùn)行數(shù)據(jù)源管理工具來進(jìn)行配置
  • 使用Driver Manager 提供的ConfigDsn函數(shù)來增加、修改或刪除數(shù)據(jù)源

創(chuàng)建數(shù)據(jù)源—第一步:定義句柄和變量

  • 沒有和具體的驅(qū)動(dòng)程序相關(guān)聯(lián),由Driver Manager來進(jìn)行控制 ,并配置環(huán)境屬性
  • 應(yīng)用程序通過調(diào)用連接函數(shù)和某個(gè)數(shù)據(jù)源進(jìn)行連接后,Driver Manager才調(diào)用所連的驅(qū)動(dòng)程序中的SQLAllocHandle,來真正分配環(huán)境句柄的數(shù)據(jù)結(jié)構(gòu)

創(chuàng)建數(shù)據(jù)源—第二步:初始化環(huán)境

  • 應(yīng)用程序調(diào)用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數(shù)據(jù)源連接
  • SQLConnect連接函數(shù)的輸入?yún)?shù)為:
    配置好的數(shù)據(jù)源名稱
    用戶ID
    口令

創(chuàng)建數(shù)據(jù)源—第三步:建立連接

  • 處理任何SQL語句之前,應(yīng)用程序還需要首先分配一個(gè)語句句柄
  • 語句句柄含有具體的SQL語句以及輸出的結(jié)果集等信息
  • 應(yīng)用程序還可以通過SQLtStmtAttr來設(shè)置語句屬性(也可以使用默認(rèn)值)

創(chuàng)建數(shù)據(jù)源—第四步

  • 應(yīng)用程序處理SQL語句的兩種方式
    預(yù)處理(SQLPrepare、SQLExecute適用于語句的多次執(zhí)行)
    直接執(zhí)行(SQLExecdirect)
  • 如果SQL語句含有參數(shù),應(yīng)用程序?yàn)槊總€(gè)參數(shù)調(diào)用SQLBindParameter,并把它們綁定至應(yīng)用程序變量
  • 應(yīng)用程序可以直接通過改變應(yīng)用程序緩沖區(qū)的內(nèi)容從而在程序中動(dòng)態(tài)改變SQL語句的具體執(zhí)行
  • 應(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ū)

創(chuàng)建數(shù)據(jù)源—第五步:執(zhí)行SQL語句

  • 應(yīng)用程序可以通過SQLNumResultCols來獲取結(jié)果集中的列數(shù)
  • 通過SQL DescribeCol或SQLColAttrbute函數(shù)來獲取結(jié)果集每一列的名稱、數(shù)據(jù)類型、精度和范圍
  • ODBC中使用游標(biāo)來處理結(jié)果集數(shù)據(jù)
  • ODBC中游標(biāo)類型
    Forward-only游標(biāo),是ODBC的默認(rèn)游標(biāo)類型
    可滾動(dòng)(Scroll)游標(biāo):靜態(tài)(static)、動(dòng)態(tài)(dynamic)、碼集驅(qū)動(dòng)(keyset-driven)、混合型(mixed)

結(jié)果集處理步驟

  • ODBC游標(biāo)的打開方式不同于嵌入式SQL,不是顯式聲明而是系統(tǒng)自動(dòng)產(chǎn)生一個(gè)游標(biāo),當(dāng)結(jié)果集剛剛生成時(shí),游標(biāo)指向第一行數(shù)據(jù)之前
  • 應(yīng)用程序通過SQLBindCol把查詢結(jié)果綁定到應(yīng)用程序緩沖區(qū)中,通過SQLFetch或是SQLFetchScroll來移動(dòng)游標(biāo)獲取結(jié)果集中的每一行數(shù)據(jù)
  • 對(duì)于如圖像這類特別的數(shù)據(jù)類型,當(dāng)一個(gè)緩沖區(qū)不足以容納所有的數(shù)據(jù)時(shí),可以通過SQLGetdata分多次獲取
  • 最后通過SQLClosecursor來關(guān)閉游標(biāo)

創(chuàng)建數(shù)據(jù)源—第六步:結(jié)果集處理
應(yīng)用程序中止步驟

  • 釋放語句句柄
  • 釋放數(shù)據(jù)庫(kù)連接
  • 與數(shù)據(jù)庫(kù)服務(wù)器斷開
  • 釋放ODBC環(huán)境

創(chuàng)建數(shù)據(jù)源—第七步:中止處理

2. 初始化環(huán)境
3. 建立連接
4. 分配語句句柄
5. 執(zhí)行SQL語句
6. 結(jié)果集處理
7. 中止處理

總結(jié)

以上是生活随笔為你收集整理的『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。