Форум программистов, компьютерный форум CyberForum.ru

PostgreSQL

Войти
Регистрация
Восстановить пароль
 
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
#1

Как передать переменную в PQexec, с++ - PostgreSQL

20.11.2016, 19:43. Просмотров 421. Ответов 6
Метки нет (Все метки)

Здравствуйте, подскаите пожалуйста как передать переменную в запрос PQexec;

Например есть строка запроса, которая создает нового юзера в БД:
C++
1
2
3
4
5
6
7
string User = "UserNew";
string Pswd = "987";
 
//Создаем нового юзера TasteMe с паролем 123
PGresult *res = PQexec(conn, "CREATE USER TasteMe WITH PASSWORD '123';");
 
// Как создать строку запроса PQexec так, чтобы создался новый пользователь User и пароль Pswd
Как передать переменную не могу понять, пожалуйста поясните, как передать переменные именно в запрос, ну или к примеру как в цикле 10 юзеров создать, взяв данные из некоторого массива. или плохо искал, или же не смог найти.

Добавлено через 7 часов 0 минут
Ребят, неужели никто не работает на с++ с PG?
Нагуглил функцию
C++
1
PQexecParams
не могу понять как Strings в неё передавать или int, или другие переменные.
Дайте пожалуйста внятный комментарий, на фоне моего примера.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2016, 19:43     Как передать переменную в PQexec, с++
Посмотрите здесь:

Как передать из ACCESS переменную STRING в переменную окружения (типа CMD команды SET=) - MS Access
Добрый день! Подскажите как установить переменную окружения из ACCESS. Допустим у меня есть переменная CurrentDir типа String и я хочу...

Как передать переменную? - jQuery
Есть скрипт: <!doctype html> <html lang="ru"> <head> <title>Прогноз погоды</title> <meta http-equiv="Content-Type"...

Как передать переменную - Lazarus
Как передать переменную от 1 вормы к другой или чтоб по нажитию кнопки в Form2 значение переменной, скажем i менялось в Form1?

Как передать переменную - C++ Qt
Доброго времени суток, столкнулся с такой проблемой, не могу предать переменную из одной формы в другую(из avtoriz в admin, переменная lst)

Как передать переменную в Report - Visual Basic .NET
Доброго дня всем! Программирую на Visual Basic 2010. Подскажите, пожалуйста, каким образом передать значение переменной объявленной в...

