成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用CLI開(kāi)發(fā)DB2存儲(chǔ)過(guò)程的實(shí)例

數(shù)據(jù)庫(kù)
一般意義上,DB2為存儲(chǔ)過(guò)程的編寫(xiě)提供了三種方式:第一種是嵌入式SQL編程;第二種是CLI編程;第三種是純SQL編程。本文對(duì)使用CLI來(lái)開(kāi)發(fā)DB2存儲(chǔ)過(guò)程進(jìn)行了詳述,并附開(kāi)發(fā)實(shí)例,供您參考。

存儲(chǔ)過(guò)程是使用大型關(guān)系型數(shù)據(jù)庫(kù)DB2進(jìn)行開(kāi)發(fā)時(shí),考慮最多的關(guān)鍵問(wèn)題之一。本文對(duì)使用CLI來(lái)開(kāi)發(fā)DB2存儲(chǔ)過(guò)程進(jìn)行了詳述,并附開(kāi)發(fā)實(shí)例,供您參考。#t#

■DB2存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程(Store Procedure)是Client/Server應(yīng)用中的一種編程方式,主要是為了解決客戶(hù)端應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)時(shí)可能出現(xiàn)的網(wǎng)絡(luò)負(fù)擔(dān)過(guò)重的問(wèn)題。

  一般意義上,DB2為存儲(chǔ)過(guò)程的編寫(xiě)提供了三種方式(不包括直接使用DB2的Store Procedure Builder生成的方式):第一種是嵌入式SQL編程;第二種是CLI編程;第三種是純SQL編程。本文將重點(diǎn)介紹CLI編程。

■CLI編程

CLI(Call Level Interface)編程是DB2提供的一種編寫(xiě)動(dòng)態(tài)數(shù)據(jù)庫(kù)讀寫(xiě)程序的方式。在CLI編程中,所有SQL語(yǔ)句都通過(guò)DB2提供的一組C語(yǔ)言函數(shù)來(lái)執(zhí)行,因此可以在Visual Studio中直接開(kāi)發(fā)。下面,我們首先要簡(jiǎn)單介紹一下CLI的工作過(guò)程和方式。

CLI程序主要由三個(gè)部分組成:首先是環(huán)境變量初始化過(guò)程,其次是語(yǔ)句的執(zhí)行,最后是環(huán)境變量的釋放。我們將通過(guò)一個(gè)具體的例子來(lái)討論這三個(gè)過(guò)程。

■開(kāi)發(fā)實(shí)例

該例子的數(shù)據(jù)庫(kù)是DB2可以自動(dòng)生成的Sample庫(kù),例子所完成的操作是從數(shù)據(jù)庫(kù)中獲取ID等于輸入?yún)?shù)值的員工姓名,例子的整個(gè)過(guò)程雖然非常簡(jiǎn)單,但已經(jīng)包含了CLI編程的基本思路和步驟。

1. 初始化環(huán)境變量

在CLI中有三個(gè)句柄,分別是環(huán)境句柄、連接句柄、語(yǔ)句句柄。在初始化過(guò)程中首先要對(duì)前兩個(gè)句柄逐一進(jìn)行獲取,獲取成功后可連接數(shù)據(jù)庫(kù)并獲取第三個(gè)句柄。

SQLRETURN ret;

SQLHENV henv; // 環(huán)境句柄

SQLHDBC hdbc; // 連接句柄

SQLHSTMT hstmt; // 語(yǔ)句句柄

SQLCHAR DBNAME[]="SAMPLE"; //數(shù)據(jù)庫(kù)名#p#

SQLCHAR USERNAME[]="db2admin"; // 用戶(hù)名

SQLCHAR PSW[]="ibmdb2"; // 口令

ret=SQLAllocEnv(&&henv) //分配環(huán)境句柄

ret=SQLAllocConnect(henv,&&hdbc)

//分配連接句柄

ret=SQLSetConnectOption(hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)

//設(shè)置連接屬性

ret=SQLConnect(hdbc,DBNAME,SQL_NTS,USERNAME,SQL_NTS,PSW,SQL_NTS) //連接數(shù)據(jù)庫(kù)

ret=SQLAllocStmt(hdbc,&&hstmt)

//分配語(yǔ)句句柄

上面的每個(gè)函數(shù)都有返回值,如果函數(shù)成功,ret值為SQL_SUCCESS,否則將返回錯(cuò)誤代碼。

2. 語(yǔ)句的執(zhí)行

