複製鏈接
請複製以下鏈接發送給好友

SQLCA

鎖定
SQLCA是一個存儲區域,將統計和錯誤從應用程序傳遞到數據庫服務器再傳回應用程序的每個數據庫請求會使用它。SQLCA 用作應用程序到數據庫的通信鏈接的句柄。
中文名
SQL通信區
外文名
SQL Communication Area
簡    稱
SQLCA
屬    性
數據庫服務器

SQLCASQLCA簡介

SQLCA是一個存儲區域
SQLCA(SQL Communication Access)
它會被傳遞到需要與數據庫服務器進行通信的所有數據庫庫函數中。它會在所有嵌入式 SQL 語句上被隱式傳遞。
全局 SQLCA 變量在接口庫中定義。預處理器會為全局 SQLCA 變量生成外部引用,並且會為該變量的指針生成外部引用。該外部引用名為 sqlca,類型為 SQLCA。指針名為 sqlcaptr。實際的全局變量導入庫中聲明。
SQLCA 由 sqlca.h 頭文件定義,該文件包括在安裝目錄的 h 子目錄中。

SQLCASQLCA字段

SQLCA 中的字段具有以下含義:
*sqlcaid8 字節字符字段,包含作為 SQLCA 結構標識的字符串 SQLCA。在您查看內存內容時,該字段可幫助進行調試。
*sqlcabc包含 SQLCA 結構的長度(136 字節)的長型整數。
*sqlcode數據庫在請求上檢測到錯誤時,指定錯誤代碼的長整數。錯誤代碼的定義可在頭文件 sqlerr.h 中找到。成功操作的錯誤代碼是 0(零),正數表示警告,負數表示錯誤。
有關錯誤代碼的完整列表,請參見 ASA 錯誤消息。
*sqlerrmlsqlerrmc 字段中信息的長度。
*sqlerrmc要插入到錯誤消息中的零個或多個字符串。某些錯誤消息包含一個或多個佔位字符串(%1、%2、...),這些佔位字符串可替換為此字段中的字符串。
例如,如果生成未找到表錯誤,則 sqlerrmc 包含表名,該表名要插入到錯誤消息中的適當位置。
有關錯誤消息的完整列表,請參見 ASA 錯誤消息。
*sqlerrp保留。
*sqlerrd長整數的實用程序數組
*sqlwarn保留。
*sqlstateSQLSTATE 狀態值。除了以前標準中的 SQLCODE 值外,ANSI SQL 標準 (SQL-92) 還定義了 SQL 語句的一種新類型的返回值。SQLSTATE 值始終是一個由五個字符組成且以空值終止的字符串,它分為雙字符類(前兩個字符)和三字符子類。每個字符都可以是從 0 到 9 的數字或從 A 到 Z 的大寫字母字符。
以 0 到 4 或 A 到 H 開頭的任何類或子類都是由 SQL 標準定義的,其它類和子類則是各實現自行定義的。SQLSTATE 值 '00000' 表示還沒有錯誤或警告。
有關更多的 SQLSTATE 值,請參見 ASA 錯誤消息。

SQLCA數組元素

sqlerror 字段數組具有以下元素。
*[b]sqlerrd[1] (SQLIOCOUNT)[/b] 完成命令所需的實際輸入/輸出操作數
數據庫執行每個命令之前不會清零。在執行一個命令序列之前,您的程序可以將此變量設置為零。在最後一個命令執行之後,此數字是整個命令序列的輸入/輸出操作的總數。
*[b]sqlerrd[2] (SQLCOUNT)[/b] 此字段的值取決於要執行的語句。
INSERT、UPDATE、PUT 和 DELETE 語句
受語句影響的行數。
遊標 OPEN 上,該字段由遊標中的實際行數(大於或等於 0 的值)或它的估計數(絕對值是估計數的負數)填充。如果數據庫服務器不統計該值即可計算出行數,則該值就是實際行數。也可以使用 ROW_COUNT 選項,將數據庫配置為始終返回實際的行數。
FETCH 遊標語句
如果返回 SQLE_NOTFOUND 警告,則填充 SQLCOUNT 字段。它包含 FETCH RELATIVE 或 FETCH ABSOLUTE 語句超出可能的遊標位置(遊標可以位於某一行上、第一行之前或最後一行之後)範圍之外的行數。在寬讀取的情況下,SQLCOUNT 是實際讀取的行數,它小於或等於請求的行數。在寬讀取過程中,不 設置 SQLE_NOTFOUND。
有關寬讀取的詳細信息,請參見一次讀取多個行。
如果未找到行但位置有效,則值為 0,例如,當定位在遊標的最後一行上時執行 FETCH RELATIVE 1。如果所嘗試的讀取超出了遊標的末尾,則為正值;如果所嘗試的讀取位於遊標開頭的前面,則為負值。
GET DATA 語句
SQLCOUNT 字段保存值的實際長度。
DESCRIBE 語句
在用於説明可能具有多個結果集的過程的 WITH VARIABLE RESULT 子句中,SQLCOUNT 設置為以下值之一:
+0 結果集可能會有變化:在每個 OPEN 語句之後應再次説明過程調用。
+1 結果集是固定的。不需要再次進行説明。
在出現語法錯誤 SQLE_SYNTAX_ERROR 的情況下,此字段包含命令字符串內檢測到錯誤的大致字符位置。
*[b]sqlerrd[3] (SQLIOESTIMATE)[/b] 完成命令所需的輸入/輸出操作的估計數。在 OPEN 或 EXPLAIN 命令上將給此字段賦一個值。

