powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / message length error (encountered 6, expected 4)
7 сообщений из 7, страница 1 из 1
message length error (encountered 6, expected 4)
    #39215728
Иванов Е.П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
система 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
message length error (encountered 6, expected 4)
    #39215764
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqllen не назначил. И, кстати, short - маловато для count(*).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
message length error (encountered 6, expected 4)
    #39215768
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иванов Е.П., IBExpert под Win7, FB 2.5.5 выполняет первый запрос нормально
...
Рейтинг: 0 / 0
message length error (encountered 6, expected 4)
    #39215791
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иванов Е.П.в то же время запрос выполняется нормально
Не верю. Приведённый код в принципе неработоспособен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
message length error (encountered 6, expected 4)
    #39215835
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRasta,

да при чем тут ИБЭксперт. У него вопрос по коду.
...
Рейтинг: 0 / 0
message length error (encountered 6, expected 4)
    #39216554
Иванов Е.П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
message length error (encountered 6, expected 4)
    #39216567
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иванов Е.П.она срабатывала по данным установленным случайным образом

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


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