Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка invalid statement handle / 15 сообщений из 15, страница 1 из 1
19.10.2016, 16:32
    #39330011
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Решил попробовать поработать с API fbclient.dll

Взял пример из книги Алексей Ковязин, Сергей Востриков "Мир InterBase"
На примере запроса:
Код: plaintext
1.
char *query = "select b_id, b_index, b_name, b_author, b_added, b_theme from books";


Все прекрасно заработало. Ура!

Но если я запрос меняю на такой:
Код: sql
1.
select b_id+1 as t, b_index, b_name, b_author, b_added, b_theme from books


получаю ошибку
Код: plaintext
Invalid statement handle

А такой запрос опять прекасно отрабатывает:
Код: sql
1.
select 100500 as t, b_index, b_name, b_author, b_added, b_theme from books



Собственно вопрос, что я делаю не так? Мне кажется неправильно заполняю соответствующий XSQLVAR, но как правильно заполнить понять пока не могу.

С уважением, Naf
...
Рейтинг: 0 / 0
19.10.2016, 16:40
    #39330015
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
кури API Guide от IB6, он в свободном доступе.
и там таки есть примеры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2016, 16:41
    #39330017
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Naf,

из того что ты описал не фига не понятно. Я ничего не вижу кроме присвоение строковой константы. Где остальной код?
...
Рейтинг: 0 / 0
19.10.2016, 16:44
    #39330021
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Naf,

примеров кода полно вот здесь ($fb_root)\examples\api\
...
Рейтинг: 0 / 0
19.10.2016, 16:44
    #39330022
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Naf,
Попробуй поставь алиасы в полях и в таблице. Может поможет.
...
Рейтинг: 0 / 0
19.10.2016, 16:50
    #39330028
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
вот весь код:
Код
Код: plaintext
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.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
#include "FB/ibase.h"
#include <ctime>

#define SQL_VARCHAR(len) struct {short vary_length; char vary_string[(len)+1];}

void info(ISC_STATUS status_vector[20])
{
    if (status_vector[0] == 1 && status_vector[1]){
        char msg[512];
        isc_interprete(msg,&status_vector);
        QMessageBox::information(NULL,"Тынц",msg);
    }
}

void MainWindow::on_pushButton_clicked()
{

    // Константы, необходимые для работы с базой данных – инициализируйте их в
    // соответствии с реальным путем к базе, пользователем и паролем
    char *dbname = "localhost:D:\\Projects\\Test.fdb";
    char *uname = "sysdba";
    char *upass = "123";
    char *query = "select b_id+0 as t, b_index, b_name, b_author, b_added, b_theme from books";
    // Переменные для работы с базой данных
    isc_db_handle db_handle = NULL;
    isc_tr_handle transaction_handle = NULL;
    isc_stmt_handle statement_handle=NULL;
    char dpb_buffer[256], *dpb, *p;
    short dpb_length;
    ISC_STATUS status_vector[20];
    XSQLDA *isqlda, *osqlda;
    long fetch_code;
    short o_ind[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    // Остальные переменные
    int i=0;
    long b_id;
    char b_index[17];
    SQL_VARCHAR(100) b_name;
    SQL_VARCHAR(100) b_author;
    SQL_VARCHAR(100) b_theme;
    ISC_TIMESTAMP b_added;
    struct tm added_time;
    char decodedTime[100];

    // создаем так называемый database parameter buffer, необходимый
    // для подключения к базе данных
    dpb=dpb_buffer;
    *dpb++ = isc_dpb_version1;
    *dpb++ = isc_dpb_user_name;
    *dpb++ = strlen(uname);
    for(p = uname; *p;) {
        *dpb++ = *p++;
    }
    *dpb++ = isc_dpb_password;
    *dpb++ = strlen(upass);
    for (p=upass; *p;) {
        *dpb++ = *p++;
    }
    dpb_length = dpb-dpb_buffer;

//    // Подключаемся к базе
    isc_attach_database(
                status_vector,
                strlen(dbname),
                dbname,
                &db_handle,
                dpb_length,
                dpb_buffer);

    info(status_vector);

    //транзакция
    if (db_handle){
        isc_start_transaction(
                    status_vector,
                    &transaction_handle,
                    1,
                    &db_handle,
                    0,
                    NULL);
        info(status_vector);
    }

    //готовим результат запроса
    osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(6));
    osqlda -> version = SQLDA_VERSION1;
    osqlda -> sqln = 6;
    osqlda->sqlvar[0].sqldata = (char *)&b_id;
    osqlda->sqlvar[0].sqltype = SQL_LONG+1;
    osqlda->sqlvar[0].sqlind = &o_ind[0];
    osqlda->sqlvar[1].sqldata = (char *)&b_index;
    osqlda->sqlvar[1].sqltype = SQL_TEXT+1;
    osqlda->sqlvar[1].sqlind = &o_ind[1];
    osqlda->sqlvar[2].sqldata = (char *)&b_name;
    osqlda->sqlvar[2].sqltype = SQL_VARYING+1;
    osqlda->sqlvar[2].sqlind = &o_ind[2];
    osqlda->sqlvar[3].sqldata = (char *)&b_author;
    osqlda->sqlvar[3].sqltype = SQL_VARYING+1;
    osqlda->sqlvar[3].sqlind = &o_ind[3];
    osqlda->sqlvar[4].sqldata = (char *)&b_added;
    osqlda->sqlvar[4].sqltype = SQL_TIMESTAMP+1;
    osqlda->sqlvar[4].sqlind = &o_ind[4];
    osqlda->sqlvar[5].sqldata = (char *)&b_theme;
    osqlda->sqlvar[5].sqltype = SQL_VARYING+1;
    osqlda->sqlvar[5].sqlind = &o_ind[5];

    isc_dsql_allocate_statement(
                status_vector,
                &db_handle,
                &statement_handle);
    info(status_vector);
    isc_dsql_prepare(
                status_vector,
                &transaction_handle,
                &statement_handle,
                0,
                query,
                SQL_DIALECT_V6,
                osqlda);
    info(status_vector);
    isc_dsql_execute2(
                status_vector,
                &transaction_handle,
                &statement_handle,
                1,
                NULL,
                NULL);
    info(status_vector);

    QString result="";


    while((fetch_code = isc_dsql_fetch(
               status_vector,
               &statement_handle,
               1,
               osqlda))==0){
        b_index[osqlda->sqlvar[1].sqllen]='\0';
        b_name.vary_string[b_name.vary_length]='\0';
        b_author.vary_string[b_author.vary_length]='\0';
        b_theme.vary_string[b_theme.vary_length]='\0';
        isc_decode_timestamp(&b_added,&added_time);
        strftime(decodedTime,sizeof(decodedTime),"%d-%b-%Y %H:%M",&added_time);
        result+=QString("%1 %2 %3 %4 %5 %6 \n").arg(b_id).arg(b_index).arg(b_name.vary_string).arg(b_author.vary_string).arg(decodedTime).arg(b_theme.vary_string);
    }

    ui->plainTextEdit->setPlainText(result);

    info(status_vector);

    free(osqlda);
    isc_dsql_free_statement(
                status_vector,
                &statement_handle,
                DSQL_drop);
    info(status_vector);

    if (transaction_handle){
        isc_commit_transaction(status_vector, &transaction_handle);
    }
    info(status_vector);
    if (db_handle){
        isc_detach_database(status_vector, &db_handle);
    }
    info(status_vector);

}


