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

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

  1. papmail

    papmail Гость

    Посоветуйте пожалуста в какую сторону копать...
    Есть база данных 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
    C\C++ Team

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

    papmail Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

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

    lazybiz Well-Known Member
    C\C++ Team

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

    Rififi Гость

    papmail

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

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

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

    papmail Гость

    Вот папка include из дистрибутива PostgreSQL
     

    Вложения:

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

    papmail Гость

    Lazybiz, огромное спасибо!
    Вот что получилось:
    Код (Text):
    #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 Гость

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

    vintprog Гость

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

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

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