SQLCA錯誤代碼

可引用 SQLCA 測試特定錯誤代碼。當數據庫請求有錯誤時,sqlcode 和 sqlstate 字段包含錯誤代碼。某些 C 宏是為引用 sqlcode 字段、sqlstate 字段和某些其它字段而定義的。
sqlca.sqlcode 的數值含義
如果一個 SQL 語句發生了錯誤,那麼 sqlca.sqlcode 將是非零值。
如果 sqlca.sqlcode 小於 0 那麼就是發生了某種嚴重的錯誤,象數據庫定義與查詢定義不一致等.
如果大於 0 則是通常的錯誤,象表不包括所要求的行等.
sqlca.sqlcode == 0,成功
sqlca.sqlcode == -1 失敗(獲取具體失敗信息:messagebox('',"出錯信息:"+sqlca.SQLErrText) )--PB裏的操作方法
可能發生的錯誤列表:
-12, Out of memory in line %d.
通常不出現這個錯誤。這是你的虛擬內存耗盡的標誌。
-200, Unsupported type %s on line %d.
通常不出現這個錯誤.這表明預編譯器生成了一些庫(函數)不認得的東西.可能你運行的預編譯器和當前庫不兼容.
-201, Too many arguments line %d.
這意味着 Postgres 返回了比我們的匹配變量更多的參數.可能你漏了幾個INTO :var1,:var2-列表裏的宿主變量.
-202, Too few arguments line %d.
這意味着 Postgres 返回了比我們的對應宿主變量要少的參數.可能你多輸入了幾個INTO :var1,:var2-列表裏的宿主變量.
-203, Too many matches line %d.
着意味着查詢返回了多個行,但你聲明的變量不是數組.你執行的 SELECT 可能不是唯一的.
-204, Not correctly formatted int type: %s line %d.
着意味着宿主變量是一個 int 類型並且 Postgres 數據庫裏的字段是另一種類型,包含着一個不能轉換成一個 int 類型的數值.庫(函數)使用 strtol 做此類轉換.
-205, Not correctly formatted unsigned type: %s line %d.
着意味着宿主變量是一個 unsigned int(無符號整數)類型而Postgres 數據庫裏的字段是另外一種類型並且包含一個不能轉換成unsigned int 的數值.庫(函數)使用 strtoul 做這類轉換.
-206, Not correctly formatted floating point type: %s line %d.
着意味着宿主變量是一個 float (浮點)類型而 Postgres 數據庫裏的字段是另外一種類型並且包含一個不能轉換成 float 的數值.庫(函數)使用 strtod 做這類轉換.
-207, Unable to convert %s to bool on line %d.
這意味着宿主變量是一個 bool (布爾)類型,而 Postgres 數據庫裏的字段值既不是 't' 也不是 'f'。
-208, Empty query line %d.
Postgres 返回 PGRES_EMPTY_QUERY,可能的原因是該查詢實際上是空的。
-220, No such connection %s in line %d.
程序試圖訪問一個不存在的聯接。
-221, Not connected in line %d.
程序試圖訪問一個存在的,但是沒有打開的聯接。
-230, Invalid statement name %s in line %d.
你試圖使用的語句還沒準備好。
-400, Postgres error: %s line %d.
某種 Postgres 錯誤。該消息包含來自 Postgres 後端的信息。
-401, Error in transaction processing line %d.
Postgres 給我們的信號,表明我們無法開始,提交或者回卷該事務
-402, connect: could not open database %s.
與數據庫的聯接無法工作。
sqlca.sqlcode == 100, Data not found line %d.
這是一個"正常的"錯誤,告訴你你正在查詢的東西找不到或者我們已經越過了遊標的範圍。

SQLCA使用多個

