Tomsk Sysadmins Forum

Windows => Программирование => Topic started by: arido on November 15, 2006, 10:11:35

Title: Подключение базы данных PostgreSQL
Post by: arido on November 15, 2006, 10:11:35
Здравствуйте.
Подскажите, пожалуйста, как подключить базу данных PostgreSQL с помощью API-функций (пишу на С++) или в Delphi.
Title: Подключение базы данных PostgreSQL
Post by: sie 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 использует знакомая мне организация около года - тоже работает.
Про остальные ничего не знаю.
Title: Подключение базы данных PostgreSQL
Post by: arido on November 17, 2006, 20:55:10
Мне бы исходник или его часть
Title: Подключение базы данных PostgreSQL
Post by: arido 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;
Подскажите, что сделать, как исправить?
Title: Подключение базы данных PostgreSQL
Post by: Safir on November 21, 2006, 08:13:28
Quote from: arido
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.dll. Использую компилятор BCC5.5.
Э-э-э... Извините за глупый  вопрос, зачем собирать, если уже всё в пjставке есть? Исходный запрос был, вроде бы, про задействование всего этого через инструментарий от Borland.  Или я чего-то пропустил?
Title: Подключение базы данных PostgreSQL
Post by: sie on November 21, 2006, 17:12:47
Quote from: Safir
... Или я чего-то пропустил?
Я вот тоже так и не понял в чем, собственно, проблема: в API, в Delphi или в компиляции таких-то исходников.
Title: Подключение базы данных PostgreSQL
Post by: arido on November 21, 2006, 21:28:20
Мне нужен ПРИМЕР подключения базы данных PostgreSQL с помощью API-функций. Чтобы было с чего начать.

А по поводу сборки - решила попробовать собрать самостоятельно, но вылезли ошибки.
Попутно поинтересовалась.
Title: Подключение базы данных PostgreSQL
Post by: arido on November 22, 2006, 15:19:56
Раздобыла пример, где используется функция PQconnectdb. При компиляции возникает ошибка:
Code: [Select]
   Unresolved externel '_PQconnectdb' referenced from ...\sppr.obj

Подскажите - где проблема?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko 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 надо подключить.
Title: Подключение базы данных PostgreSQL
Post by: arido on November 22, 2006, 19:47:56
Quote from: Victor Snezhko
библиотеку libpq.lib надо подключить.

Где можно ее взять?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 22, 2006, 20:25:35
Quote from: arido
Где можно ее взять?

Насколько я знаю, в скомпилированном виде под Windows её не распространяют, надо руками компилировать, make-файл - в исходниках postgresql в файле src/interfaces/libpq/win32.mak. Подробнее про это, кстати, в документации от постгреса тоже написано - целая страница.
Title: Подключение базы данных PostgreSQL
Post by: arido 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;
Подскажите, что сделать, как исправить?

Title: Подключение базы данных PostgreSQL
Post by: visual on November 22, 2006, 21:56:26
Quote from: arido
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.lib. Использую компилятор BCC5.5.
м.б. логичнее использовать виндовый gcc?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko 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 документации. Раз фигурирует в документации - значит, должен поддерживаться...
Title: Подключение базы данных PostgreSQL
Post by: arido 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). Подскажите, где взять поновее.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko 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 - пробуйте беты
Title: Подключение базы данных PostgreSQL
Post by: arido 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 - вроде там есть.
А вот не видит и все.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko 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 вызывается? может вообще какой-то другой линкер?
Title: Подключение базы данных PostgreSQL
Post by: arido 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 правильно подключить библиотеку?
Title: Подключение базы данных PostgreSQL
Post by: arido 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
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 25, 2006, 00:33:59
Quote from: arido
Вот результат последнего запуска 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
Ух уж этот борланд
Теперь проблема - не с постгресом, а с тем, что в борландовых библиотеках нет описания виндовой функции SHGetFolderPath (они старые)
Попробуйте тот самый implib сделать на файл shfolder.dll из системы и положить получившийся shfolder.lib или в каталог с борландовскими библиотеками, или в текущий (src/interfaces/libq).


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

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

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

