您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

6.3. 如何使用 ecpg

本节讨论如何使用 ecpg

6.3.1. 预编译器

预编译器叫 ecpg .在安装过后它存放在 PostgreSQL bin/ 目录下面.

6.3.2. 库

ecpg 库叫做 libecpg.a libecpg.so .另外,该库用了 libpq 库与 PostgreSQL 服务器通讯. 你必须用 -lecpg -lpq 链接你的程序.

库里面有一些方法是"隐藏"的,但是有时候这些方法可能非常有用.

  • ECPGdebug(int on , FILE * stream ) 如果第一个参数不为零则打开调试信息. 调试信息记录在 stream . 大多数 SQL 语句把它的参数和结果记录日志.

    最重要的一个函数, ECPGdo , 用全部展开的字符串记录所有 SQL 语句的日志, 也就是说,那些带有已插入所有变量的字符串和从 PostgreSQL 服务器来的结果. 这个特性对搜索你的 SQL 语句的错误是非常有用的.

  • ECPGstatus() 这个方法/函数在我们与一个数据库联接后返回 TRUE 并且如果没有联接返回 FALSE .

6.3.3. 错误处理

要检测来自 PostgreSQL 服务器的错误,包含如下一行

exec sql include sqlca;

到你的文件的包含段里.这样做将会定义一个结构和一个象下面一样名为 sqlca 的变量:

struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
 /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 char sqlwarn[8];
 /* 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: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */
 char sqlext[8];
} sqlca;

如果最后一个 SQL 语句没有发生错误, 那么 sqlca.sqlcode 将是 0 (ECPG_NO_ERROR).如果 sqlca.sqlcode 小于 0 那么就是发生了某种严重的错误, 象数据库定义与查询定义不一致等.如果大于零则是通常的错误, 比如表不包括所要求的行等.

sqlca.sqlerrm.sqlerrmc 将包含一个字符串描述该错误. 该字符串以源文件的行号结尾。

下面是可能发生的错误:

-12, Out of memory in line %d.

通常不出现这个错误。这是你的虚拟内存耗尽的标志。

-200 (ECPG_UNSUPPORDED): Unsupported type %s on line %d.

通常不出现这个错误.这表明预编译器生成了一些库(函数)不认得的东西. 可能你运行的预编译器和当前库不兼容.

-201 (ECPG_TOO_MANY_ARGUMENTS): Too many arguments line %d.

这意味着 PostgreSQL 返回了比我们的匹配变量更多的参数. 可能你漏了几个 INTO :var1,:var2 -列表里的宿主变量.

-202 (ECPG_TOO_FEW_ARGUMENTS): Too few arguments line %d.

这意味着 PostgreSQL 返回了比我们的对应宿主变量要少的参数. 可能你多输入了几个 INTO :var1,:var2 -列表里的宿主变量.

-203 (ECPG_TOO_MANY_MATCHES): Too many matches line %d.

这意味着查询返回了多个行,但你声明的变量不是数组. SELECT 命令不是唯一的.

-204 (ECPG_INT_FORMAT): Not correctly formatted int type: %s line %d.

这意味着宿主变量是一个 int 类型而 PostgreSQL 数据库里的字段是另一种类型, 包含着一个不能转换成一个 int 类型的数值.库(函数)使用 strtol() 做此类转换.

-205 (ECPG_UINT_FORMAT): Not correctly formatted unsigned type: %s line %d.

这意味着宿主变量是一个 unsigned int (无符号整数)类型而 PostgreSQL 数据库里的字段是另外一种类型 并且包含一个不能转换成 unsigned int 的数值.库(函数)使用 strtoul() 做这类转换.

-206 (ECPG_FLOAT_FORMAT): Not correctly formatted floating-point type: %s line %d.

这意味着宿主变量是一个 float (浮点)类型而 PostgreSQL 数据库里的字段是另外一种类型并且 包含一个不能转换成 float 的数值.库(函数)使用 strtod() 做这类转换.

-207 (ECPG_CONVERT_BOOL): Unable to convert %s to bool on line %d.

这意味着宿主变量是一个 bool (布尔)类型,而 PostgreSQL 数据库里的字段值既不是 't' 也不是 'f'。

-208 (ECPG_EMPTY): Empty query line %d.

PostgreSQL 返回 PGRES_EMPTY_QUERY ,可能的原因是该查询实际上是空的。

-209 (ECPG_MISSING_INDICATOR): NULL value without indicator in line %d.

PostgreSQL 返回了 ECPG_MISSING_INDICATOR 是因为收到了一个 NULL 返回但是没有提供 NULL 指示符变量.

-210 (ECPG_NO_ARRAY): Variable is not an array in line %d.

PostgreSQL 返回了 ECPG_NO_ARRAY 是因为在需要一个数组的地方使用了一个普通变量.

-211 (ECPG_DATA_NOT_ARRAY): Data read from backend is not an array in line %d.

PostgreSQL 返回了 ECPG_DATA_NOT_ARRAY 数据库在一个需要数组数值的地方返回了一个普通变量.

-220 (ECPG_NO_CONN): No such connection %s in line %d.

程序试图访问一个不存在的联接。

-221 (ECPG_NOT_CONN): Not connected in line %d.

程序试图访问一个存在的,但是没有打开的联接。

-230 (ECPG_INVALID_STMT): Invalid statement name %s in line %d.

你试图使用的语句还没准备好。

-240 (ECPG_UNKNOWN_DESCRIPTOR): Descriptor %s not found in line %d.

没有找到你声明的描述符.你试图使用的语句没有准备好.

-241 (ECPG_INVALID_DESCRIPTOR_INDEX): Descriptor index out of range in line %d.

声明的描述符索引超出了范围.

-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM): Descriptor %s not found in line %d.

没有找到你声明的描述符.你试图使用的语句没有准备好.

-243 (ECPG_VAR_NOT_NUMERIC): Variable is not a numeric type in line %d.

数据库返回了一个数字数值,而该变量不是数字数值.

-244 (ECPG_VAR_NOT_CHAR): Variable is not a character type in line %d.

数据库返回了一个非数字数值,但该变量是数字类型.

-400 (ECPG_PGSQL): PostgreSQL error: %s line %d.

某种 PostgreSQL 错误。该消息包含来自 PostgreSQL 后端的信息。

-401 (ECPG_TRANS): Error in transaction processing line %d.

PostgreSQL 给我们的信号,告诉我们无法开始,提交或者回卷该事务。

-402 (ECPG_CONNECT): connect: could not open database %s.

与数据库的联接无法工作。

100 (ECPG_NOT_FOUND): Data not found line %d.

这是一个"正常的"错误, 告诉你你正在查询的东西找不到或者我们已经到了游标的结尾。