更新时间:2024-11-01 GMT+08:00
执行预备语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
/* * testlibpq2.c 测试PQprepare * PQprepare: 创建一个给定参数的预备语句,用于PQexecPrepared执行预备语句。 */ #include <stdio.h> #include <stdlib.h> #include <libpq-fe.h> #include <string.h> int main(int argc, char * argv[]) { /* 此处user、passwd等变量应从环境变量或配置文件读取,环境变量需用户自己按需配置;非环境变量情况下可直接赋值字符串 */ PGconn *conn; PGresult * res; ConnStatusType pgstatus; char connstr[1024]; char cmd_sql[2048]; int nParams = 0; int paramLengths[5]; int paramFormats[5]; Oid paramTypes[5]; char * paramValues[5]; int i, cnt; char cid[32]; int k; char *passwd = getenv("EXAMPLE_PASSWD_ENV"); char *port = getenv("EXAMPLE_PORT_ENV"); char *hostaddr = getenv("EXAMPLE_HOST_ENV"); char *username = getenv("EXAMPLE_USERNAME_ENV"); char *dbname = getenv("EXAMPLE_DBNAME_ENV"); /* PQconnectdb连接数据库, 详细的连接信息为connstr */ sprintf(connstr, "hostaddr=%s dbname=%s port=%s user=%s password=%s", hostaddr, dbname, port, username, passwd); conn = PQconnectdb(connstr); pgstatus = PQstatus(conn); if (pgstatus == CONNECTION_OK) { printf("Connect database success!\n"); } else { printf("Connect database fail:%s\n",PQerrorMessage(conn)); return -1; } /* 创建表t01 */ res = PQexec(conn, "DROP TABLE IF EXISTS t01;CREATE TABLE t01(a int, b int);INSERT INTO t01 values(1, 23);"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { printf("Command failed: %s.\n", PQerrorMessage(conn)); PQfinish(conn); return -1; } /* cmd_sql查询 */ sprintf(cmd_sql, "SELECT b FROM t01 WHERE a = $1"); /* cmd_sql中$1对应的参数 */ paramTypes[0] = 23; /* PQprepare创建一个给定参数的预备语句 */ res = PQprepare(conn, "pre_name", cmd_sql, 1, paramTypes); if( PQresultStatus(res) != PGRES_COMMAND_OK ) { printf("Failed to prepare SQL : %s\n: %s\n",cmd_sql, PQerrorMessage(conn)); PQfinish(conn); return -1; } PQclear(res); paramValues[0] = cid; for (k=0; k<2; k++) { sprintf(cid, "%d", 1); paramLengths[0] = 6; paramFormats[0] = 0; /* 执行预备语句 */ res = PQexecPrepared(conn, "pre_name", 1, paramValues, paramLengths, paramFormats, 0); if( (PQresultStatus(res) != PGRES_COMMAND_OK ) && (PQresultStatus(res) != PGRES_TUPLES_OK)) { printf("%s\n",PQerrorMessage(conn)); PQclear(res); PQfinish(conn); return -1; } cnt = PQntuples(res); printf("return %d rows\n", cnt); for (i=0; i<cnt; i++) { printf("row %d: %s\n", i, PQgetvalue(res, i, 0)); } PQclear(res); } /* 执行结束,关闭连接 */ PQfinish(conn); return 0; } |
示例运行结果如下:
Connect database success! NOTICE: table "t01" does not exist, skipping return 1 rows row 0: 23 return 1 rows row 0: 23
父主题: 典型应用开发示例