Должно быть выполнено два условия:
1) в настройках линкера должен быть прописан путь к каталогу, где лежат .lib-файлы, или они должны быть там же, где исходники
2) линкер нужно напрямую или через компилятор попросить прилинковать библиотеку.
напрямую - просто перечислить в командной строке линкера вместе с обжами:
ilink32 main.obj libpq.lib
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)

А нет реакции - это тоже ругается на отсутствующие экспорты PQconnectdb?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 25, 2006, 00:49:16
Quote from: Victor Snezhko
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)
И ещё - попробуйте просто взять пример из документации про постгрес на сайте, из раздела Client Interfaces, положить рядом libpq.lib, и скомпилировать из командной строки, в два прохода:

bcc32 -c main.c   -> получится main.obj
ilink32 main.obj libpq.lib

ilink'у надо ещё как-то указать имя екзешника, тут уж смотрите документацию по нему...
Title: Подключение базы данных PostgreSQL
Post by: arido on November 25, 2006, 14:47:31
Quote from: Victor Snezhko
Ух уж этот борланд
Теперь проблема - не с постгресом, а с тем, что в борландовых библиотеках нет описания виндовой функции SHGetFolderPath (они старые)
Попробуйте тот самый implib сделать на файл shfolder.dll из системы и положить получившийся shfolder.lib или в каталог с борландовскими библиотеками, или в текущий (src/interfaces/libq).
Сделала - ошибка осталась таже самая!?  
Quote
Должно быть выполнено два условия:
1) в настройках линкера должен быть прописан путь к каталогу, где лежат .lib-файлы, или они должны быть там же, где исходники
Указала
Quote
2) линкер нужно напрямую или через компилятор попросить прилинковать библиотеку.
напрямую - просто перечислить в командной строке линкера вместе с обжами:
ilink32 main.obj libpq.lib
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)
И это есть. (-LПуть)
Quote
А нет реакции - это тоже ругается на отсутствующие экспорты PQconnectdb?
Да
Title: Подключение базы данных PostgreSQL
Post by: arido on November 25, 2006, 15:11:52
Quote from: Victor Snezhko
И ещё - попробуйте просто взять пример из документации про постгрес на сайте, из раздела Client Interfaces, положить рядом libpq.lib, и скомпилировать из командной строки, в два прохода:

bcc32 -c main.c   -> получится main.obj
ilink32 main.obj libpq.lib
Сделала. Получила Try1.obj.
Далее выдал вот что:
Code: [Select]
D:\Nataly\Программы\CPP\Try_1>ilink32 try1.obj libpq.lib
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '__setargv__' referenced from root
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 25, 2006, 21:53:01
Странно. Вот поставил я себе свободно распространяемый борландовский компилятор с ftp://ftpd.borland.com/download/bcppbuild...ndLinetools.exe (http://ftp://ftpd.borland.com/download/bcppbuilder/freecommandLinetools.exe)

Как раз 5.5.

Всё получилось, опишу ещё раз процесс с самого начала.
1) Настроил пути в bcc32.cfg и ilink32.cfg, как в README
2) Распаковал исходники postgresql
3) Скопировал в каталоге src/include файл pg_config.h.win32 в pg_config.h
4) Запустил make -N -fbcc32.mak в каталоге src/interfaces/libpq
5) Увидел ругательство на слэш, поправил pg_config_paths.h
6) Запустил make ещё раз, увидел ругательства на wchar.c, поправил только static inline (убрал inline в двух местах). Как выяснилось, sizeof'ы править не надо
7) Запустил make третий раз - всё собралось, получился каталог Release, в нём blibpq.lib и blibpq.dll
8) Сделал файл test.c - первый пример из документации постгреса
9) Скомпилировал его:
bcc32 -I"путь_к_/src/include" -I"путь_к_/src/interfaces/libpq" test.c blibpq.lib

