SQLCA

SQLCA

SQLCA是一個存儲區域,將統計和錯誤從應用程式傳遞到資料庫伺服器再傳回應用程式的每個資料庫請求會使用它。SQLCA 用作應用程式到資料庫的通信連結的句柄。

基本介紹

  • 中文名:SQL通信區
  • 外文名:SQL Communication Area
  • 簡稱:SQLCA
  • 屬性資料庫伺服器
SQLCA是一個存儲區域,SQLCA 欄位,sqlerror 數組元素,INSERT、UPDATE、PUT 和 DELETE 語句,FETCH 游標語句,GET DATA 語句,DESCRIBE 語句,SQLCA 錯誤代碼,使用多個 SQLCA,多執行緒應用程式,動態程式庫和共享庫DLL,具有一個數據段的 DLL,SQLCA 原始碼,SQLCA是PowerBuilder的其中一個全局變數,

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其值不同。

相關詞條

熱門詞條

聯絡我們