一、PGconn 对象
二、命令执行函数
if (PQresultStatus(*pgres) != PGRES_COMMAND_OK) { //error handling }
三、SQL 注入 PQExecParam
为避免这种情况,PostgreSQL 通过协议将动态参数作为单独的实体发送,PQExecParam 就是其中一种方法:
PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
四、错误处理
#define PG_DIAG_SEVERITY 'S' #define PG_DIAG_SQLSTATE 'C' #define PG_DIAG_MESSAGE_PRIMARY 'M' #define PG_DIAG_MESSAGE_DETAIL 'D' #define PG_DIAG_MESSAGE_HINT 'H' #define PG_DIAG_STATEMENT_POSITION 'P' #define PG_DIAG_INTERNAL_POSITION 'p' #define PG_DIAG_INTERNAL_QUERY 'q' #define PG_DIAG_CONTEXT 'W' #define PG_DIAG_SCHEMA_NAME 's' #define PG_DIAG_TABLE_NAME 't' #define PG_DIAG_COLUMN_NAME 'c' #define PG_DIAG_DATATYPE_NAME 'd' #define PG_DIAG_CONSTRAINT_NAME 'n' #define PG_DIAG_SOURCE_FILE 'F' #define PG_DIAG_SOURCE_LINE 'L' #define PG_DIAG_SOURCE_FUNCTION 'R'
五、获取结果
void printPGresult(PGresult *res) { std::cout << PQntuples(res) << "tuples, " << PQnfields(res) << " fields" << std::endl; // print column name for (int i = 0; i < PQnfields(res); i++) { std::cout << PQfname(res, i) << "\t"; } std::cout << std::endl; // print column values for (int i = 0; i < PQntuples(res); i++) { for (int j = 0; j < PQnfields(res); j++) { std::cout << PQgetvalue(res, i, j) << "\t"; } std::cout << std::endl; } }
六、总结
Hi,访客,请登录!欢迎分享,一起交流~
体验全新的分布式多模数据库解决方案
企业版 社区版
KaiwuDB 是浪潮控股的数据库企业,面向工业物联网、数字能源、车联网、智慧产业等行业领域,提供稳定安全、高性能、易运维的创新数据软件与服务。
友情链接:浪潮