всё делал прямо в каталоге Release, заработало.

Попробуйте сделать свежий каталог с исходниками постгреса и проделать всё то же самое, если не заработает - возьмите указанный компилятор.

Да, исходники у меня тоже 8.1.4.

Quote from: arido
И это есть. (-LПуть)

Скорее всего это уже не нужно, но всё равно поясню:

-Lпуть как раз недостаточно - надо ещё библиотеку явно указать.
Как в предыдущем моём посте: bcc32 test.c blibpq.lib

С ilink32 - не так всё просто, там кроме .obj и .lib файлов, относящихся к программе, надо ещё указывать борландовские файлы c0w32.obj, cw32.lib (или им подобные)
Title: Подключение базы данных PostgreSQL
Post by: arido on November 26, 2006, 21:30:33
Quote from: Victor Snezhko
4) Запустил make -N -fbcc32.mak в каталоге src/interfaces/libpq
5) Увидел ругательство на слэш, поправил pg_config_paths.h
6) Запустил make ещё раз, увидел ругательства на wchar.c, поправил только static inline (убрал inline в двух местах). Как выяснилось, sizeof'ы править не надо
7) Запустил make третий раз - всё собралось, получился каталог Release, в нём blibpq.lib и blibpq.dll
Наконец получила blibpq.lib и blibpq.dll ! Большое спасибо! Только нет libpq.lib, хотя по описанию, должна быть.
Quote
8) Сделал файл test.c - первый пример из документации постгреса
9) Скомпилировал его:
bcc32 -I"путь_к_/src/include" -I"путь_к_/src/interfaces/libpq" test.c blibpq.lib
А вот с примером не выходит  
Выдает вот что:
Code: [Select]
D:\Nataly\Programming\CPP\Try_1>bcc32 try1.c libpq.lib
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Try1.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_PQconnectdb' referenced from D:\NATALY\PROGRAMMING\
CPP\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQstatus' referenced from D:\NATALY\PROGRAMMING\CPP
\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQresultStatus' referenced from D:\NATALY\PROGRAMMI
NG\CPP\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQerrorMessage' referenced from D:\NATALY\PROGRAMMI
NG\CPP\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQnfields' referenced from D:\NATALY\PROGRAMMING\CP
P\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQfname' referenced from D:\NATALY\PROGRAMMING\CPP\
TRY_1\TRY1.OBJ
Error: Unresolved external '_PQgetvalue' referenced from D:\NATALY\PROGRAMMING\C
PP\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQntuples' referenced from D:\NATALY\PROGRAMMING\CP
P\TRY_1\TRY1.OBJ
Error: Unresolved external '_PQexec' referenced from D:\NATALY\PROGRAMMING\CPP\T
RY_1\TRY1.OBJ
Error: Unresolved external '_PQclear' referenced from D:\NATALY\PROGRAMMING\CPP\
TRY_1\TRY1.OBJ
Error: Unresolved external '_PQfinish' referenced from D:\NATALY\PROGRAMMING\CPP
\TRY_1\TRY1.OBJ
Пробовала и так
Quote
bcc32 -I"путь_к_/src/include" -I"путь_к_/src/interfaces/libpq" test.c blibpq.lib
и так
Quote
bcc32 -c main.c -> получится main.obj
ilink32 main.obj libpq.lib
Code: [Select]
D:\Nataly\Programming\CPP\Try_1>bcc32 -c try1.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Try1.c:
D:\Nataly\Programming\CPP\Try_1>ilink32 try1.obj blibpq.lib
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '__setargv__' referenced from root
И из каталога \Release пробовала - не получается.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 27, 2006, 01:57:16
Quote from: arido
Наконец получила blibpq.lib и blibpq.dll ! Большое спасибо! Только нет libpq.lib, хотя по описанию, должна быть.

