1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "С и С++", создана пользователем papmail, 3 фев 2011.

  1. papmail

    papmail Гость

    Репутация:
    0
    Посоветуйте пожалуста в какую сторону копать...
    Есть база данных 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у,
    но там всё в общих чертах и не по-русски....
     
  2. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
  3. papmail

    papmail Гость

    Репутация:
    0
    Да в том то и дело, что с командой SQL всё нормально, вопрос как эту команду передать из программы на C++ в базу данных.
     
  4. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    А. Понял в чем суть. Попробую подумать (не всегда получается но иногда срабатывает).

    Добавлено: Удалось найти вот что:
    Код:
     /* 
    * 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; 
    }
    Но это только пример как работать с базой.. Надо подумать еще...
     
  5. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    papmail ,в общем вопрос вот в чем: для написания программы нужна бибиотека, найти я ее не смог, возможно мини-SDK есть в дистрибутиве но и его я скачать не смог (точнее не захотел т.к. там нужна регистрация). Если есть дистрибутив - кидай, т.к. если и там ничего не будет то увы.
     
  6. Rififi

    Rififi Гость

    Репутация:
    0
    papmail

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

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

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

    papmail Гость

    Репутация:
    0
    Вот папка include из дистрибутива PostgreSQL
     

    Вложения:

    • include.zip
      Размер файла:
      788 КБ
      Просмотров:
      15
  8. papmail

    papmail Гость

    Репутация:
    0
    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.
    Все работает! Но уж не обессудьте, может быть кто-то подскажет как сделать, чтобы по завершении работы окно терминала не схлопывалось, и выводилось время выполнения программы в миллисекундах.
     
  9. papmail

    papmail Гость

    Репутация:
    0
    Еще раз спасибо, последний вопрос снимаю. Все сделал.
     
  10. vintprog

    vintprog Гость

    Репутация:
    0
    1>dllmain.obj : error LNK2001: unresolved external symbol _PQsetdbLogin
    1>dllmain.obj : error LNK2001: unresolved external symbol _PQstatus

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

Поделиться этой страницей