/* gcc -g -I"D:\PostgreSQL\pg96\include" pg_read_write.cpp -o pg_read_write.exe -L"D:\PostgreSQL\pg96\lib" -llibpq -lwsock32 -lws2_32 まず、以下の手順でテーブルを作っておく C:\Users\yrl-user>psql -h localhost -U postgres postgres=# \l postgres=# \connect blogapp(データベース名) 以下をコピペしてテーブルとその内容を直接書き込む create table users ( id serial primary key, name varchar(255), score real, team varchar(255) ); insert into users (name, score, team) values ('taguchi', 5.5, 'red'), ('fkoji', 8.3, 'blue'), ('dotinstall', 2.2, 'blue'), ('sakaki', 5.0, 'green'), ('sasaki', 4.6, 'red'), ('kimura', 4.7, 'green'); blogapp=# \dt blogapp=# \d users(テーブル名) ●データベースのテーブルの中身を確認する blogapp=# select * from users; // 検索の基本形 ●name = 'ebata"は消しておく blogapp=# DELETE FROM users WHERE name = 'ebata'; */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <sys/types.h> #include "libpq-fe.h" int main(int argc, char **argv) { const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=blogapp"; // データベースとの接続を確立する PGconn *conn = PQconnectdb(conninfo); /* バックエンドとの接続確立に成功したかを確認する */ if (PQstatus(conn) != CONNECTION_OK){ fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); } /////////////////////// // テーブルの書き込み /////////////////////// // 続いて users にデータを追加する char stringSQL[] = "INSERT INTO users(name, score, team) VALUES('ebata', 7.7, 'blue');"; PGresult *res = PQexec(conn, stringSQL); // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) { // SQLコマンドが失敗した場合 fprintf(stderr, "INSERT COMMAND IS FAILED.", PQerrorMessage(conn)); } // 値セットが無い場合でも必ず結果をクリアする PQclear(res); /////////////////////// // テーブルの読み出し(1回目) /////////////////////// // テーブルオープン res = PQexec(conn, "SELECT * from users;"); if (res == NULL){ fprintf(stderr, "[SELECT name from users;] failed: %s", PQerrorMessage(conn)); } // SELECTの場合戻り値は PGRES_TUPLES_OK. これを確認しておく if (PQresultStatus(res) != PGRES_TUPLES_OK){ PQerrorMessage(conn); } // まず属性名を表示する。 int nFields = PQnfields(res); for (int i = 0; i < nFields; i++){ printf("%-15s", PQfname(res, i)); } printf("\n\n"); // そして行を表示する。 for (int i = 0; i < PQntuples(res); i++) { for (int j = 0; j < nFields; j++) { printf("%-15s", PQgetvalue(res, i, j)); } printf("\n"); } printf("\n"); printf("\n"); // PQexecを使用した場合、不要になった時点で結果セットをクリア PQclear(res); /////////////////////// // (せっかくつくった)テーブルを削除 /////////////////////// char stringSQL2[] = "DELETE FROM users WHERE name = 'ebata';"; res = PQexec(conn, stringSQL2); // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) { // SQLコマンドが失敗した場合 fprintf(stderr, "INSERT COMMAND IS FAILED.", PQerrorMessage(conn)); } // 値セットが無い場合でも必ず結果をクリアする PQclear(res); /////////////////////// // テーブルの読み出し(2回目) /////////////////////// // テーブルオープン res = PQexec(conn, "SELECT * from users;"); if (res == NULL){ fprintf(stderr, "[SELECT name from users;] failed: %s", PQerrorMessage(conn)); } // SELECTの場合戻り値は PGRES_TUPLES_OK. これを確認しておく if (PQresultStatus(res) != PGRES_TUPLES_OK){ PQerrorMessage(conn); } // まず属性名を表示する。 nFields = PQnfields(res); for (int i = 0; i < nFields; i++){ printf("%-15s", PQfname(res, i)); } printf("\n\n"); // そして行を表示する。 for (int i = 0; i < PQntuples(res); i++) { for (int j = 0; j < nFields; j++) { printf("%-15s", PQgetvalue(res, i, j)); } printf("\n"); } printf("\n"); printf("\n"); // PQexecを使用した場合、不要になった時点で結果セットをクリア PQclear(res); // 最後必ずデータベースとの接続を閉じる PQfinish(conn); }