Вот как раз blibpq.lib надо использовать вместо libpq.lib (почему-то в make-файле bcc32.mak прописано именно такое имя)

командная строка должна быть bcc32 -I"пути(как раньше)" test.c blibpq.lib - в каталоге release (у Вас указана libpq.lib - похоже, скопированная откуда-то ещё). Или, если программа в другом каталоге, blibpq.lib надо поместить туда, откуда она будет видна линкеру - или в тот же каталог, где test.c, или в каталог, прописанный в опциях -L линкера.

Upd:
вот это:

  bcc32 -c main.c -> получится main.obj
  ilink32 main.obj libpq.lib

да, не работает, по другой причине. main.obj и libpq.lib недостаточно, надо ещё указать борландовскую библиотеку и объектник с рантаймом (там и описаны __setargv и прочие)
Title: Подключение базы данных PostgreSQL
Post by: arido on November 29, 2006, 22:42:58
УРА!! К базе вроде подключаюсь! Надо было подключить обе библиотеки/
Прописала пути и добавила в код:
Code: [Select]
#pragma comment(lib,"blibpq.lib")
#pragma comment(lib,"blibpqdll.lib")

Всем СПАСИБО!!!

Теперь буду пытаться получить данные.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on December 02, 2006, 14:08:25
Quote from: arido
УРА!! К базе вроде подключаюсь! Надо было подключить обе библиотеки/
Прописала пути и добавила в код:
Code: [Select]
#pragma comment(lib,"blibpq.lib")
#pragma comment(lib,"blibpqdll.lib")

Всем СПАСИБО!!!

Теперь буду пытаться получить данные.

Поздравляю

Небольшой комментарий: библиотека blibpqdll.lib нужна, чтобы использовать код из blibpq.dll, а blibpq.lib сама содержит всё необходимое, при этом клиентский код libpq после линковки кладётся непосредственно в exe-файл программы.
Поэтому использовать достаточно только одну из них (либо blibpq.lib, либо blibpqdll.lib + blibpq.dll, которую надо класть рядом с программой), в зависимости от обстоятельств могут быть удобны оба варианта.
Title: Подключение базы данных PostgreSQL
Post by: arido on February 26, 2007, 21:07:12
Здравствуйте!

Базу данных я подключила. Отправила запрос
Code: [Select]
case WM_CREATE:
                {
              //Подключение базы данных
              conninfo = "hostaddr = 192.168.10.1 dbname = sppr";
              conn = PQconnectdb(conninfo);
              if (PQstatus(conn) != CONNECTION_OK)
                     {
                 MessageBox(hWnd,PQerrorMessage(conn),
                            "Невозможно подключиться к базе",
                                 MB_OK);
                 PQfinish(conn);
                      exit(1);
                }
              value[0] = "12345";
              res = PQexecParams(conn, "select * from tip where npp=2;",
                                           0, NULL, value, NULL, NULL, 1);
              if (PQresultStatus(res) != PGRES_TUPLES_OK)
                 {
                  MessageBox(hWnd,PQerrorMessage(conn),
                               "PQresultStatus(res)",
                                  MB_OK);
                     PQfinish(conn);
                          exit(1);
                  /*fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
                  PQclear(res);
                  exit_nicely(conn);*/
                 }

              tip_fnum = PQfnumber(res, "tip");
              j=PQntuples(res);
              for (i = 0; i < PQntuples(res); i++)
                 {
                  char *tip_ptr;
                  int  ival;

                  /* Get the field values (we ignore possibility they are null!) */
                  tip_ptr = PQgetvalue(res, i, tip_fnum);
              /**/MessageBox(hWnd,itoa(PQgetlength(res, i, tip_fnum), s, 10),
                               "!!!!!",
                                  MB_OK);

                  printf("tuple %d: got\n", i);
                  printf(" i = (%d bytes) %d\n",
                         PQgetlength(res, i, tip_fnum), ival);

                 }/********/
              PQclear(res);
              PQfinish(conn);

              ...
              return 0;
             }
