日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

完全版 ESQL/C資料二( 五 )


lSqlerrmc:由0個(gè)或多個(gè)字符串組成,它對(duì)返回的值給予一個(gè)更詳細(xì)的解釋 。
lSqlerrp:包含一些對(duì)用戶沒(méi)有用的信息 。
lSqlwarn:包含了一些警告信息 。
lSqlstate:長(zhǎng)度為5的字符串 。它表示SQL語(yǔ)句執(zhí)行的結(jié)果 。它的每一個(gè)含義是遵循ANSI/SQL 92標(biāo)準(zhǔn) 。各個(gè)數(shù)據(jù)庫(kù)產(chǎn)品的sqlstate域的含義都是相同的 。
為了更方便地讀取sqlca中SQL語(yǔ)句執(zhí)行后的結(jié)果或錯(cuò)誤,DB2提供了一個(gè)函數(shù)——sqlaintp,它在sql.h中聲明:sqlaintp(msgbuf,bufsize,linesize,sqlcaptr) 。其中msgbuf中存放信息;bufsize中存放了msgbuf的長(zhǎng)度;linesize中存放了兩個(gè)執(zhí)行符之間的字符長(zhǎng)度 。函數(shù)的返回值為正,代表信息的長(zhǎng)度;為負(fù)代表沒(méi)有信息返回 。
下面這個(gè)例子解釋了sqlca和sqlaintp的使用方法:
int check_error (char eString[], struct sqlca *caPointer) {
char eBuffer[1024];
char sBuffer[1024];
short rc, Erc;
/*通過(guò)SQLCODE來(lái)判斷是否出錯(cuò)*/
if (caPointer->sqlcode != 0) {
printf ("--- error report ---n");
printf ("ERROR occured : %s.nSQLCODE : %ldn", eString,
caPointer->sqlcode);
/* 獲取SQLSTATE信息*/
rc = sqlogstt (sBuffer, 1024, 80, caPointer->sqlstate);
/*獲取調(diào)用API的錯(cuò)誤信息*/
Erc = sqlaintp (eBuffer, 1024, 80, caPointer);
/* Erc中存放了eBuffer 的長(zhǎng)度*/
if (Erc > 0) printf ("%s", eBuffer);
if (caPointer->sqlcode < 0) { /*錯(cuò)誤信息*/
if (rc == 0) {
printf ("n%s", sBuffer);
}
printf ("--- end error report ---n");
return 1;
} else {
/* 僅僅是警告信息 */
if (rc == 0) {
printf ("n%s", sBuffer);
}
printf ("--- end error report ---n");
printf ("WARNING - CONTINUING PROGRAM WITH WARNINGS!n");
return 0;
} /* endif */
} /* endif */
return 0;
}
在每條SQL語(yǔ)句執(zhí)行后都返回一個(gè)SQLCA結(jié)構(gòu),SQLCA結(jié)構(gòu)中記載了SQL語(yǔ)句執(zhí)行后的結(jié)果信息 。用戶可以根據(jù)返回信息執(zhí)行各種操作 。DB2也提供了WHENEVER語(yǔ)句 。具體可參見(jiàn)SQL SERVER中的WHENEVER 。但是,在DB2中,沒(méi)有WHENEVER…CALL這個(gè)處理 。
3.2.6事務(wù)
所謂事務(wù),就是一系列應(yīng)用程序和數(shù)據(jù)庫(kù)之間交互操作的集合 。一旦一個(gè)事務(wù)開(kāi)始執(zhí)行,則事務(wù)中的操作要么全部執(zhí)行,要么全部不執(zhí)行 。
l事務(wù)開(kāi)始:DB2事務(wù)是隱式開(kāi)始的,除了下列的一些語(yǔ)句,其他任何一個(gè)可執(zhí)行的SQL語(yǔ)句都隱式地開(kāi)始一個(gè)事務(wù) 。
BEGIN DECLARE SECTION END DECLARE SECTION
DECLARE CURSOR INCLUDE SQLCA INCLUDE SQLDA
WHENEVER
l事務(wù)結(jié)束:事務(wù)由一個(gè)可執(zhí)行的SQL語(yǔ)句開(kāi)始,后面執(zhí)行的所有SQL語(yǔ)句都將屬于同一個(gè)事務(wù),該事務(wù)一直遇到COMMIT或ROLLBACK命令時(shí)才結(jié)束 。
COMMIT操作的作用是,結(jié)束當(dāng)前的事務(wù),事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改永久化 。ROLLBACK的作用是,結(jié)束當(dāng)前的事務(wù),將被修改的數(shù)據(jù)恢復(fù)到事務(wù)執(zhí)行以前的狀態(tài),即取消事務(wù)執(zhí)行產(chǎn)生的影響 。當(dāng)程序結(jié)束時(shí),系統(tǒng)自動(dòng)隱式地執(zhí)行COMMIT操作,如果系統(tǒng)檢測(cè)到死鎖等故障,則隱式地執(zhí)行ROLLBACK操作 。
3.3 DB2的嵌入SQL程序處理過(guò)程
嵌入SQL程序處理,由一個(gè)源程序創(chuàng)建為一個(gè)可執(zhí)行文件的過(guò)程 。如下圖所示:
圖6-3 嵌入SQL處理過(guò)程
從上圖看出,首先對(duì)源文件做預(yù)編譯(precompiler),生成兩個(gè)部分文件:一部分是純的C程序源文件,它們和其他的C程序源文件一起,經(jīng)過(guò)編譯和連接生成可執(zhí)行的程序(executable program);而另一部分是bind文件或package文件 。Bind文件經(jīng)過(guò)binder操作以后,也生成為package文件 。所謂package,實(shí)際上是SQL語(yǔ)句的訪問(wèn)計(jì)劃 。所以,預(yù)編譯器將源程序中的SQL語(yǔ)句提出來(lái),生成他們的訪問(wèn)計(jì)劃,并將訪問(wèn)計(jì)劃存放在數(shù)據(jù)庫(kù)管理器中 。當(dāng)執(zhí)行程序并遇到訪問(wèn)數(shù)據(jù)庫(kù)的命令時(shí),它將到數(shù)據(jù)庫(kù)管理器中尋找屬于它的訪問(wèn)計(jì)劃,然后按照訪問(wèn)計(jì)劃中所設(shè)計(jì)的方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn) 。具體來(lái)說(shuō):

推薦閱讀