語(yǔ)句的執(zhí)行分四個(gè)階段:首先準(zhǔn)備數(shù)據(jù)接收的緩沖區(qū),然后執(zhí)行準(zhǔn)備好的SQL語(yǔ)句,第三步是將語(yǔ)句句柄和數(shù)據(jù)緩沖區(qū)進(jìn)行綁定,最后獲取數(shù)據(jù)。程序如下:

char RowBuffer[100][200];

//數(shù)據(jù)緩沖區(qū),其大小可自定義

typedef struct sqldat

{ SQLCHAR ColumnName[50];#p#

SQLSMALLINT BufferLength;

SQLSMALLINT NameLength;

SQLSMALLINT DataType;

SQLUINTEGER ColumnSize;

SQLSMALLINT FAR DecimalDigitsPtr;

SQLSMALLINT FAR NullablePtr;

} sqldata;

// 為第三步的綁定準(zhǔn)備一個(gè)數(shù)據(jù)結(jié)構(gòu)

sqldata RowDesc[100];

//用于綁定的變量,維數(shù)與緩沖區(qū)對(duì)應(yīng)

memset(RowBuffer,64,100200);

//給緩沖區(qū)賦初始值,可以用于最后判斷是否真正從數(shù)據(jù)庫(kù)中獲取了數(shù)據(jù),這一步也可以省略

char tempsql[100];

sprintf(tempsql,"select NAME from db2admin.STAFF where ID= %s ",Condition);

// Condition為變量值,可由用戶(hù)輸入

sql=(SQLCHAR ) tempsql;

ret=SQLPrepare(hstmt,sql,SQL_NTS)

// 執(zhí)行準(zhǔn)備#p#

ret=SQLExecute(hstmt) // 執(zhí)行

執(zhí)行成功后可進(jìn)行綁定過(guò)程

SQLINTEGER nullindicator;

SQLINTEGER displaysize[MAX_COLUMN];

SQLSMALLINT i;

SQLSMALLINT num_columns;

SQLNumResultCols(hstmt,&&num_columns);

//準(zhǔn)備綁定用的相關(guān)變量

for(i=1;i< =num_columns;i++)

{

RowDesc[i-1].BufferLength=200;#p#

SQLDescribeCol(hstmt,i, RowDesc[i-1].ColumnName,RowDesc[i-1].BufferLength,&&(RowDesc[i-1].NameLength),&&(RowDesc[i-1].DataType),&&(RowDesc[i-1].ColumnSize),RowDesc[i-1].DecimalDigitsPtr,RowDesc[i-1].NullablePtr);

SQLColAttribute(hstmt,(SQLSMALLINT)(i),SQL_DESC_DISPLAY_SIZE,NULL,0,NULL,&&displaysize[i-1]);

RowDesc[i-1].ColumnSize=max(displaysize[i-1],strlen((char)RowDesc[i-1].ColumnName))+1;

SQLBindCol( hstmt, (SQLSMALLINT)i,

SQL_C_CHAR,(SQLPOINTER)(RowBuffer[i-1]),RowDesc[i-1].ColumnSize,

&&nullindicator);

}//循環(huán)綁定

//綁定完成后,可以將數(shù)據(jù)讀至緩沖區(qū)

while(SQLFetch(hstmt)!=SQL_NO_DATA)

{

// SQLFetch函數(shù)將已經(jīng)獲取的數(shù)據(jù)存入緩沖區(qū)

//此處的操作方式與ESQL中的游標(biāo)類(lèi)似,支持對(duì)結(jié)果集的操作

//每執(zhí)行一次SQLFetch函數(shù)會(huì)把當(dāng)前獲取的一行數(shù)據(jù)讀到緩沖區(qū)中

//RowBuffer[i]中將存放該行的第i 列數(shù)據(jù)值

//本例中只有一行數(shù)據(jù)

}

char m_name[10];

memcpy(m_name,RowBuffer[0],10);

//從緩沖區(qū)中將結(jié)果讀到用戶(hù)變量中#p#

3. 釋放環(huán)境變量

在數(shù)據(jù)獲取完成后,可以將環(huán)境變量釋放掉,但要注意釋放的先后順序。

SQLFreeStmt(hstmt,SQL_DROP);

// 釋放語(yǔ)句句柄

SQLDisconnect(hdbc);//與數(shù)據(jù)庫(kù)斷開(kāi)

SQLFreeConnect(hdbc);//釋放連接句柄

SQLFreeEnv(henv);//釋放環(huán)境句柄

經(jīng)過(guò)上面的步驟,就完成了對(duì)數(shù)據(jù)庫(kù)的讀取過(guò)程。

4. 生成目標(biāo)存儲(chǔ)過(guò)程

