Tomsk Sysadmins Forum
Windows => Программирование => Topic started by: arido on November 15, 2006, 10:11:35
-
Здравствуйте.
Подскажите, пожалуйста, как подключить базу данных PostgreSQL с помощью API-функций (пишу на С++) или в Delphi.
-
Здравствуйте.
Подскажите, пожалуйста, как подключить базу данных PostgreSQL с помощью API-функций (пишу на С++) или в Delphi.
В дистрибутиве PostgeSQL 8.0.1 под Windows есть аж четыре драйвера:
ODBC
OLEDB
JDBC
Npgsql
OLEDB сам пробовал через ADO в C++Builder 6.0 / Delphi 6.0 - работает.
ODBC использует знакомая мне организация около года - тоже работает.
Про остальные ничего не знаю.
-
Мне бы исходник или его часть
-
Скачала исходник 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:
/*
* 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;
Подскажите, что сделать, как исправить?
-
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.dll. Использую компилятор BCC5.5.
Э-э-э... Извините за глупый вопрос, зачем собирать, если уже всё в пjставке есть? Исходный запрос был, вроде бы, про задействование всего этого через инструментарий от Borland. Или я чего-то пропустил?
-
... Или я чего-то пропустил?
Я вот тоже так и не понял в чем, собственно, проблема: в API, в Delphi или в компиляции таких-то исходников.
-
Мне нужен ПРИМЕР подключения базы данных PostgreSQL с помощью API-функций. Чтобы было с чего начать.
А по поводу сборки - решила попробовать собрать самостоятельно, но вылезли ошибки.
Попутно поинтересовалась.
-
Раздобыла пример, где используется функция PQconnectdb. При компиляции возникает ошибка:
Unresolved externel '_PQconnectdb' referenced from ...\sppr.obj
Подскажите - где проблема?
-
Мне нужен ПРИМЕР подключения базы данных 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.
Раздобыла пример, где используется функция PQconnectdb. При компиляции возникает ошибка:
Unresolved externel '_PQconnectdb' referenced from ...\sppr.obj
Подскажите - где проблема?
библиотеку libpq.lib надо подключить.
-
библиотеку libpq.lib надо подключить.
Где можно ее взять?
-
Где можно ее взять?
Насколько я знаю, в скомпилированном виде под Windows её не распространяют, надо руками компилировать, make-файл - в исходниках postgresql в файле src/interfaces/libpq/win32.mak. Подробнее про это, кстати, в документации от постгреса тоже написано - целая страница.
-
Скачала исходник 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:
/*
* 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;
Подскажите, что сделать, как исправить?
-
Скачала исходник postgresql-8.1.4, пытаюсь провести сборку libpq.lib. Использую компилятор BCC5.5.
м.б. логичнее использовать виндовый gcc?
-
Скачала исходник 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:
/*
* 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
м.б. логичнее использовать виндовый gcc?
В документации написано, что поддерживается и борландовый компилятор.
И помощью Visual C у меня (давно, когда было нужно) получалось компилировать без всяких проблем.
Возможно, стоит попробовать другой борландовый компилятор - свободный - на который ссылается глава документации про client-only installation for windows документации. Раз фигурирует в документации - значит, должен поддерживаться...
-
Покажите последние строк 10-20 вывода от make, которым компилируете libpq
От одной ошибки избавилась.
В pg_config_paths.h было
#define SYSCONFDIR \"\"
Сделала
#define SYSCONFDIR ""
Теперь вылезли другие. ( файл прилагается)
Может дело в компиляторе? Он у меня старенький (BCC 5.5). Подскажите, где взять поновее.
-
От одной ошибки избавилась.
В pg_config_paths.h было
#define SYSCONFDIR \"\"
Сделала
#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). Во всех трёх местах, где возникла ошибка.
надо написать количество элементов в массиве pg_wchar_table + 1.
Немного наврал. Должно быть "номер последнего элемента в массиве + 1", или просто "количество элементов в массиве". В 8.1.4 их 34 штуки - от 0 до 33.
Кстати, на носу 8.2 - пробуйте беты
-
Гм, ссылка из документации ведёт именно на него, должно работать.
Тем не менее, чтобы исправить первую ошибку, попробуйте убрать слово 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 -LD\:Progra~1\BCC55\Lib
Но ilink32 как-будто этого не видит.
Смотрела настройки в make - вроде там есть.
А вот не видит и все.
-
Исправила. Все проходит. Осталось одно. Может подскажите, как для ilink32 указать путь к \lib. Пробовала в ilink32.cfg -LD\:Progra~1\BCC55\Lib
Но ilink32 как-будто этого не видит.
Смотрела настройки в make - вроде там есть.
А вот не видит и все. :(
Можно попробовать прописать в переменной окружения LIB.
Можно дописать этот кусок к описанию переменной LOPT в make-файле.
Можно взять Visual C (лучше .NET, в 6-й версии придётся как минимум тоже убирать inline и, может быть, понадобятся ещё другие затычки) или gcc - Visual C я пробовал сам, gcc, тут говорят, тоже должен работать.
А вообще - точно ilink32 вызывается? может вообще какой-то другой линкер?
-
А вообще - точно ilink32 вызывается? может вообще какой-то другой линкер?
Да ilink32.exe.
Мне предложили сделать так:
implib libpq.lib libpq.dll
В итоге я получила требуемую libpq.lib, но нет уверенности, что она верна.
Пытальсь подключить ее к проекту, но нет реакции. Либо неправильно подключила, либо она не верная.
Подскажите, как в Borland C++ 5.5 правильно подключить библиотеку?
-
Вот результат последнего запуска make. Что теперь можно сделать?
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
-
Вот результат последнего запуска make. Что теперь можно сделать?
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).
Да ilink32.exe.
Мне предложили сделать так:
implib libpq.lib libpq.dll
В итоге я получила требуемую libpq.lib, но нет уверенности, что она верна.
Пытальсь подключить ее к проекту, но нет реакции. Либо неправильно подключила, либо она не верная.
Подскажите, как в Borland C++ 5.5 правильно подключить библиотеку?
Должно быть выполнено два условия:
1) в настройках линкера должен быть прописан путь к каталогу, где лежат .lib-файлы, или они должны быть там же, где исходники
2) линкер нужно напрямую или через компилятор попросить прилинковать библиотеку.
напрямую - просто перечислить в командной строке линкера вместе с обжами:
ilink32 main.obj libpq.lib
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)
А нет реакции - это тоже ругается на отсутствующие экспорты PQconnectdb?
-
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)
И ещё - попробуйте просто взять пример из документации про постгрес на сайте, из раздела Client Interfaces, положить рядом libpq.lib, и скомпилировать из командной строки, в два прохода:
bcc32 -c main.c -> получится main.obj
ilink32 main.obj libpq.lib
ilink'у надо ещё как-то указать имя екзешника, тут уж смотрите документацию по нему...
-
Ух уж этот борланд
Теперь проблема - не с постгресом, а с тем, что в борландовых библиотеках нет описания виндовой функции SHGetFolderPath (они старые)
Попробуйте тот самый implib сделать на файл shfolder.dll из системы и положить получившийся shfolder.lib или в каталог с борландовскими библиотеками, или в текущий (src/interfaces/libq).
Сделала - ошибка осталась таже самая!?
Должно быть выполнено два условия:
1) в настройках линкера должен быть прописан путь к каталогу, где лежат .lib-файлы, или они должны быть там же, где исходники
Указала
2) линкер нужно напрямую или через компилятор попросить прилинковать библиотеку.
напрямую - просто перечислить в командной строке линкера вместе с обжами:
ilink32 main.obj libpq.lib
через компилятор - надо смотреть /? от борланда, я не пользовался им со времён 3.1 и не помню.
должен быть флажок типа -l (L маленькая)
И это есть. (-LПуть)
А нет реакции - это тоже ругается на отсутствующие экспорты PQconnectdb?
Да
-
И ещё - попробуйте просто взять пример из документации про постгрес на сайте, из раздела Client Interfaces, положить рядом libpq.lib, и скомпилировать из командной строки, в два прохода:
bcc32 -c main.c -> получится main.obj
ilink32 main.obj libpq.lib
Сделала. Получила Try1.obj.
Далее выдал вот что:
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
-
Странно. Вот поставил я себе свободно распространяемый борландовский компилятор с 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.
И это есть. (-LПуть)
Скорее всего это уже не нужно, но всё равно поясню:
-Lпуть как раз недостаточно - надо ещё библиотеку явно указать.
Как в предыдущем моём посте: bcc32 test.c blibpq.lib
С ilink32 - не так всё просто, там кроме .obj и .lib файлов, относящихся к программе, надо ещё указывать борландовские файлы c0w32.obj, cw32.lib (или им подобные)
-
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, хотя по описанию, должна быть.
8) Сделал файл test.c - первый пример из документации постгреса
9) Скомпилировал его:
bcc32 -I"путь_к_/src/include" -I"путь_к_/src/interfaces/libpq" test.c blibpq.lib
А вот с примером не выходит
Выдает вот что:
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
Пробовала и так
bcc32 -I"путь_к_/src/include" -I"путь_к_/src/interfaces/libpq" test.c blibpq.lib
и так
bcc32 -c main.c -> получится main.obj
ilink32 main.obj libpq.lib
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 пробовала - не получается.
-
Наконец получила 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 и прочие)
-
УРА!! К базе вроде подключаюсь! Надо было подключить обе библиотеки/
Прописала пути и добавила в код:
#pragma comment(lib,"blibpq.lib")
#pragma comment(lib,"blibpqdll.lib")
Всем СПАСИБО!!!
Теперь буду пытаться получить данные.
-
УРА!! К базе вроде подключаюсь! Надо было подключить обе библиотеки/
Прописала пути и добавила в код:
#pragma comment(lib,"blibpq.lib")
#pragma comment(lib,"blibpqdll.lib")
Всем СПАСИБО!!!
Теперь буду пытаться получить данные.
Поздравляю
Небольшой комментарий: библиотека blibpqdll.lib нужна, чтобы использовать код из blibpq.dll, а blibpq.lib сама содержит всё необходимое, при этом клиентский код libpq после линковки кладётся непосредственно в exe-файл программы.
Поэтому использовать достаточно только одну из них (либо blibpq.lib, либо blibpqdll.lib + blibpq.dll, которую надо класть рядом с программой), в зависимости от обстоятельств могут быть удобны оба варианта.
-
Здравствуйте!
Базу данных я подключила. Отправила запрос
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;
}
и получила ответ. А вот разобрать ответ пока не получается.
Подскажите как это сделать!?
-
Здравствуйте!
Базу данных я подключила. Отправила запрос
tip_ptr = PQgetvalue(res, i, tip_fnum);
и получила ответ. А вот разобрать ответ пока не получается. :unsure:
Подскажите как это сделать!?
А в чём проблема?
По адресу tip_ptr и будет располагаться значение колонки tip в текущей строке.
-
Добрый день! Я скачал уже скомпилированный файл libpq.lib и добавил его в библиотеку С++ Builder. Все замечательно распозналось. Но при компиляции приложения выдается ошибка EOleException с сообщением "Объект или поставщик не может выполнить требуемую операцию". Я покопался в документации и нашел такую информацию, что в библиотеку следует добавить не libpq.lib, а libpq++.lib. Я скачал исходники, но проблема в том что я не умею работать с ними и не понимаю как их откомпилировать. Очень прошу помощи так как скоро нужно отчитываться по работе...
-
Добрый день! Я скачал уже скомпилированный файл libpq.lib и добавил его в библиотеку С++ Builder. Все замечательно распозналось. Но при компиляции приложения выдается ошибка EOleException с сообщением "Объект или поставщик не может выполнить требуемую операцию". Я покопался в документации и нашел такую информацию, что в библиотеку следует добавить не libpq.lib, а libpq++.lib. Я скачал исходники, но проблема в том что я не умею работать с ними и не понимаю как их откомпилировать. Очень прошу помощи так как скоро нужно отчитываться по работе...
Cудя по тому, что релизов этого libpq++ не было с 2002 года, по нему вряд ли удастся услышать ответы на какие-либо вопросы. Так что рекомендую остановиться на обычном libpq.
Решить проблему с EOleException невозможно без подробного описания - что делалось, каким образом. Непонятно также, зачем код libpq.dll выполняется при компиляции.
-
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.
-
Да собственно говоря я ничего не делал. Я прописал свойство 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 и включить логгинг - посмотрите, какие будут ошибки.
-
Да я обновлял провайдер. Я раньше не добавлял 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 к проекту, а когда добавил то у меня вылезла ошибка:
"[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).
-
Я скачал архив с pgfoundry.org/projects/oledb, зарегистрировал библиотеки как в README. Но ошибка не исправляется, выдается все то же: "Объект или поставщик не может выполнить требуемую операцию". Не понимаю что она означает. Знаю только то что она возникает при установки значения свойства Activate компонента TADOTable в True. Смотрел в справке но там как то все размыто написано. Уже просто не знаю че делать хотя вроде все правильно. Может быть нужно сделать какие то настройки в самом PostgreSQL? (у меня версия 8.2)
Со вторым вариантом сложнее потому что я вобще понятия не имею как это все делается. В документации насколько я знаю написана всего одна команда. Пробовал - не получилось. Читал тут на форуме, но так ничего и не понял - обсуждаются какие то конкретные моменты, а не все конкретно общий алгоритм.
-
Я скачал архив с 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)
там и команд много, и примеры есть...
-
Сделал лог но честно говоря не могу понять где тут ошибка
-
Сделал лог но честно говоря не могу понять где тут ошибка :(
Да, не очень понятно пока. Единственное - сыпятся ошибки "Requested schema not supported", скорее всего, когда билдер ищет PK-колонки. Но они не должны доходить до приложения. Как минимум в Delphi они обрабатываются внутри ADODB.
Покажите, что ли, таблицу (скрипт create table)...
Да, через libpq должно работать - в логах провайдера (он сам пользуется libpq для связи с PostgreSQL) видно, что запросы SELECT * FROM dict проходят и возвращают результаты.
-
Покажите, что ли, таблицу (скрипт 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;
Это все
-
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-код:
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');
-
Не хочет ломаться это как?
-
Не хочет ломаться это как? :)
Работает через оба провайдера и ответы возвращает как надо. В том числе text-поля.
Видимо, какие-то проблемы в билдерном коде.
Если я правильно понял, исключение вылазит при присваивании Active = True - это аналогично открытию таблицы, даже ещё не чтению данных из неё. Я бы попробовал руками создать объект TADOQuery, натравил бы его на таблицу и посмотрел, что получится.
-
Попробовал на Дельфи - тоже самое! А где пробовали если не секрет?
-
Попробовал на Дельфи - тоже самое! А где пробовали если не секрет?
Э... в смысле где? приведённый скрипт запустил (из файла с расширением .vbs) и всё, он отработал. Выдал все данные. В т.ч. со старым провайдером 1.0.0.20.
-
Э... в смысле где? приведённый скрипт запустил (из файла с расширением .vbs) и всё, он отработал. Выдал все данные. В т.ч. со старым провайдером 1.0.0.20.
Ну а сам скрипт где запустить? (просто я не совсем опытный в этом вопросе)
-
Ну а сам скрипт где запустить? (просто я не совсем опытный в этом вопросе)
Как обычно в Windows - двойным щелчком...