更新时间:2026-07-28 GMT+08:00
使用库函数
ECPGdebug(int on, FILE *stream)
若函数第一个参数为非0,则开启调试日志,第二个参数表示要打印日志的标准输出流。调试日志在标准输出流上执行,日志包含所有输入的SQL语句以及来自GaussDB服务器的结果。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"
int main()
{
ECPGdebug(1, stderr);
/* 需提前创建testdb */
EXEC SQL CONNECT TO testdb;
EXEC SQL SET AUTOCOMMIT TO ON;
EXEC SQL CREATE TABLE T1(a int);
return (0);
} 运行结果如下([23893]为线程ID,随机生成):
[23893]: ECPGdebug: set to 1 [23893]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT> [23893]: ECPGsetcommit on line 12: action "on"; connection "testdb" [23893]: ecpg_execute on line 13: query: create table T1 ( a int ); with 0 parameter(s) on connection testdb [23893]: ecpg_execute on line 13: using PQexec [23893]: ecpg_execute on line 13: OK: CREATE TABLE
ECPGget_PGconn(const char *connection_name)
返回由给定名称标识的数据库连接句柄。如果connection_name设置为NULL,则返回当前连接句柄。如果没有连接句柄可以被识别,则该函数返回NULL。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"
int main()
{
ECPGdebug(1, stderr);
/* 需提前创建testdb数据库 */
EXEC SQL CONNECT TO testdb as con1;
EXEC SQL SET AUTOCOMMIT TO ON;
EXEC SQL DROP TABLE IF EXISTS T1;
PGconn *conn;
conn = ECPGget_PGconn("con1");
printf("conn = %p\n", conn);
conn = ECPGget_PGconn(NULL);
printf("conn = %p\n", conn);
EXEC SQL CREATE TABLE T1(a int);
return (0);
} 运行结果如下([29709]为线程ID,随机生成。连接生成地址随机,运行结果不固定。):
[29709]: ECPGdebug: set to 1 [29709]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT> [29709]: ECPGsetcommit on line 12: action "on"; connection "con1" [29709]: ecpg_execute on line 13: query: drop table if exists T1; with 0 parameter(s) on connection con1 [29709]: ecpg_execute on line 13: using PQexec [29709]: ecpg_execute on line 13: OK: DROP TABLE conn = 0x14daf70 conn = 0x14daf70 [29709]: ecpg_execute on line 19: query: create table T1 ( a int ); with 0 parameter(s) on connection con1 [29709]: ecpg_execute on line 19: using PQexec [29709]: ecpg_execute on line 19: OK: CREATE TABLE
ECPGtransactionStatus(const char *connection_name)
返回connection_name连接的当前事务状态。可能的返回值包括:
PQTRANS_IDLE, /* connection idle,连接空闲 */ PQTRANS_ACTIVE, /* command in progress,命令正在执行 */ PQTRANS_INTRANS, /* idle, within transaction block,空闲,在事务块里 */ PQTRANS_INERROR, /* idle, within failed transaction,空闲,在失败的事务里 */ PQTRANS_UNKNOWN /* cannot determine status,未知状态 */
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"
int main()
{
ECPGdebug(1, stderr);
/* 需提前创建testdb数据库 */
EXEC SQL CONNECT TO testdb as con1;
EXEC SQL DROP TABLE IF EXISTS T1;
int a = ECPGtransactionStatus("con1");
printf("%d\n", a);
EXEC SQL CREATE TABLE T1(a int);
EXEC SQL COMMIT;
return (0);
} 运行结果如下([44153]为线程ID,随机生成):
[44153]: ECPGdebug: set to 1 [44153]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT> [44153]: ecpg_execute on line 12: query: drop table if exists T1; with 0 parameter(s) on connection con1 [44153]: ecpg_execute on line 12: using PQexec [44153]: ecpg_execute on line 12: OK: DROP TABLE 2 [44153]: ecpg_execute on line 15: query: create table T1 ( a int ); with 0 parameter(s) on connection con1 [44153]: ecpg_execute on line 15: using PQexec [44153]: ecpg_execute on line 15: OK: CREATE TABLE [44153]: ECPGtrans on line 16: action "commit"; connection "con1"
ECPGfree_auto_mem()
释放为输出型宿主变量申请的所有内存,在程序结束时调用(return\exit)。
示例如下:
前提条件:需要提前创建testdb数据库。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
int *ip1=0;
char **cp2=0;
int *ipointer1=0;
int *ipointer2=0;
int column;
EXEC SQL END DECLARE SECTION;
int i;
EXEC SQL WHENEVER SQLERROR DO sqlprint();
EXEC SQL CONNECT TO testdb;
/* 需提前创建testdb数据库 */
EXEC SQL CREATE TABLE test (a int, b text);
EXEC SQL INSERT INTO test VALUES (1, 'one');
EXEC SQL INSERT INTO test VALUES (2, 'two');
EXEC SQL INSERT INTO test VALUES (NULL, 'three');
EXEC SQL INSERT INTO test VALUES (NULL, NULL);
EXEC SQL ALLOCATE DESCRIPTOR mydesc;
EXEC SQL SELECT * INTO SQL DESCRIPTOR mydesc FROM test;
EXEC SQL GET DESCRIPTOR mydesc :column=COUNT;
EXEC SQL GET DESCRIPTOR mydesc VALUE 1 :ip1=DATA, :ipointer1=INDICATOR;
EXEC SQL GET DESCRIPTOR mydesc VALUE 2 :cp2=DATA, :ipointer2=INDICATOR;
printf("Result (%d columns):\n", column);
for (i=0;i < sqlca.sqlerrd[2];++i)
{
if (ipointer1[i]) printf("NULL, ");
else printf("%d, ",ip1[i]);
if (ipointer2[i]) printf("NULL, ");
else printf("'%s', ",cp2[i]);
printf("\n");
}
ECPGfree_auto_mem();
printf("\n");
EXEC SQL DEALLOCATE DESCRIPTOR mydesc;
EXEC SQL ROLLBACK;
EXEC SQL DISCONNECT;
return 0;
} 运行结果如下:
Result (2 columns): 1, 'one', 2, 'two', NULL, 'three', NULL, NULL,
父主题: ecpg