Author Topic: Подключение базы данных PostgreSQL  (Read 31211 times)

0 Members and 1 Guest are viewing this topic.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« on: November 15, 2006, 10:11:35 »
Здравствуйте.
Подскажите, пожалуйста, как подключить базу данных PostgreSQL с помощью API-функций (пишу на С++) или в Delphi.

Offline sie

  • Full Member
  • ***
  • Posts: 108
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #1 on: November 15, 2006, 10:29:56 »
Quote from: arido
Здравствуйте.
Подскажите, пожалуйста, как подключить базу данных PostgreSQL с помощью API-функций (пишу на С++) или в Delphi.
В дистрибутиве PostgeSQL 8.0.1 под Windows есть аж четыре драйвера:
ODBC
OLEDB
JDBC
Npgsql

OLEDB сам пробовал через ADO в C++Builder 6.0 / Delphi 6.0 - работает.
ODBC использует знакомая мне организация около года - тоже работает.
Про остальные ничего не знаю.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #2 on: November 17, 2006, 20:55:10 »
Мне бы исходник или его часть
« Last Edit: November 18, 2006, 20:43:51 by arido »

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #3 on: November 20, 2006, 15:40:39 »
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.dll. Использую компилятор BCC5.5. Возникли следующие ошибки:
1. Error E2206 fe-connect.c 2361: Illegal character '\' (0x5c) in function parseServiceInfo
2. Error E2380 fe-connect.c 2361: Unterminated string or character constant in function parseServiceInfo
3. Error E2121 fe-connect.c 2363: Function call missing ) in function parseServiceInfo

Часть fe-connect.c:
Code: [Select]
   /*
    * This could be used by any application so we can't use the binary
    * location to find our config files.
    */
