SQLCA(SQL Communication Access)  

SQLCA是一个存储区域,将统计和错误从应用程序传递到数据库服务器再传回应用程序的每个数据库请求会使用它。SQLCA 用作应用程序到数据库的通信链接的句柄。它会被传递到需要与数据库服务器进行通信的所有数据库库函数中。它会在所有嵌入式 SQL 语句上被隐式传递。

 

  全局 SQLCA 变量在接口库中定义。预处理器会为全局 SQLCA 变量生成外部引用,并且会为该变量的指针生成外部引用。该外部引用名为 sqlca,类型为 SQLCA。指针名为 sqlcaptr。实际的全局变量在导入库中声明。

 

  SQLCA 由 sqlca.h 头文件定义,该文件包括在安装目录的 h 子目录中。

SQLCA 字段

  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] 此字段的值取决于要执行的语句。

 

  o INSERT、UPDATE、PUT 和 DELETE 语句受语句影响的行数。

 

  在游标 OPEN 上,该字段由游标中的实际行数(大于或等于 0 的值)或它的估计数(绝对值是估计数的负数)填充。如果数据库服务器不统计该值即可计算出行数,则该值就是实际行数。也可以使用 ROW_COUNT 选项,将数据库配置为始终返回实际的行数。

 

  o FETCH 游标语句如果返回 SQLE_NOTFOUND 警告,则填充 SQLCOUNT 字段。它包含 FETCH RELATIVE 或 FETCH ABSOLUTE 语句超出可能的游标位置(游标可以位于某一行上、第一行之前或最后一行之后)范围之外的行数。在宽读取的情况下,SQLCOUNT 是实际读取的行数,它小于或等于请求的行数。在宽读取过程中,不 设置 SQLE_NOTFOUND。

 

  有关宽读取的详细信息,请参见一次读取多个行。

 

  如果未找到行但位置有效,则值为 0,例如,当定位在游标的最后一行上时执行 FETCH RELATIVE 1。如果所尝试的读取超出了游标的末尾,则为正值;如果所尝试的读取位于游标开头的前面,则为负值。

 

  oGET DATA 语句SQLCOUNT 字段保存值的实际长度。

 

  oDESCRIBE 语句在用于说明可能具有多个结果集的过程的 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来定义数据库需要的一些信息。[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其值不同。