Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / message length error (encountered 6, expected 4) / 7 сообщений из 7, страница 1 из 1
14.04.2016, 14:37
    #39215728
Иванов Е.П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
система CentOS, firebird 2.5.5, язык программирования gpp,
при выполненнии запроса:
Код: plsql
1.
2.
select count(RDB$FIELD_ID) FIELD_ID from RDB$RELATION_FIELDS f
where f.RDB$RELATION_NAME='TABNEW'


выдает subj,

в то же время запрос
Код: plsql
1.
2.
select max(RDB$FIELD_ID) FIELD_ID from RDB$RELATION_FIELDS f
where f.RDB$RELATION_NAME='TABNEW'


выполняется нормально, какие то параметры я, видимо, указываю неправильно.
Не подскажут ли уважаемые в чем ошибка в тексте:
Код: 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.
    char *sel_count ="select max(RDB$FIELD_ID) FIELD_ID from RDB$RELATION_FIELDS f"
        " where f.RDB$RELATION_NAME='BR_SPEC'";
    if (isc_start_transaction(status, &trans, 1, &DB1, 0, NULL))
    {
        ERREXIT(status, 1)
    }
    nfld =1;
    sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(nfld));
    sqlda->sqln = nfld;     /* number of fields allocated */
    sqlda->sqld = nfld;     /* actual number of fields */
    sqlda->version = 1;     /* version of this XSQLDA */
    if (isc_dsql_allocate_statement(status, &DB1, &stmt)) {
        ERREXIT(status, 1)
    }
    if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_count, 1, sqlda)) {
        ERREXIT(status, 1)
    }
    char *Pfa[nfld];
    char *Pfw = (char *)malloc(128);
    for (int k=0; k<nfld; k++) {
        Pfw = (char *)malloc(128); Pfa[k] =Pfw;
        flagS[k] =0;
        sqlda->sqlvar[k].sqldata = Pfa[k];
        sqlda->sqlvar[k].sqltype = SQL_SHORT + 1;
        sqlda->sqlvar[k].sqlind  = &flagS[k];
    }
    if (isc_dsql_execute(status, &trans, &stmt, 1, NULL)) {
        ERREXIT(status, 1)
    }
    n =0;
    while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0) {
        ks =CharToShort(Pfa[0]);    
        printf("%3d.) FIELD_ID:\t%5d \n", n, ks);
        n++;
    }
    if (fetch_stat != 100L) {
        ERREXIT(status, 1)
    }
    if (isc_dsql_free_statement(status, &stmt, DSQL_close)) {
        ERREXIT(status, 1)
    } 
    
    free( Pfa[0] );
    flag0 = 0;
    free( sqlda);
...
Рейтинг: 0 / 0
14.04.2016, 14:54
    #39215764
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
sqllen не назначил. И, кстати, short - маловато для count(*).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.04.2016, 14:55
    #39215768
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
Иванов Е.П., IBExpert под Win7, FB 2.5.5 выполняет первый запрос нормально
...
Рейтинг: 0 / 0
14.04.2016, 15:04
    #39215791
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
Иванов Е.П.в то же время запрос выполняется нормально
Не верю. Приведённый код в принципе неработоспособен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.04.2016, 15:24
    #39215835
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
dedRasta,

да при чем тут ИБЭксперт. У него вопрос по коду.
...
Рейтинг: 0 / 0
15.04.2016, 13:01
    #39216554
Иванов Е.П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
Dimitry SibiryakovИванов Е.П.в то же время запрос выполняется нормально
Не верю. Приведённый код в принципе неработоспособен.


вот правильный ответ )))
дело в том, что код был из работающей программы, это меня и смущало, т.е "в принципе" она работать не должна, а в частности работала ))) значит те поля, что я не определял, она срабатывала по данным установленным случайным образом, т.е. выпадала одна и таже комбинация джекпота )))

а потом вспомнил, что count и мах возвращают разные типы значения long и varchar, поправивив программу и заработало ) а так было интересно почитать коменты, все высказавшимся большое спасибо.

Код: 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.
    int k, n, ln, tp;
    int nfld;
    ISC_STATUS_ARRAY        status;                     /* status vector */
    XSQLDA  *               sqlda;
    long                    fetch_stat;
    isc_stmt_handle         stmt = NULL;                /* statement handle */
    isc_db_handle           DB = NULL;                  /* database handle */
    isc_tr_handle           trans = NULL;               /* transaction handle */
    short                   flag0 = 0, flag1 = 0;
    int   cntf;
    char *sel_count ="select count(RDB$FIELD_ID),max(RDB$FIELD_ID) from RDB$RELATION_FIELDS f"
        " where f.RDB$RELATION_NAME='BR_SPEC'";
    
    if (isc_start_transaction(status, &trans, 1, &DB1, 0, NULL)) {
        ERREXIT(status, 1)
    }
    nfld =2;
    sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(nfld));
    sqlda->sqln = nfld;     /* number of fields allocated */
    sqlda->sqld = nfld;     /* actual number of fields */
    sqlda->version = 1;     /* version of this XSQLDA */
    if (isc_dsql_allocate_statement(status, &DB1, &stmt)) {
        ERREXIT(status, 1)
    }
    if (isc_dsql_prepare(status, &trans, &stmt, 0, sel_count, 1, sqlda)) {
        ERREXIT(status, 1)
    }
    
    long            field0;
    SQL_VARCHAR(10)    field1;

    sqlda->sqlvar[0].sqldata = (char *) &field0;
    sqlda->sqlvar[0].sqltype = SQL_LONG + 1;
    sqlda->sqlvar[0].sqlind  = &flag0;

    sqlda->sqlvar[1].sqldata = (char *) &field1;
    sqlda->sqlvar[1].sqltype = SQL_VARYING + 1;
    sqlda->sqlvar[1].sqlind  = &flag1;
    
    if (isc_dsql_execute(status, &trans, &stmt, 1, NULL)) {
        ERREXIT(status, 1)
    }
    n =0;
    while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0) {
        field1.vary_string[field1.vary_length] =0; 
        printf("%3d.) FIELD0:\t%5d  \tFIELD1:\t%s\n", n, field0, field1.vary_string);
        n++;
    }
    if (fetch_stat != 100L) {
        ERREXIT(status, 1)
    }
    /* Free statement handle. */
    if (isc_dsql_free_statement(status, &stmt, DSQL_close)) {
        ERREXIT(status, 1)
    } 
    
    free( sqlda);
    return 0;
...
Рейтинг: 0 / 0
15.04.2016, 13:16
    #39216567
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
message length error (encountered 6, expected 4)
Иванов Е.П.она срабатывала по данным установленным случайным образом

Нет, она работала по данным, которые в SQLDA занёс вызов isc_dsql_prepare. Зачем там
вообще меняется тип возвращаемых данных, да ещё и так от балды - лично мне не понятно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / message length error (encountered 6, expected 4) / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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