и получила ответ. А вот разобрать ответ пока не получается.  
Подскажите как это сделать!?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on March 04, 2007, 23:39:16
Quote from: arido
Здравствуйте!

Базу данных я подключила. Отправила запрос
Code: [Select]
                  tip_ptr = PQgetvalue(res, i, tip_fnum);
и получила ответ. А вот разобрать ответ пока не получается. :unsure:
Подскажите как это сделать!?

А в чём проблема?
По адресу tip_ptr и будет располагаться значение колонки tip в текущей строке.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on October 30, 2007, 13:38:22
Добрый день! Я скачал уже скомпилированный файл libpq.lib и добавил его в библиотеку С++ Builder. Все замечательно распозналось. Но при компиляции приложения выдается ошибка EOleException с сообщением "Объект или поставщик не может выполнить требуемую операцию". Я покопался в документации и нашел такую информацию, что в библиотеку следует добавить не libpq.lib, а libpq++.lib. Я скачал исходники, но проблема в том что я не умею работать с ними и не понимаю как их откомпилировать. Очень прошу помощи так как скоро нужно отчитываться по работе...
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 01, 2007, 02:20:00
Quote from: Dmitry Istomin
Добрый день! Я скачал уже скомпилированный файл libpq.lib и добавил его в библиотеку С++ Builder. Все замечательно распозналось. Но при компиляции приложения выдается ошибка EOleException с сообщением "Объект или поставщик не может выполнить требуемую операцию". Я покопался в документации и нашел такую информацию, что в библиотеку следует добавить не libpq.lib, а libpq++.lib. Я скачал исходники, но проблема в том что я не умею работать с ними и не понимаю как их откомпилировать. Очень прошу помощи так как скоро нужно отчитываться по работе...

Cудя по тому, что релизов этого libpq++ не было с 2002 года, по нему вряд ли удастся услышать ответы на какие-либо вопросы. Так что рекомендую остановиться на обычном libpq.
Решить проблему с EOleException невозможно без подробного описания - что делалось, каким образом. Непонятно также, зачем код libpq.dll выполняется при компиляции.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 01, 2007, 09:08:15
Quote from: Victor Snezhko
Cудя по тому, что релизов этого libpq++ не было с 2002 года, по нему вряд ли удастся услышать ответы на какие-либо вопросы. Так что рекомендую остановиться на обычном libpq.
Решить проблему с EOleException невозможно без подробного описания - что делалось, каким образом. Непонятно также, зачем код libpq.dll выполняется при компиляции.
Да собственно говоря я ничего не делал. Я прописал свойство ConnectionString компонента TADOConection (Provider=PostgreSQL OLE DB Provider;Password=MyPassword;User ID=Admin;Data Source=localhost;Location=MyDataBase;Extended Properties=""), затем выбрал нужную мне таблицу в TADOTable. Когда делаю ее активной то возникает ошибка, с неактивной все проходит хорошо. Собственно так и не могу понять в чем проблема. Вот и подумал что проблема именно в libpq.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 06, 2007, 22:10:17
Quote from: Dmitry Istomin
Да собственно говоря я ничего не делал. Я прописал свойство ConnectionString компонента TADOConection (Provider=PostgreSQL OLE DB Provider;Password=MyPassword;User ID=Admin;Data Source=localhost;Location=MyDataBase;Extended Properties=""), затем выбрал нужную мне таблицу в TADOTable. Когда делаю ее активной то возникает ошибка, с неактивной все проходит хорошо. Собственно так и не могу понять в чем проблема. Вот и подумал что проблема именно в libpq.

Ага - через OLE DB!
Попробуйте обновить провайдер с pgfoundry.org/projects/oledb и включить логгинг - посмотрите, какие будут ошибки.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 09, 2007, 21:28:17
Да я обновлял провайдер. Я раньше не добавлял libpq.lib к проекту, а когда добавил то у меня вылезла ошибка:
"[Linker Error] 'C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\LIBPQ.LIB' contains invalid OMF record, type 0x21 (possibly COFF)"


