2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|

2018-01-09 postgreSQL DBに C++ で読み書きをする [長年日記]

/*
  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);
}
syntax2html