從上面的過(guò)程看,CLI編程無(wú)疑是非常復(fù)雜的,但如果我們使用一些輔助手段來(lái)組織整個(gè)過(guò)程,其編程過(guò)程和調(diào)試步驟將會(huì)大大簡(jiǎn)化。本文的例子使用了微軟的Visual Studio 6.0來(lái)幫助組織。在Visual C++中用Wizard生成一個(gè)DLL工程,然后將數(shù)據(jù)庫(kù)的初始化、綁定、釋放三個(gè)過(guò)程函數(shù)化,并在相應(yīng)的地方調(diào)用函數(shù)。在調(diào)試時(shí)只需針對(duì)語(yǔ)句的執(zhí)行部分,合適的調(diào)試方式是不直接生成DLL,而先生成一個(gè)普通的EXE工程來(lái)完成所需的工作,待調(diào)試成功后將相關(guān)代碼移到DLL工程中。過(guò)程函數(shù)化的另一個(gè)好處是在編寫(xiě)多個(gè)存儲(chǔ)過(guò)程時(shí)代碼重用率高,對(duì)于剛才提到的這種調(diào)試方式也很有利。使用Visual C++的優(yōu)點(diǎn)還有編譯和鏈接過(guò)程簡(jiǎn)單,不用在命令行的方式下操作,也不需要去記憶許多復(fù)雜的參數(shù)。不過(guò)要記住將db2cli.lib包含進(jìn)工程中,否則在鏈結(jié)過(guò)程中會(huì)有錯(cuò)誤,還要做的一件事是按DLL工程中的要求編輯工程中的def文件以提供函數(shù)的可調(diào)用出口。

在DLL生成并調(diào)試通過(guò)后,剩下的工作與ESQL編程方式中的相應(yīng)階段類(lèi)似,要手工編輯一個(gè)DB2文件并執(zhí)行它,這里就不再?gòu)?fù)述了。
 

責(zé)任編輯:段燃 來(lái)源: C++博客
相關(guān)推薦

2010-08-31 15:39:25

DB2存儲(chǔ)過(guò)程

2010-11-03 10:35:45

DB2存儲(chǔ)過(guò)程

2010-09-01 15:09:41

DB2動(dòng)態(tài)游標(biāo)

2010-08-18 13:29:11

DB2存儲(chǔ)過(guò)程

2010-11-03 10:46:49

DB2存儲(chǔ)過(guò)程

2010-08-05 10:42:33

DB2 拉鏈表存儲(chǔ)過(guò)程

2010-11-03 10:26:22

DB2存儲(chǔ)過(guò)程

2011-08-10 17:00:45

DB2數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程

2010-11-04 12:00:59

db2存儲(chǔ)過(guò)程

2011-04-15 13:21:41

DB2翻頁(yè)存儲(chǔ)

2010-08-10 15:30:21

2010-08-18 13:59:04

DB2純SQL存儲(chǔ)過(guò)程

2010-09-06 10:54:52

DB2 sql 存儲(chǔ)過(guò)

2010-11-03 11:02:34

DB2存儲(chǔ)過(guò)程

2009-03-10 09:08:06

DB2存儲(chǔ)過(guò)程實(shí)施

2010-09-06 10:43:15

DB2 SQL存儲(chǔ)過(guò)程

2010-08-04 09:56:44

2010-11-03 14:05:58

DB2離線備份

2010-08-05 14:34:26

DB2存儲(chǔ)過(guò)程

2010-08-05 11:08:27

DB2存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品麻豆日日躁夜夜躁 | 亚洲高清av | 一区免费视频 | 亚洲成人精品在线 | 国产精品免费一区二区三区四区 | 日韩av在线一区二区 | 男女羞羞免费网站 | 99福利视频导航 | 手机看片在线播放 | 中文av在线播放 | 91色在线| 亚洲福利网站 | 日韩视频一区二区 | 亚洲一二三区不卡 | 丝袜一区二区三区 | 欧美二区三区 | 久久精品国产一区二区电影 | 国产区在线观看 | 欧美xxxx色视频在线观看免费 | 亚洲一区二区av | 可以免费看的毛片 | 久久国产精品免费一区二区三区 | 在线婷婷| 久久69精品久久久久久久电影好 | 国产精品成人一区二区 | 黄色高清视频 | 亚洲欧美在线观看 | 在线超碰 | 国产99久久精品一区二区永久免费 | 嫩草懂你的影院入口 | 国产精品视频一二三区 | 日韩在线免费播放 | 99视频免费在线 | 韩日精品在线观看 | 欧美黄在线观看 | 999国产精品视频免费 | 亚洲精品自在在线观看 | 99久久视频 | 日本不卡一区二区三区在线观看 | 日韩高清国产一区在线 | 精品一区二区三区在线观看 |