Как передать переменную в QUrl? - C++ Qt
Есть переменная QString clientSocket->readAll() {ui->textBrowser->append(QString::fromUtf8("Сообщение из...

Как передать переменную JAVASCRIPT - PHP
Я вывожу вывожу страницу при помощи скрипта.При помощи JAVASCRIPT делаю всплывающую подсказку с дополнительным меню. Как присвоить в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grgdvo
544 / 480 / 138
Регистрация: 02.09.2012
Сообщений: 1,411
20.11.2016, 23:57     Как передать переменную в PQexec, с++ #2
См. пример №3
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
21.11.2016, 16:08  [ТС]     Как передать переменную в PQexec, с++ #3
grgdvo, Пример я уже смотрел, разобраться в нем не смог.
В примере Params - Это массив Char.

Это не строковый массив. Строки туда запихать у меня не получается никаким образом.
Если есть у Вас хоть один рабочий вариант своего запроса, покажите свой.
Пример на сайте, по моему оторван от жизни, повторюсь, у меня не получилось его реализовать в своем коде.
На форуме, на этом по запросу PQexecParams я нашел только одну тему, но и в ней примера использования этой функции нет.

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

Кроме того, что такое $1 в примере, я тоже не понял, это ссылка на номер элемента в массиве Char, или что это такое?

Добавлено через 14 часов 7 минут
Пробовал такие варианты, оба неудачные, один неудается полностью, другой чатстично рабочий:

1 вариант не получается вообще:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
                        //Задаем параметры
            const char *paramValues[1];
            string User = "oleny@zoo.org";
            string Pswd = "1234";
 
                        //Вводим в массив
            paramValues[0] = User.c_str;
            paramValues[1] = Pswd.c_str;
 
                        //Параметры соединения
                        const char *conninfo;
                        //Само соединение
            PGconn     *conn;
 
 
            conninfo = "hostaddr = '192.168.0.130' port = '5432' dbname = 'zoo' user = 'postgres' password = 'mypass' connect_timeout = '2'";
 
                       //Соединяемся
            conn = PQconnectdb(conninfo);
 
            if (PQstatus(conn) != CONNECTION_OK)
            {
                fprintf(stderr, "Connection to database failed: %s",
                    PQerrorMessage(conn));
            }
 
                        else {
                printf("Good Done Conncted\n");
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Этот вариант даже не компилируется
 
                                               PQexecParams(conn,
                        "CREATE USER $1 WITH PASSWORD $2",
                        1,       /* one param */
                        NULL,    /* let the backend deduce param type */
                        paramValues,
                        NULL,    /* don't need param lengths since text */
                        NULL,    /* default to all text params */
                        1);      /* ask for binary results */
 
//Этот вариант даже не компилируется
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
                               }

2 Этот вариант работает частично:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
                        //Задаем параметры
            const char *paramValues[1];
            string User = "oleny@zoo.org";
            string Pswd = "1234";
 
                        //Вводим в массив
            paramValues[0] = User.c_str;
            paramValues[1] = Pswd.c_str;
 
                        //Параметры соединения
                        const char *conninfo;
                        //Само соединение
            PGconn     *conn;
 
 
            conninfo = "hostaddr = '192.168.0.130' port = '5432' dbname = 'zoo' user = 'postgres' password = 'mypass' connect_timeout = '2'";
 
                       //Соединяемся
            conn = PQconnectdb(conninfo);
 
            if (PQstatus(conn) != CONNECTION_OK)
            {
                fprintf(stderr, "Connection to database failed: %s",
                    PQerrorMessage(conn));
            }
 
                        else {
                printf("Good Done Conncted\n");
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Этот вариант отрабатывается частично
                string insert = "CREATE USER " + EmailToDB + " WITH PASSWORD " + PswdToDb +";";
                cout << insert << endl;
                PGresult *res = PQexec(conn, insert.c_str());
 
 
//Этот вариант отрабатывается частично, не создаются символы 12345789 и прочие @#$%^&...
//Стандартные буквы a-Z нормально принимаются и пользователь в БД создается, но если встречаются
//иные символы PG возвращает ошибку типа:
 
// Syntax error at or near @ к примеру, или иной символ
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Добавлено через 1 час 16 минут
Попробовал иначе задать параметр массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
                        //Задаем параметры
//            const char *paramValues[1];
            string User = "oleny@zoo.org";
            string Pswd = "1234";
 
 /*                       //Вводим в массив
            paramValues[0] = User.c_str;
            paramValues[1] = Pswd.c_str;
 */
       //Задаю переменные массива сразу в момент создания оного     
           const char *paramValues[2] = { (char *)&User, (char *)&Pswd };
 
                        //Параметры соединения
                        const char *conninfo;
                        //Само соединение
            PGconn     *conn;
 
 
            conninfo = "hostaddr = '192.168.0.130' port = '5432' dbname = 'zoo' user = 'postgres' password = 'mypass' connect_timeout = '2'";
 
                       //Соединяемся
            conn = PQconnectdb(conninfo);
 
            if (PQstatus(conn) != CONNECTION_OK)
            {
                fprintf(stderr, "Connection to database failed: %s",
                    PQerrorMessage(conn));
            }
 
                        else {
                printf("Good Done Conncted\n");
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Компилируется
 
                                               PQexecParams(conn,
                        "CREATE USER $1 WITH PASSWORD $2",
                        2,       /* one param */
                        NULL,    /* let the backend deduce param type */
                        paramValues,
                        NULL,    /* don't need param lengths since text */
                        NULL,    /* default to all text params */
                        1);      /* ask for binary results */
 
//компилируется  также сплевывает ошибку Syntax error at or near $1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
                               }
grgdvo
544 / 480 / 138
Регистрация: 02.09.2012
Сообщений: 1,411
21.11.2016, 16:12     Как передать переменную в PQexec, с++ #4
Взял за основу третий пример. Времени на всякие дополнительные проверки типов данных не было, поэтому все лаконично.
Вроде не падает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
#include <netinet/in.h>
#include <arpa/inet.h>
 
void show_binary_results(PGresult *res) {
    int nTuples = PQntuples(res);
    fprintf(stdout, "Tuples count: %i\n", nTuples);
    int nFields = PQnfields(res);
    fprintf(stdout, "Fields count: %i\n", nFields);
 
    int binaryTuples = PQbinaryTuples(res);
    if (binaryTuples == 1)
        fprintf(stdout, "Binary data\n");
    else
        fprintf(stdout, "Text data\n");
 
    for (int tuple = 0; tuple < nTuples; tuple++) {
        fprintf(stdout, "Row#%i\n", tuple);
        for (int field = 0; field < nFields; field++) {
            char* fieldname = PQfname(res, field);
            char* value = PQgetvalue(res, tuple, field);
            int length = PQgetlength(res, tuple, field);
            fprintf(stdout, "\t%s=%s (%i)\n", fieldname, value, length);
        }
    }
}
 
int main(int argc, char **argv) {
    PGconn* conn = PQconnectdb(argv[1]);
    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
        PQfinish(conn); exit(1);
    }
 
    const char* sql1 = "SELECT * FROM pg_settings WHERE setting = $1";
    const char* sql1param = "on";
 
    PGresult* res = PQexecParams(conn, sql1, 1, NULL, &sql1param, NULL, NULL, 1);
    ExecStatusType resStatus = PQresultStatus(res);
    if (resStatus != PGRES_TUPLES_OK) {
        fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
        PQclear(res); PQfinish(conn); exit(1);
    }
    
    char* resStatusStr = PQresStatus(resStatus);
    fprintf(stdout, "Query Result Status: %s\n", resStatusStr);
    show_binary_results(res);
    PQclear(res);
 
    PQfinish(conn);
    return 0;
}
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
21.11.2016, 23:10  [ТС]     Как передать переменную в PQexec, с++ #5
Спасибо за потраченное время, но...блин для меня сложновато для понимания правда.
И комментариев в коде нет совсем

Мой простой пример не можете посмотреть, почему я постоянно получаю ошибку типа

Syntax error at or near $1
Почему буквы нормально распознаются а знаки и символы нет

Добавлено через 6 часов 50 минут
На трех форумах создал тему со своей проблемой, ни одного внятного ответа.
Попробую упростить, кто может заставить работать этот код в чистом новом проекте, с нормально подключенными либами.
Почему у меня постоянно ошибка появляется Syntax error at or near в чем проблема, что я делаю не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
 
#include <iostream>
#include <string.h>
 
#include "libpq-fe.h"
#include "stdafx.h"
 
using namespace std;
 
int main()
{
 
    const char *conninfo;
    PGconn     *conn;
 
 
    std::string EmailToDB = "gfdgfdshj@mail.ru";
    std::string PswdToDb = "1234";
 
    char d = char(64); //Тестовый Char для передачи чистый ANCII
 
    const char *paramValues[2] = { (char *)&EmailToDB, (char *)&PswdToDb };
 
 
    conninfo = "hostaddr = '192.168.0.130' port = '5433' user = 'postgres' password = 'pass' connect_timeout = '2'";
 
    conn = PQconnectdb(conninfo);
    PQsetClientEncoding(conn, "UTF-8");
 
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
            PQerrorMessage(conn));
        //exit(0);
    }
 
    else {
        PQsetClientEncoding(conn, "UTF8");
        printf("Good Done \n");
 
 
//      string insert = "CREATE USER [email]gfdshjk@ya.ru[/email] WITH PASSWORD '123';"; // НЕ РАБОТАЕТ
//      std::string insert = "CREATE ROLE uuuuu@u LOGIN NOINHERIT"; // НЕ РАБОТАЕТ
        std::string insert = "CREATE ROLE "+ EmailToDB+" LOGIN NOINHERIT"; // НЕ РАБОТАЕТ
        //Везде одна и таже ошибка
 
        PGresult *res = PQexec(conn, insert.c_str());
    
 
        fprintf(stderr, "UserCreeate: %s",
            PQerrorMessage(conn));
 
        PQfinish(conn);
    }
 
    system("pause");
 
 
 
    return 0;
}
ЗЫ К пням наверное этот долбанный ПГ кому нужна "наиболее продвинутая из открытых СУБДД в мире" если на элементарный вопрос я уже 3день не могу получить ответ ни на одном из 3х очень уважаемых форумов.
Разве это нормально, я понимаю что никто никому ничего не должен...вопрос не в этом, никто даже в ветку не заходит, ересь не пишет, да в ней тем новых не появляется даже.
Как самостоятельно разобраться в этом всем не понимаю, элементарные запросы сделать не получается...или это особенность взаимодействия с++ в VS...в чем головняк то?
Кто-нибудь отпишитесь, неужели ни у кого подобных проблем не возникало как у меня?
Начиная с установки никак не могу слона выдрессировать. Времени уже нет с ним возиться, убью запущу мускуль.
Там уж точно полн информации и поддержки в доступных примерах пользователей.
grgdvo
544 / 480 / 138
Регистрация: 02.09.2012
Сообщений: 1,411
21.11.2016, 23:59     Как передать переменную в PQexec, с++ #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
К сожалению вы сразу стали использовать не самый удобный запрос
1. DDL выражения не параметризуются (см. аналог PREPARE)
2. При использовании специальных символов в именах объектов (таблиц, ролей....) необходимо их брать в кавычки

Поэтому и дает ошибку синтаксиса!!

В вашем случае правильно написать

C++
1
std::string insert="CREATE ROLE \"" + EmailToDB + "\" LOGIN NOINHERIT";

Вы просили еще комментарии по тексту примера вставить

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
#include <netinet/in.h>
#include <arpa/inet.h>
 
void show_binary_results(PGresult *res) {
    /* узнали кол-во записей (строк) в результатах запроса */
    int nTuples = PQntuples(res);
    fprintf(stdout, "Tuples count: %i\n", nTuples);
    /* узнали кол-во полей (колонок) в результатах запроса */
    int nFields = PQnfields(res);
    fprintf(stdout, "Fields count: %i\n", nFields);
 
    /* узнали формат результата: бинарный или текстовый?? */
    int binaryTuples = PQbinaryTuples(res);
    if (binaryTuples == 1)
        fprintf(stdout, "Binary data\n");
    else
        fprintf(stdout, "Text data\n");
 
    /* в циклах по всем строкам и столбцам */
    for (int tuple = 0; tuple < nTuples; tuple++) {
        fprintf(stdout, "Row#%i\n", tuple);
        for (int field = 0; field < nFields; field++) {
            /* узнали имя поля (колонки) */
            char* fieldname = PQfname(res, field);
            /* узнали указатели на значение */
            char* value = PQgetvalue(res, tuple, field);
            /* Узнали длину в байтах, сколько занимает значение */
            int length = PQgetlength(res, tuple, field);
            /* вывели значение */
            fprintf(stdout, "\t%s=%s (%i)\n", fieldname, value, length);
        }
    }
    /* ВАЖНО!!! Данная функция не рассчитана на вывод
       параметров отличных от строк. Их нужно разбирать
       по типу. Например для integer будет распечатано
       intfield= (4) */
}
 
int main(int argc, char **argv) {
    /* Устанавливаем соединение с базой данных.
       На входе строка вида: "dbname=mydb user=myuser"
       подробности в описании функции в документации */
    PGconn* conn = PQconnectdb(argv[1]);
    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
        PQfinish(conn); exit(1);
    }
 
    /* Готовим данные для выполнения запроса */
    const char* sql1 = "SELECT * FROM pg_settings WHERE setting = $1";
    const char* sql1param = "on";
 
    /* Запускаем запрос. Параметры по порядку:
       1. conn - указатель соединения
       2. sql1 - текст запроса (параметры запроса пронумерованы в текст запроса $1, $2 ....)
       3. 1 - передаем один параметр (в тексте всего один $)
       4. NULL - пусть сервер сам догадывается о типах данных подставляемых параметров
       5. указатель на память, где лежат указатели на значения параметров
           или массив, где лежат указатели на значения параметров
       6. массив размеров значений (по указателям из №5)
       7. массив форматов значений параметров
           либо текстовый, тогда просто строка символов, заканчивающаяся 0, длина не нужна
           либо бинарный, тогда длина учитывается
       7. ожидаем результаты в двоичном виде */
    PGresult* res = PQexecParams(conn, sql1, 1, NULL, &sql1param, NULL, NULL, 1);
    ExecStatusType resStatus = PQresultStatus(res);
    if (resStatus != PGRES_TUPLES_OK) {
        fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
        PQclear(res); PQfinish(conn); exit(1);
    }
 
    /* вывели строку статуса результата запроса */   
    char* resStatusStr = PQresStatus(resStatus);
    fprintf(stdout, "Query Result Status: %s\n", resStatusStr);
    /* выводим сами данные результата */
    show_binary_results(res);
    PQclear(res);
 
    /* Закрыли соединение */
    PQfinish(conn);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2016, 01:44     Как передать переменную в PQexec, с++
Еще ссылки по теме:

Как передать переменную jquery - jQuery
пожалуйста, помогите передать переменную: &lt;form name=&quot;abcd&quot;&gt; &lt;input type=submit&gt; &lt;input type=&quot;hidden&quot; id=&quot;a_id&quot; name=&quot;a_id&quot; value=...

Как передать классу переменную? - PHP ООП
Здравствуйте уважаемые ПРО! Подскажите как передать классу значение из сессии &lt;?php //присваиваю значение переменным из...

Как передать переменную в JavaScript ? - JavaScript
Есть кусок кода while($row = mysql_fetch_array($n)) { ?&gt; &lt;font color = &quot;red&quot;&gt;&lt;?php print($row);?&gt;&lt;/font&gt;&lt;br&gt;&lt;?php $vo = $row; ...

Как передать переменную в PHP? - JavaScript
помогите передать переменную из js в PHP. перепробовал все , но в php появляется только значения и формы созданные PHP &lt;html&gt; ...

Как передать переменную в шорткод? - WordPress
День добрый. Имеется такая конструкция (в wordpress) echo do_shortcode(''); Есть переменная $addr=&quot;Moscow, Birulevskaya, 1/2&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lostandleft
2 / 2 / 1
Регистрация: 04.12.2015
Сообщений: 96
22.11.2016, 01:44  [ТС]     Как передать переменную в PQexec, с++ #7
Спасибо большое, я уже отчаялся.
Yandex
Объявления
22.11.2016, 01:44     Как передать переменную в PQexec, с++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru