Подключение к базе Postgresql

  • Автор темы papmail
  • Дата начала
P

papmail

#1
Посоветуйте пожалуста в какую сторону копать...
Есть база данных PostgreSQL, в ней одна таблица - под названием volume4.
Есть MS VC++ 2010 Express.
Задача такая - из файла с данными формата .csv перегнать данные в таблицу.
Сейчас поступаю так - захожу в pgAdmin III (программа для редактирования данных в базе PostgreSL) и выполняю SQL запрос "DELETE FROM volume4;
copy volume4 from 'C:/1/ALL_TICKERS.csv' header csv;
copy (select seccode, sum(vol*waprice) as year_vol from volume4 group by seccode HAVING sum(vol*waprice) > 0 order by year_vol desc) to 'C:/1/ALL_TICKERS1.csv' csv". Все работает.
Хочется написать код на C++, чтобы делать это с помощью .exe файла.
Может быть есть у кого-то опыт соединения с такими базами как PostgreSQL. Много чего есть в документации к Postgresу,
но там всё в общих чертах и не по-русски....
 
P

papmail

#3
Да в том то и дело, что с командой SQL всё нормально, вопрос как эту команду передать из программы на C++ в базу данных.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
А. Понял в чем суть. Попробую подумать (не всегда получается но иногда срабатывает).

Добавлено: Удалось найти вот что:
C++:
 /* 
* libpq sample program 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include "libpq-fe.h"								  /* libpq header file */ 

int 
main() 
{ 
char		state_code[3];						 /* holds user state code */ 
char		query_string[256];					 /* holds constructed SQL query */ 
PGconn	 *conn;								  /* holds database connection */ 
PGresult  *res;									/* holds query result */ 
int		 i; 

conn = PQconnectdb("dbname=test");				 /* connect to the database */ 

if (PQstatus(conn) == CONNECTION_BAD)			  /* did the connection fail? */ 
{ 
fprintf(stderr, "Connection to database failed.\n"); 
fprintf(stderr, "%s", PQerrorMessage(conn)); 
exit(1); 
} 

printf("Enter a state code: ");					/* prompt user for a state code */ 
scanf("%2s", state_code); 

sprintf(query_string,							  /* create an SQL query string */ 
"SELECT name \ 
FROM statename \ 
WHERE code = '%s'", state_code); 

res = PQexec(conn, query_string);				  /* send the query */ 

if (PQresultStatus(res) != PGRES_TUPLES_OK)		 /* did the query fail? */ 
{ 
fprintf(stderr, "SELECT query failed.\n"); 
PQclear(res); 
PQfinish(conn); 
exit(1); 
} 

for (i = 0; i < PQntuples(res); i++)				/* loop through all rows returned */ 
printf("%s\n", PQgetvalue(res, i, 0));		 /* print the value returned */ 

PQclear(res);									  /* free result */ 

PQfinish(conn);									 /* disconnect from the database */ 

return 0; 
}
Но это только пример как работать с базой.. Надо подумать еще...
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
papmail ,в общем вопрос вот в чем: для написания программы нужна бибиотека, найти я ее не смог, возможно мини-SDK есть в дистрибутиве но и его я скачать не смог (точнее не захотел т.к. там нужна регистрация). Если есть дистрибутив - кидай, т.к. если и там ничего не будет то увы.
 
R

Rififi

#6
papmail

Хочется написать код на C++, чтобы делать это с помощью .exe файла.

тебе портебуется PostrgeSQL OLE DB Provider (можно или скачать бесплатный, или купить/украсть платный) и знания по работе с технологией ADO)

Книг по ADO навалом, документации - тоже, несмотря на то, что оно уже давно протухло.
Visual Studio умеет генерировать удобные обёртки - код для ADO практически 1-в-1 перекладывается на C++ с Visual Basic
 
P

papmail

#8
Lazybiz, огромное спасибо!
Вот что получилось:
Код:
#include <stdio.h> 
#include <stdlib.h> 
#include "libpq-fe.h"								  /* libpq header file */ 
#include <iostream>


int main() { 
char		query_string[256];					 /* holds constructed SQL query */ 
PGresult  *res;									/* holds query result */ 
int		 i; 
const char dbName[] = "postgres";
const char user[] = "postgres";
const char pwd[] = "papmailp";


PGconn *conn = PQsetdbLogin(NULL, NULL, NULL, NULL, dbName, user, pwd);				 /* connect to the database */ 

if (PQstatus(conn) == CONNECTION_BAD)			  /* did the connection fail? */ 
{ 
fprintf(stderr, "Connection to database failed.\n"); 
fprintf(stderr, "%s", PQerrorMessage(conn)); 
exit(1); 
} 

sprintf(query_string, "DELETE FROM volume4; copy volume4 from 'C:/1/ALL_TICKERS.csv' header csv; copy (select seccode, sum(vol*waprice) as year_vol from volume4 group by seccode HAVING sum(vol*waprice) > 0 order by year_vol desc) to 'C:/1/ALL_TICKERS1.csv' csv;");

res = PQexec(conn, query_string);				  /* send the query */ 

if (PQresultStatus(res) != PGRES_TUPLES_OK)		 /* did the query fail? */ 
{ 
fprintf(stderr, "SELECT query failed.\n"); 
PQclear(res); 
PQfinish(conn); 
exit(1); 
} 

for (i = 0; i < PQntuples(res); i++)				/* loop through all rows returned */ 
printf("%s\n", PQgetvalue(res, i, 0));		 /* print the value returned */ 

PQclear(res);									  /* free result */ 

PQfinish(conn);									 /* disconnect from the database */ 

return 0; 
}
Надо ещё скопировать в папку с программой следующие файлы (может кому-то пригодится): libeay32.dll, libiconv-2.dll, libintl-8.dll, libpq.dll, libpq.lib, ssleay32.dll.
Все работает! Но уж не обессудьте, может быть кто-то подскажет как сделать, чтобы по завершении работы окно терминала не схлопывалось, и выводилось время выполнения программы в миллисекундах.
 
P

papmail

#9
Еще раз спасибо, последний вопрос снимаю. Все сделал.
 
V

vintprog

#10
1>dllmain.obj : error LNK2001: unresolved external symbol _PQsetdbLogin
1>dllmain.obj : error LNK2001: unresolved external symbol _PQstatus

У меня парни ошибки пошли... Где взять либы???