『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)
數(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í),語句格式:
二、嵌入式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é)生年齡。
三、不用游標(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ò)誤信息
- 在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量
四、使用游標(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)語句格式
(2)功能
- 是一條說明性語句,這時(shí)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)并不執(zhí)行SELECT語句
4.使用OPEN語句
(1)語句格式
(2)功能
- 打開游標(biāo)實(shí)際上是執(zhí)行相應(yīng)的SELECT語句,把查詢結(jié)果取到緩沖區(qū)中
- 這時(shí)游標(biāo)處于活動(dòng)狀態(tài),指針指向查詢結(jié)果集中的第一條記錄
5.使用FETCH語句
(1)語句格式
(2)功能
- 指定方向推動(dòng)游標(biāo)指針,同時(shí)將緩沖區(qū)中的當(dāng)前記錄取出來送至主變量供主語言進(jìn)一步處理
6.使用CLOSE語句
(1)語句格式
(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語句中要用子句
表示修改或刪除的是最近一次取出的記錄,即游標(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)
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)定義部分
- 定義的變量、常量等只能在該基本塊中使用
- 當(dāng)基本塊執(zhí)行結(jié)束時(shí),定義就不再存在
(2)執(zhí)行部分
二、變量和常量的定義
1. 變量定義
2. 常量定義
常量名 數(shù)據(jù)類型 CONSTANT :=常量表達(dá)式常量必須要給一個(gè)值,并且該值在存在期間或常量的作用域內(nèi)不能改變。如果試圖修改它,過程化SQL將返回一個(gè)異常
3. 賦值語句
三、流程控制
過程化SQL功能
1. 條件控制語句
IF-THEN,IF-THEN-ELSE和嵌套的IF語句
(1)
(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
多數(shù)數(shù)據(jù)庫(kù)服務(wù)器的過程化SQL都提供EXIT、BREAK或LEAVE等循環(huán)結(jié)束語句,保證LOOP語句塊能夠結(jié)束。
(2)WHILE-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ǔ)過程
- 執(zhí)行存儲(chǔ)過程
- 修改存儲(chǔ)過程
- 刪除存儲(chǔ)過程
二、函數(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 過程名 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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 『数据库』数据库系统效率Max--数据库
- 下一篇: 『数据库』怎样设计一个数据库