стр. 2360   snprintf(serviceFile, MAXPGPATH, "%s/pg_service.conf",
стр. 2361          getenv("PGSYSCONFDIR") ? getenv("PGSYSCONFDIR") : SYSCONFDIR);
стр. 2362
стр. 2363   if (service != NULL)
   {
      FILE      *f;
      char      buf[MAXBUFSIZE],
               *line;
Подскажите, что сделать, как исправить?
« Last Edit: November 20, 2006, 15:46:25 by arido »

Offline Safir

  • Sr. Member
  • ****
  • Posts: 402
  • Karma: +0/-0
    • http://
Подключение базы данных PostgreSQL
« Reply #4 on: November 21, 2006, 08:13:28 »
Quote from: arido
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.dll. Использую компилятор BCC5.5.
Э-э-э... Извините за глупый  вопрос, зачем собирать, если уже всё в пjставке есть? Исходный запрос был, вроде бы, про задействование всего этого через инструментарий от Borland.  Или я чего-то пропустил?

Offline sie

  • Full Member
  • ***
  • Posts: 108
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #5 on: November 21, 2006, 17:12:47 »
Quote from: Safir
... Или я чего-то пропустил?
Я вот тоже так и не понял в чем, собственно, проблема: в API, в Delphi или в компиляции таких-то исходников.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #6 on: November 21, 2006, 21:28:20 »
Мне нужен ПРИМЕР подключения базы данных PostgreSQL с помощью API-функций. Чтобы было с чего начать.

А по поводу сборки - решила попробовать собрать самостоятельно, но вылезли ошибки.
Попутно поинтересовалась.
« Last Edit: November 21, 2006, 21:32:23 by arido »

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #7 on: November 22, 2006, 15:19:56 »
Раздобыла пример, где используется функция PQconnectdb. При компиляции возникает ошибка:
Code: [Select]
   Unresolved externel '_PQconnectdb' referenced from ...\sppr.obj

Подскажите - где проблема?

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #8 on: November 22, 2006, 15:36:13 »
Quote from: arido
Мне нужен ПРИМЕР подключения базы данных PostgreSQL с помощью API-функций. Чтобы было с чего начать.

А по поводу сборки - решила попробовать собрать самостоятельно, но вылезли ошибки.
Попутно поинтересовалась.
на си можно использовать libpq - примеры есть в документации постгреса.
на дельфи - можно использовать ADO (для этого нужно установить OLE DB провайдер с pgfoundry.org/projects/pgoledb (тот, который в поставке с постгресом - совсем плохой, этот ещё как-то работает, ещё несколько багов пофиксено весной-летом в CVS-е, но никакой версии с этими фиксами не выходило).

Query := TADOQuery.Create(nil);
Query.ConnectionString := 'Provider=PostgreSQL.1;Data Source=сервер;Location=база;User ID=имя_пользователя;Password=пароль';
Query.SQL.Text := 'select * from table';
Query.Open;
...
ну и дальше по документации по TADOQuery.


Quote from: arido
Раздобыла пример, где используется функция PQconnectdb. При компиляции возникает ошибка:
Code: [Select]
   Unresolved externel '_PQconnectdb' referenced from ...\sppr.obj

Подскажите - где проблема?

библиотеку libpq.lib надо подключить.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #9 on: November 22, 2006, 19:47:56 »
Quote from: Victor Snezhko
библиотеку libpq.lib надо подключить.

Где можно ее взять?

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #10 on: November 22, 2006, 20:25:35 »
Quote from: arido
Где можно ее взять?

Насколько я знаю, в скомпилированном виде под Windows её не распространяют, надо руками компилировать, make-файл - в исходниках postgresql в файле src/interfaces/libpq/win32.mak. Подробнее про это, кстати, в документации от постгреса тоже написано - целая страница.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #11 on: November 22, 2006, 21:48:20 »
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.lib. Использую компилятор BCC5.5. Возникли следующие ошибки:
1. Error E2206 fe-connect.c 2361: Illegal character '\' (0x5c) in function parseServiceInfo
2. Error E2380 fe-connect.c 2361: Unterminated string or character constant in function parseServiceInfo
3. Error E2121 fe-connect.c 2363: Function call missing ) in function parseServiceInfo

Часть fe-connect.c:
Code: [Select]
   /*
    * This could be used by any application so we can't use the binary
    * location to find our config files.
    */
стр. 2360   snprintf(serviceFile, MAXPGPATH, "%s/pg_service.conf",
стр. 2361          getenv("PGSYSCONFDIR") ? getenv("PGSYSCONFDIR") : SYSCONFDIR);
стр. 2362
стр. 2363   if (service != NULL)
   {
      FILE      *f;
      char      buf[MAXBUFSIZE],
               *line;
Подскажите, что сделать, как исправить?


Offline visual

  • Hero Member
  • *****
  • Posts: 714
  • Karma: +0/-0
    • http://
Подключение базы данных PostgreSQL
« Reply #12 on: November 22, 2006, 21:56:26 »
Quote from: arido
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.lib. Использую компилятор BCC5.5.
м.б. логичнее использовать виндовый gcc?

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #13 on: November 22, 2006, 22:23:23 »
Quote from: arido
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.lib. Использую компилятор BCC5.5. Возникли следующие ошибки:
1. Error E2206 fe-connect.c 2361: Illegal character '\' (0x5c) in function parseServiceInfo
2. Error E2380 fe-connect.c 2361: Unterminated string or character constant in function parseServiceInfo
3. Error E2121 fe-connect.c 2363: Function call missing ) in function parseServiceInfo

Часть fe-connect.c:
Code: [Select]
   /*
    * This could be used by any application so we can't use the binary
    * location to find our config files.
    */
стр. 2360   snprintf(serviceFile, MAXPGPATH, "%s/pg_service.conf",
стр. 2361          getenv("PGSYSCONFDIR") ? getenv("PGSYSCONFDIR") : SYSCONFDIR);
стр. 2362
стр. 2363   if (service != NULL)
   {
      FILE      *f;
      char      buf[MAXBUFSIZE],
               *line;
Подскажите, что сделать, как исправить?

Странно, компилятор утверждает, что ему не нравится символ '\', но такого символа в этом месте нет. Нужно разобраться, почему он так себя ведёт. Покажите последние строк 10-20 вывода от make, которым компилируете libpq



Quote from: visual
м.б. логичнее использовать виндовый gcc?
В документации написано, что поддерживается и борландовый компилятор.
И помощью Visual C у меня (давно, когда было нужно) получалось компилировать без всяких проблем.

Возможно, стоит попробовать другой борландовый компилятор - свободный - на который ссылается глава документации про client-only installation for windows документации. Раз фигурирует в документации - значит, должен поддерживаться...

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #14 on: November 23, 2006, 09:28:06 »
Quote from: Victor Snezhko
Покажите последние строк 10-20 вывода от make, которым компилируете libpq

От одной ошибки избавилась.
В pg_config_paths.h было
Code: [Select]
#define SYSCONFDIR \"\"
Сделала
Code: [Select]
#define SYSCONFDIR ""

Теперь вылезли другие. ( файл прилагается)

Может дело в компиляторе? Он у меня старенький (BCC 5.5). Подскажите, где взять поновее.
« Last Edit: November 23, 2006, 09:29:26 by arido »

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #15 on: November 23, 2006, 13:58:09 »
Quote from: arido
От одной ошибки избавилась.
В pg_config_paths.h было
Code: [Select]
#define SYSCONFDIR \"\"
Сделала
Code: [Select]
#define SYSCONFDIR ""

Теперь вылезли другие. ( файл прилагается)

Может дело в компиляторе? Он у меня старенький (BCC 5.5). Подскажите, где взять поновее.

Гм, ссылка из документации ведёт именно на него, должно работать.
Тем не менее, чтобы исправить первую ошибку, попробуйте убрать слово inline в тех местах, где компилятор ругается. По второй ошибке - изменение в исходниках, её вызывающее, было внесено всего полгода назад, можно сообщить разработчикам, что оно ломает компиляцию libpq на документированном компиляторе bcc 5.5. Пока они не починили - можно обойти ошибку, исправив выражение sizeof(pg_wchar_table) / sizeof(pg_wchar_tbl) на константу 34 (это для 8.1.4, если версия другая - надо написать количество элементов в массиве pg_wchar_table + 1). Во всех трёх местах, где возникла ошибка.


Quote from: Victor Snezhko
надо написать количество элементов в массиве pg_wchar_table + 1.

Немного наврал. Должно быть "номер последнего элемента в массиве + 1", или просто "количество элементов в массиве". В 8.1.4 их 34 штуки - от 0 до 33.

Кстати, на носу 8.2 - пробуйте беты

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #16 on: November 24, 2006, 09:22:04 »
Quote from: Victor Snezhko
Гм, ссылка из документации ведёт именно на него, должно работать.
Тем не менее, чтобы исправить первую ошибку, попробуйте убрать слово inline в тех местах, где компилятор ругается. По второй ошибке - изменение в исходниках, её вызывающее, было внесено всего полгода назад, можно сообщить разработчикам, что оно ломает компиляцию libpq на документированном компиляторе bcc 5.5. Пока они не починили - можно обойти ошибку, исправив выражение sizeof(pg_wchar_table) / sizeof(pg_wchar_tbl) на константу 34 (это для 8.1.4, если версия другая - надо написать количество элементов в массиве pg_wchar_table + 1). Во всех трёх местах, где возникла ошибка.

Исправила. Все проходит. Осталось одно. Может подскажите, как для ilink32 указать путь к \lib. Пробовала в ilink32.cfg
Code: [Select]
-LD\:Progra~1\BCC55\LibНо ilink32 как-будто этого не видит.

Смотрела настройки в make - вроде там есть.
А вот не видит и все.

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #17 on: November 24, 2006, 12:02:13 »
Quote from: arido
Исправила. Все проходит. Осталось одно. Может подскажите, как для ilink32 указать путь к \lib. Пробовала в ilink32.cfg
Code: [Select]
-LD\:Progra~1\BCC55\LibНо ilink32 как-будто этого не видит.

Смотрела настройки в make - вроде там есть.
А вот не видит и все. :(
Можно попробовать прописать в переменной окружения LIB.
Можно дописать этот кусок к описанию переменной LOPT в make-файле.
Можно взять Visual C (лучше .NET, в 6-й версии придётся как минимум тоже убирать inline и, может быть, понадобятся ещё другие затычки) или gcc - Visual C я пробовал сам, gcc, тут говорят, тоже должен работать.

А вообще - точно ilink32 вызывается? может вообще какой-то другой линкер?

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #18 on: November 24, 2006, 23:30:34 »
Quote from: Victor Snezhko
А вообще - точно ilink32 вызывается? может вообще какой-то другой линкер?

Да ilink32.exe.
Мне предложили сделать так:
Code: [Select]
implib libpq.lib libpq.dll

В итоге я получила требуемую libpq.lib, но нет уверенности, что она верна.
Пытальсь подключить ее к проекту, но нет реакции. Либо неправильно подключила, либо она не верная.

Подскажите, как в Borland C++ 5.5 правильно подключить библиотеку?

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Подключение базы данных PostgreSQL
« Reply #19 on: November 24, 2006, 23:42:43 »
Вот результат последнего запуска make. Что теперь можно сделать?
Code: [Select]
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
    cd include
    if not exist pg_config.h copy pg_config.h.win32 pg_config.h
    cd ..
    cd interfaces\libpq
    make -N -DCFG=Release /f bcc32.mak
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
Building the Win32 DLL and Static Library...
Configuration "Release"
    brcc32.exe -l 0x409 -i'C:\Progra~1\Borland\BCC55'\include -fo".\Release\libpq.res" libpq.rc
Borland Resource Compiler  Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.
    ilink32.exe @MAKE0000.@@@
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_SHGetFolderPath' referenced from D:\NATALY\POSTGRESQL-8.1.4\SRC\INTERFACES\LIBPQ\RELEASE\BLIBPQ.LIB|fe-connect

** error 2 ** deleting ".\Release\blibpq.dll"

** error 1 ** deleting ALL