|
|
本节讨论如何使用
ecpg
.
预编译器叫
ecpg
.在安装过后它存放在
PostgreSQL
bin/
目录下面.
ecpg
库叫做
libecpg.a
或
libecpg.so
.另外,该库用了
libpq
库与
PostgreSQL
服务器通讯.
你必须用
-lecpg -lpq
链接你的程序.
库里面有一些方法是"隐藏"的,但是有时候这些方法可能非常有用.
-
ECPGdebug(int
on
, FILE
*
stream
)
如果第一个参数不为零则打开调试信息.
调试信息记录在
stream
.
大多数
SQL
语句把它的参数和结果记录日志.
最重要的一个函数,
ECPGdo
,
用全部展开的字符串记录所有
SQL
语句的日志,
也就是说,那些带有已插入所有变量的字符串和从
PostgreSQL
服务器来的结果.
这个特性对搜索你的
SQL
语句的错误是非常有用的.
-
ECPGstatus()
这个方法/函数在我们与一个数据库联接后返回 TRUE
并且如果没有联接返回 FALSE .
要检测来自
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.
-
这是一个"正常的"错误,
告诉你你正在查询的东西找不到或者我们已经到了游标的结尾。
|