44.3. 如何使用 egpc
本节介绍如何使用 egpc 工具。
44.3.1. 预处理器
预处理器叫做 ecpg。安装后它位于
Postgres 的 bin/ 目录中。
44.3.2. 库
ecpg 库叫做
libecpg.a 或
libecpg.so。此外,该库用 libpq 库与
Postgres 服务器通信,因此你必须用
-lecpg -lpq 链接你的程序。
库中有一些"隐藏的"方法,但它们有时可能非常有用。
- ECPGdebug(int, FILE *stream)
如果以第一个参数非零调用它,就会打开调试日志。调试日志输出到
stream。大多数 SQL 语句会记录其参数和结果。最重要的一个(
ECPGdo)在除EXEC SQL COMMIT、EXEC SQL ROLLBACK、EXEC SQL CONNECT之外的所有 SQL 语句上都会被调用,它同时记录展开后的字符串、即插入了所有输入变量的字符串,以及 Postgres 服务器的结果。在查找 SQL 语句中的错误时这非常有用。- ECPGstatus()
这个方法在已连接到数据库时返回 TRUE,否则返回 FALSE。
44.3.3. 错误处理
为了能够检测来自 Postgres 服务器的错误,你需要在文件的 include 节中加入类似下面的一行:
exec sql include sqlca;
这会定义一个结构和名为 sqlca 的变量,如下所示:
struct sqlca {
int sqlcode;
struct {
int sqlerrml;
char sqlerrmc[1000];
} sqlerrm;
} sqlca;
如果最后一条 SQL 语句发生了错误,sqlca.sqlcode
将非零。如果 sqlca.sqlcode 小于 0,则是某种严重错误,比如数据库定义与给定的查询不匹配。如果大于 0,则是普通错误,比如表中不包含所请求的行。
sqlca.sqlerrm.sqlerrmc 将包含一个描述错误的字符串。该字符串以 “line 23.” 结尾,其中行号是源文件中的行号(实际上是预处理器生成的文件中的行号,但我希望将来能把它修正为输入文件中的行号。)
可能发生的错误列表:
- -1, Unsupported type %s on line %d.
通常不应出现。这表明预处理器生成了库不认识的内容。也许你运行的预处理器和库的版本不兼容。
- -1, Too many arguments line %d.
预处理器出错了,生成了不正确的代码。
- -1, Too few arguments line %d.
预处理器出错了,生成了不正确的代码。
- -1, Error starting transaction line %d.
Postgres signalled to us that we cannot open the connection.
- -1, Postgres error: %s line %d.
某种 Postgres 错误。消息中包含来自 Postgres 后端的错误消息。
- 1, Data not found line %d.
这是一个"正常"错误,告诉你所查询的内容找不到,或者游标已经取到了末尾。
- -1, To many matches line %d.
这表示查询返回了多行。你执行的
SELECT可能不是唯一的。- -1, Not correctly formatted int type: %s line %d.
这表示宿主变量的类型是
int,而 Postgres 数据库中的字段是另一种类型,其值无法解释为int。库使用strtol做这一转换。- -1, Not correctly formatted unsigned type: %s line %d.
这表示宿主变量的类型是
unsigned int,而 Postgres 数据库中的字段是另一种类型,其值无法解释为unsigned int。库使用strtoul做这一转换。- -1, Not correctly formatted floating point type: %s line %d.
这表示宿主变量的类型是
float,而 Postgres 数据库中的字段是另一种类型,其值无法解释为float。库使用strtod做这一转换。- -1, Too few arguments line %d.
这表示 Postgres 返回的记录多于我们匹配的变量。也许你在
INTO :var1,:var2列表中漏掉了几个宿主变量。- -1, Too many arguments line %d.
这表示 Postgres 返回的记录少于我们的宿主变量数。也许你的
INTO :var1,:var2列表中宿主变量太多了。- -1, Empty query line %d.
Postgres 返回了 PGRES_EMPTY_QUERY。
- -1, Error: %s line %d.
这表示 Postgres 返回了 PGRES_NONFATAL_ERROR、PGRES_FATAL_ERROR 或 PGRES_BAD_RESPONSE 错误之一。是哪一个以及为什么在消息中有说明。
- -1, Postgres error line %d.
Postgres 返回了库不知道如何处理的内容。这很可能是因为 Postgres 的版本与 ecpg 库的版本不匹配。
- -1, Error committing line %d.
COMMIT期间出错。EXEC SQL COMMIT被转换为 Postgres 中的end操作,而该操作无法执行。- -1, Error rolling back line %d.
ROLLBACK期间出错。EXEC SQL ROLLBACK被转换为 Postgres 中的abort操作,而该操作无法执行。- -1, ECPGconnect: could not open database %s.
连接数据库失败。