1) Файл libpq.lib должен быть подключен к проекту?
2) Этот файл обязательно должен собираться из исходников или можно взять уже готовый файл?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 12, 2007, 22:04:32
Quote from: Dmitry Istomin
Да я обновлял провайдер. Я раньше не добавлял libpq.lib к проекту, а когда добавил то у меня вылезла ошибка:
"[Linker Error] 'C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\LIBPQ.LIB' contains invalid OMF record, type 0x21 (possibly COFF)"
1) Файл libpq.lib должен быть подключен к проекту?
2) Этот файл обязательно должен собираться из исходников или можно взять уже готовый файл?

libpq.lib вообще не нужен, если работа идёт через ADO. В этом случае нужен только зарегистрированный провайдер pgoledb.dll, которому, в свою очередь, нужна libpq.dll

Второй вариант - можно выкинуть провайдер и пользоваться напрямую libpq.dll в соответствии с документацией по postgresql. Тогда libpq.lib уже нужен, но, насколько я помню, для борландовских компиляторов его надо собирать из исходников postgresql руками вместе с libpq.dll (из src/interfaces/libpq).
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 14, 2007, 16:35:17
Я скачал архив с pgfoundry.org/projects/oledb, зарегистрировал библиотеки как в README. Но ошибка не исправляется, выдается все то же: "Объект или поставщик не может выполнить требуемую операцию". Не понимаю что она означает. Знаю только то что она возникает при установки значения свойства Activate компонента TADOTable в True. Смотрел в справке но там как то все размыто написано. Уже просто не знаю че делать хотя вроде все правильно. Может быть нужно сделать какие то настройки в самом PostgreSQL? (у меня версия 8.2)

Со вторым вариантом сложнее потому что я вобще понятия не имею как это все делается. В документации насколько я знаю написана всего одна команда. Пробовал - не получилось. Читал тут на форуме, но так ничего и не понял - обсуждаются какие то конкретные моменты, а не все конкретно общий алгоритм.
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 18, 2007, 17:56:00
Quote from: Dmitry Istomin
Я скачал архив с pgfoundry.org/projects/oledb, зарегистрировал библиотеки как в README. Но ошибка не исправляется, выдается все то же: "Объект или поставщик не может выполнить требуемую операцию". Не понимаю что она означает. Знаю только то что она возникает при установки значения свойства Activate компонента TADOTable в True. Смотрел в справке но там как то все размыто написано. Уже просто не знаю че делать хотя вроде все правильно. Может быть нужно сделать какие то настройки в самом PostgreSQL? (у меня версия 8.2)

Со вторым вариантом сложнее потому что я вобще понятия не имею как это все делается. В документации насколько я знаю написана всего одна команда. Пробовал - не получилось. Читал тут на форуме, но так ничего и не понял - обсуждаются какие то конкретные моменты, а не все конкретно общий алгоритм.

Включите протоколирование действий провайдера (описано в README).
В логе должно быть видно, из-за чего выдаётся ошибка.