您可以在任一受支持的嵌入式SQL 環境中使用多個 SQLCA 支持,但僅在再入式代碼中要求這樣做。
下面的列表詳細説明必須使用多個 SQLCA 的環境:
多線程應用程序
如果多個線程使用同一 SQLCA,上下文切換會導致多個線程同時使用該 SQLCA。每個線程都必須具有它自己的 SQLCA。當 DLL 使用嵌入式 SQL 且被應用程序中的多個線程調用時,也會發生這種情況。
動態鏈接庫和共享庫DLL
只有一個數據段數據庫服務器在處理一個應用程序發出的請求時,也可能會優先處理另一個應用程序向該數據庫服務器發出的請求。如果您的 DLL 使用全局 SQLCA,則這兩個應用程序會同時使用它。每個 Windows 應用程序都必須具有它自己的 SQLCA。
具有一個數據段的 DLL
可以將 DLL 創建為只有一個數據段,或者對於每個應用程序有一個數據段。如果您的 DLL 只有一個數據段,則無法使用全局 SQLCA,其原因與 DLL 無法使用全局 SQLCA 的原因相同。每個應用程序必須具有它自己的 SQLCA。

SQLCASQLCA源代碼

#ifndef POSTGRES_SQLCA_H
#define POSTGRES_SQLCA_H
#ifndef DLLIMPORT
#ifdef __CYGWIN__
#define DLLIMPORT __declspec (dllimport)
#else
#define DLLIMPORT
#endif /* __CYGWIN__ */
#endif /* DLLIMPORT */
#define SQLERRMC_LEN 70
#ifdef __cplusplus
extern "C"
#endif
struct sqlca
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct
int sqlerrml;
char sqlerrmc[SQLERRMC_LEN];
sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
/* Element 0: empty */
/* 1: OID of processed tuple if applicable */
/* 2: number of rows processed */ /* after an INSERT, UPDATE or */ /* DELETE statement */
/* 3: empty */ /* 4: empty */ /* 5: empty */ char sqlwarn[8]; /* Element 0: set to 'W' if at least one other is 'W' */
/* 1: if 'W' at least one character string */ /* value was truncated when it was */ /* stored into a host variable. */
/* * 2: if 'W' a (hopefully) non-fatal notice occured */
/* 3: empty */ /* 4: empty */ /* 5: empty */ /* 6: empty */ /* 7: empty */
char sqlext[8];
extern DLLIMPORT struct sqlca sqlca;
#ifdef __cplusplus
#endif
#endif
SQLCA是PowerBuilder的其中一個全局變量
SQLCA是SQLCA Communications Area的縮寫,稱為事務對象,PowerBuilder用SQLCA來定義數據庫需要的一些信息。 [1] 
SQLCA是PowerBuilder眾多對象中最重要的一個對象,並且也是最不好理解的一個對象。它實際上是PowerBuilder程序與數據庫之間傳遞信息的一個結構變量,共有15個成員。
[注]事務對象的15個成員
序號 名稱 類型 説明
1 DBMS string 所使用的數據庫管理系統的名字,如Sybase,Oracle,ODBC。
2 Database string 要連接的數據庫名字。
3 UserID string 連接數據庫所用的用户名。有的DBMS不需要此項。
4 DBPass string 用户連接數據庫的口令。
5 Lock string 這是數據庫的保護級別,一般不必給出。
6 LogID string 登錄到數據庫服務器上的用户名,有的DBMS不需要此項,但Sybase和Oracle需要指定這個參數。
7 LogPass string 登錄到數據庫服務器上的用户口令。這個屬性可設可不設,但Sybase和Oracle需要指定口令。
8 ServerName string 數據庫服務器名。
9 AutoCommit boolean 指定是否將數據庫設置成自動提交所有事務。默認是False,也就是説,必須在應用程序中進行事務管理,並在適當的時候對數據庫提交事務。如果選擇True,則每個事務都由系統自動提交。
10 DBParm string 用於向數據庫傳遞特殊信息的屬性。
11 SQLCode long 指示最近一次SQL操作失敗或成功。它的取值為:
返回結果 0 無錯誤。
-1 出現一個錯誤。
100 沒有檢索到數據。
12 SQLNRows long 最近一次SQL操作影響的行數,數據庫不同其含義也不同。
13 SQLDBCode long 數據庫錯誤代碼。不同的數據庫的含義不同。
14 SQLErrText string 相應於SQLDBCode屬性中錯誤碼的文字説明。
15 SQLReturnData string 返回DBMS執行SQL的附加信息,不同的DBMS其值不同。
參考資料
  • 1.    PowerBuilder實用教程(第3版)120頁。