Модератор: Простыни прячем под спойлер
...
Рейтинг: 0 / 0
19.10.2016, 17:02
    #39330040
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Nafвот весь код:
Ну а какой вызов приводит к данной ошибке?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2016, 17:07
    #39330051
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Dimitry SibiryakovNafвот весь код:
Ну а какой вызов приводит к данной ошибке?

В цикле
Код: plaintext
1.
2.
3.
4.
5.
while((fetch_code = isc_dsql_fetch(
               status_vector,
               &statement_handle,
               1,
               osqlda))==0)

первая итерация проходит, а дальше вываливается сообщение
Код: plaintext
Invalid statement handle
здесь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void info(ISC_STATUS status_vector[20])
{
    if (status_vector[0] == 1 && status_vector[1]){
        char msg[512];
        isc_interprete(msg,&status_vector);
        QMessageBox::information(NULL,"Тынц",msg);
    }
}
...
Рейтинг: 0 / 0
19.10.2016, 17:15
    #39330064
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Nafпервая итерация проходит, а дальше вываливается сообщение
Что, в общем-то, логично: вторая итерация возвращает 100, что не является ошибкой и не
меняет статус-вектор, а твоя кривая процедура обработки ошибок интерпретирует мусор,
сохранившийся там с какого-то внутреннего вызова.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2016, 17:21
    #39330074
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Dimitry SibiryakovNafпервая итерация проходит, а дальше вываливается сообщение
Что, в общем-то, логично: вторая итерация возвращает 100, что не является ошибкой и не
меняет статус-вектор, а твоя кривая процедура обработки ошибок интерпретирует мусор,
сохранившийся там с какого-то внутреннего вызова.

Несколько вопросов тогда:
1. в других случаях все гладко работает, как так?
2. что означает, что возвращает 100?
3. вот пример из поставки, там тоже самое
Код: plaintext
1.
 while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)

сравнивать надо только с 0?
...
Рейтинг: 0 / 0
19.10.2016, 17:34
    #39330089
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Naf1. в других случаях все гладко работает, как так?
"Дуракам везёт." (с)

Naf2. что означает, что возвращает 100?
No more data.

Naf3. вот пример из поставки, там тоже самое
А в следующую строчку посмотреть и увидеть там
Код: plaintext
1.
2.
3.
4.
    if (fetch_stat != 100L)
     {
         ERREXIT(status, 1)
     }


????
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.10.2016, 10:04
    #39330375
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Dimitry Sibiryakov,

в таблице 12 строк. Выводит одну строку и уходит из цикла
меняю запрос на
Код: sql
1.
2.
3.
select b_id, b_index, b_name, b_author, b_added, b_theme from books --все 12 строк вижу
select 1, b_index, b_name, b_author, b_added, b_theme from books --все 12 строк вижу
select 1+1, b_index, b_name, b_author, b_added, b_theme from books --вываливается после первой строки


то есть как только в поле попадает выражение имеем выход из цикла

алиасы к полям не помогли кстати
...
Рейтинг: 0 / 0
20.10.2016, 11:31
    #39330457
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Naf,

раз уж ты не вызываешь isc_dsql_describe, то заполняй все поля в XSQLVAR (толстый намёк на sqllen)
...
Рейтинг: 0 / 0
20.10.2016, 15:48
    #39330799
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
Всем спасибо. Решил!
Отладчик великая вещь.
Выражение имеет тип значения не SQL_LONG как само поле, а SQL_INT64
...
Рейтинг: 0 / 0
20.10.2016, 15:57
    #39330812
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка invalid statement handle
NafВыражение имеет тип значения не SQL_LONG как само поле, а SQL_INT64

Это в общем-то пофиг и может приводить разве что к AV. Или у тебя хэндл так неудачно
попал, что лишние 8 байт значения его затирали?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ошибка invalid statement handle / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]