Форум программистов, компьютерный форум, киберфорум
Наши страницы
C (Си)
Войти
Регистрация
Восстановить пароль
 
den4ik_fpmi
1 / 1 / 3
Регистрация: 20.10.2012
Сообщений: 166
#1

Подключение к PostrgeSQL через ODBC

16.10.2015, 11:16. Просмотров 277. Ответов 0
Метки нет (Все метки)

нужно подключиться к базе данных и выполнить sql-запрос, для выборки данных использую курсор (sqlfetch) но проблема в том что sqlfetch возвращает что данных не обнаружено, хотя сам запрос выполняется нормально и результат есть (запрос выполнял в phppgadmin)
вот текст программы
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdlib.h>
#include <stdio.h>
#include <sqltypes.h>
#include <sqlext.h>
void checkError(HENV env, HDBC dbc, HSTMT stmt, int code)
{
    SQLCHAR     errmsg[256];
    SQLCHAR     sqlstate[256];
    SQLINTEGER  naterr;
    SQLSMALLINT actmsglen;
 
    if(code == SQL_ERROR) {
        SQLError(env, dbc, stmt, sqlstate, &naterr, errmsg, 256, &actmsglen);
        errmsg[actmsglen]='\0';
        printf("Error:\nSQLState=%s\tNative error=%d\n", sqlstate, naterr);
        printf("MSG=%s\n", errmsg);
        exit(code);
    }
}
 
int main()
{
    HENV env;
    HDBC dbc;
    HSTMT stmt;
    
    SQLCHAR driver[10]="sql";
    SQLCHAR log[12]="pmi-b2403";
    SQLLEN  val_n_post,val_sum;
    int sum;
    UCHAR n_post[10];
    RETCODE rc;
    SQLLEN len=SQL_NTS;
    
    char n_izd[40];
    printf("\nВведите номер изделия:\t");
    scanf("%s",n_izd);  
    printf("\nНазначаем идентификатор окружения...");
    rc=SQLAllocEnv(&env);
    checkError(env, dbc, stmt, rc);
     printf("[OK]\n");
    printf("\nНазначаем идентификатор соединения...");
    rc=SQLAllocConnect(env, &dbc);
    checkError(env, dbc, stmt, rc);
     printf("[OK]\n");
    printf("\nСоединение с сервером...");
    rc=SQLConnect(dbc, driver, SQL_NTS, log, SQL_NTS,"pdznpCU5", SQL_NTS);
    checkError(env, dbc, stmt, rc);
     printf("[OK]\n");
    printf("\nНазначаем идентификатор оператора...");
    rc=SQLAllocStmt(dbc, &stmt); 
    checkError(env, dbc, stmt, rc);
     printf("[OK]\n");
    printf("\nСвязываем 1 параметр...");
    rc=SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 40, 0,n_izd, 0 ,&len);
    checkError(env, dbc, stmt, rc);
    printf("[OK]\n");
    
    printf("\nЗапрос...");
    rc=SQLPrepare(stmt, (SQLCHAR *)"begin work;select rez.n_post, r.sum from (select n_post from laba1.s order by n_post) rez left join (select l.n_post,sum(l.amount) sum from laba1.spj l inner join laba1.s on l.n_post=laba1.s.n_post where l.n_izd=?  group by l.n_post) r on rez.n_post=r.n_post ; commit work;", SQL_NTS);
    checkError(env, dbc, stmt, rc);
    printf("[OK]\n");
    printf("определяем область хранения для 1-го столбца...");
    rc=SQLBindCol(stmt,1,SQL_C_CHAR,&n_post,(SDWORD)sizeof(n_post),&val_n_post);
    checkError(env, dbc, stmt, rc);
    printf("[OK]\n");
    printf("определяем область хранения для 2-го столбца...");
    rc=SQLBindCol(stmt,2,SQL_C_SSHORT,&sum,(SDWORD)sizeof(sum),&val_sum);
    checkError(env, dbc, stmt, rc);
    printf("[OK]\n");
    rc=SQLExecute(stmt);
    checkError(env,dbc,stmt,rc);
    printf("[OK]\n");
    while(1)
    {
    rc=SQLFetch(stmt);
    checkError(env, dbc, stmt, rc);
    if(rc==SQL_NO_DATA_FOUND)
    {
        printf("SQLFetch возвратила : SQL_NO_DATA_FOUND\n");
        break;
        }
    if((rc!=SQL_SUCCESS) && (rc!=SQL_SUCCESS_WITH_INFO))
    {
        printf("Ошибка при вызове SQLFetch\n");
        break;
        }
        printf("%s\t\n",n_post);
    }
    printf("Конец запроса\n");
    
    printf("Освобождение идентификатора оператора.\n");
    rc=SQLFreeStmt(stmt, SQL_DROP);
    checkError(env, dbc, stmt, rc);
    printf("Разрыв соединения с сервером.\n");
    rc=SQLDisconnect(dbc);
    checkError(env, dbc, stmt, rc);
    printf("Освобождаем идентификатор соединения.\n");
    rc=SQLFreeConnect(dbc);
    checkError(env, dbc, stmt, rc);
    
    printf("Освобождение идентификатора окружения.\n");
    rc=SQLFreeEnv(env);
    checkError(env, dbc, stmt, rc);
 
    return 0;
}
вот результат работы:
[pmi-b2403@students ~]$ ./lab63.exe

Введите номер изделия: J1

Назначаем идентификатор окружения...[OK]

Назначаем идентификатор соединения...[OK]

Соединение с сервером...[OK]

Назначаем идентификатор оператора...[OK]

Связываем 1 параметр...[OK]

Запрос...[OK]
определяем область хранения для 1-го столбца...[OK]
определяем область хранения для 2-го столбца...[OK]
[OK]
SQLFetch возвратила : SQL_NO_DATA_FOUND
Конец запроса
Освобождение идентификатора оператора.
Разрыв соединения с сервером.
Освобождаем идентификатор соединения.
Освобождение идентификатора окружения.
Помогите разобраться почему не возвращается результат

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2015, 11:16
Ответы с готовыми решениями:

Подключение к firebird через ODBC
Уважаемые Гуру! Не удается подключиться к базе firebird через драйвер ODBC. На...

Подключение ODBC через ip адрес
Как мне подключить сервер, используя ip адрес?

подключение к mysql через odbc на fedora
Добрый день! Пытаюсь создать подключение к БД. Настроил odbc. При вызове...

Подключение к базе данным MSSQL через ODBC
Дважды я пытался подключиться к базе данным, первый раз через ODBC, у меня...

Подключение к MySql через MySqlConnector или ODBC
собственно схема стандартная, но ошибки подключения.. через Mysql connector...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2015, 11:16

Не могу создать локальное подключение ODBC к mysql через Foxpro
Доброе время суток!) Пишу базу данных на Foxpro. Нужно, чтобы база брала с...

Не могу создать локальное подключение ODBC к mysql через Foxpro
Доброе время суток!) Пишу базу данных на Foxpro. Нужно, чтобы база брала с...

Подключение к Paradox через ODBC: "Источник данных не найден или не указан драйвер"
Почему я не могу подключиться к Paradox через ODBC? вот строка...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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