SQLCA是一個存儲區域
SQLCA(SQL Communication Access)
它會被傳遞到需要與資料庫伺服器進行通信的所有資料庫庫函式中。它會在所有嵌入式 SQL 語句上被隱式傳遞。
全局 SQLCA 變數在接口庫中定義。預處理器會為全局 SQLCA 變數生成外部引用,並且會為該變數的指針生成外部引用。該外部引用名為 sqlca,類型為 SQLCA。指針名為 sqlcaptr。實際的全局變數在導入庫中聲明。
SQLCA 由 sqlca.h 頭檔案定義,該檔案包括在安裝目錄的 h 子目錄中。
SQLCA 欄位
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 錯誤訊息。
sqlerror 數組元素
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。
SQLCA 原始碼
#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來定義資料庫需要的一些信息。
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其值不同。