По libpq - как это одна команда?
http://www.postgresql.org/docs/8.2/static/libpq.html (http://www.postgresql.org/docs/8.2/static/libpq.html)
там и команд много, и примеры есть...
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 19, 2007, 18:45:08
Сделал лог но честно говоря не могу понять где тут ошибка
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 20, 2007, 22:38:13
Quote from: Dmitry Istomin
Сделал лог но честно говоря не могу понять где тут ошибка :(

Да, не очень понятно пока. Единственное - сыпятся ошибки "Requested schema not supported", скорее всего, когда билдер ищет PK-колонки. Но они не должны доходить до приложения. Как минимум в Delphi они обрабатываются внутри ADODB.

Покажите, что ли, таблицу (скрипт create table)...

Да, через libpq должно работать - в логах провайдера (он сам пользуется libpq для связи с PostgreSQL) видно, что запросы SELECT * FROM dict проходят и возвращают результаты.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 22, 2007, 19:49:50
Quote from: Victor Snezhko
Покажите, что ли, таблицу (скрипт create table)...

CREATE TABLE "public"."dict" (
  "ID" BIGINT NOT NULL,
  "Word" TEXT NOT NULL,
  CONSTRAINT "dict_Word_key" UNIQUE("Word"),
  CONSTRAINT "dict_pkey" PRIMARY KEY("ID")
) WITH OIDS;

Это все
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 25, 2007, 18:45:59
Quote from: Dmitry Istomin
CREATE TABLE "public"."dict" (
  "ID" BIGINT NOT NULL,
  "Word" TEXT NOT NULL,
  CONSTRAINT "dict_Word_key" UNIQUE("Word"),
  CONSTRAINT "dict_pkey" PRIMARY KEY("ID")
) WITH OIDS;

Это все

Вот такой vbs-код:
Code: [Select]
adCmdText = 1

Set Connection = WScript.CreateObject("ADODB.Connection")
Connection.Open "Provider=PostgreSQL.1;Data Source=localhost;Location=test;User ID=postgres;Password=postgres"

Set Query = WScript.CreateObject("ADODB.Command")

Query.ActiveConnection = Connection
Query.CommandText = "SELECT * FROM dict"
Query.CommandType = adCmdText

Set Rs = Query.Execute
do while not Rs.EOF
  WScript.Echo(Rs("Word"))
  Rs.MoveNext
loop

у меня не хочет ломаться - и на провайдере 1.0.0.20, и на моём - с http://people.indorsoft.ru/vvs/pgoledb.html (http://people.indorsoft.ru/vvs/pgoledb.html), в котором я немного улучшал поддержку типа данных text.

Пробовал на данных:
INSERT INTO dict ("ID", "Word") VALUES (1, 'test1');
INSERT INTO dict ("ID", "Word") VALUES (2, 'test2');
INSERT INTO dict ("ID", "Word") VALUES (3, 'test3');

Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 26, 2007, 01:00:33
Не хочет ломаться это как?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 26, 2007, 01:18:57
Quote from: Dmitry Istomin
Не хочет ломаться это как? :)

Работает через оба провайдера и ответы возвращает как надо. В том числе text-поля.
Видимо, какие-то проблемы в билдерном коде.
Если я правильно понял, исключение вылазит при присваивании Active = True - это аналогично открытию таблицы, даже ещё не чтению данных из неё. Я бы попробовал руками создать объект TADOQuery, натравил бы его на таблицу и посмотрел, что получится.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on November 26, 2007, 18:47:16
Попробовал на Дельфи - тоже самое! А где пробовали если не секрет?
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on November 28, 2007, 19:44:34
Quote from: Dmitry Istomin
Попробовал на Дельфи - тоже самое! А где пробовали если не секрет?

Э... в смысле где? приведённый скрипт запустил (из файла с расширением .vbs) и всё, он отработал. Выдал все данные. В т.ч. со старым провайдером 1.0.0.20.
Title: Подключение базы данных PostgreSQL
Post by: Dmitry Istomin on December 02, 2007, 03:50:43
Quote from: Victor Snezhko
Э... в смысле где? приведённый скрипт запустил (из файла с расширением .vbs) и всё, он отработал. Выдал все данные. В т.ч. со старым провайдером 1.0.0.20.
Ну а сам скрипт где запустить? (просто я не совсем опытный в этом вопросе)
Title: Подключение базы данных PostgreSQL
Post by: Victor Snezhko on December 02, 2007, 11:38:43
Quote from: Dmitry Istomin
Ну а сам скрипт где запустить? (просто я не совсем опытный в этом вопросе)

Как обычно в Windows - двойным щелчком...