Ошибка Sybase при получении столбцов длиной более 255 символов - PullRequest
2 голосов
/ 09 февраля 2010

У меня проблемы с извлечением данных из столбцов, содержащих более 255 символов

Я получил такое сообщение об ошибке:

Открыть клиентское сообщение:
Номер сообщения: LAYER = (1) ORIGIN = (4) SEVERITY = (1) NUMBER = (132)
Строка сообщения: ct_fetch (): пользовательский интерфейс API: внутренняя общая ошибка библиотеки: привязка элемента набора результатов 3 привела к усечению.

Извлекает только первые 255 строк и обрезает остальные.

Я пытался подразумевать строки ниже до ct_connect, но не работал

CS_BOOL boolv = CS_TRUE;
CS_RETCODE  retcode2 = ct_capability ( *connection, CS_GET, CS_CAP_REQUEST,    CS_WIDETABLES, &boolv);

вот часть кода, есть ли у вас предложения

for (i = 0; i < num_cols; i++) {
        /*
         ** Get the column description.  ct_describe() fills the
         ** datafmt parameter with a description of the column.
         */
        retcode = ct_describe(cmd, (i + 1), &datafmt[i]);
        if (retcode != CS_SUCCEED) {
            ex_error("ex_fetch_data: ct_describe() failed");
            break;
        }

        /*
         ** update the datafmt structure to indicate that we want the
         ** results in a null terminated character string.
         **
         ** First, update datafmt.maxlength to contain the maximum
         ** possible length of the column. To do this, call
         ** ex_display_len() to determine the number of bytes needed
         ** for the character string representation, given the
         ** datatype described above.  Add one for the null
         ** termination character.
         */
        datafmt[i].maxlength = ex_display_dlen(&datafmt[i]) + 1;

        /*
         ** Set datatype and format to tell bind we want things
         ** converted to null terminated strings
         */
        datafmt[i].datatype = CS_LONGCHAR_TYPE;
        datafmt[i].format = CS_FMT_NULLTERM;

        /*
         ** Allocate memory for the column string
         */
        coldata[i].value = (CS_CHAR *) malloc(datafmt[i].maxlength);
        if (coldata[i].value == NULL) {
            ex_error("ex_fetch_data: malloc() failed");
            retcode = CS_MEM_ERROR;
            break;
        }

        /*
         ** Now bind.
         */
        retcode = ct_bind(cmd, (i + 1), &datafmt[i], coldata[i].value,
                &coldata[i].valuelen, (CS_SMALLINT *) &coldata[i].indicator);
        if (retcode != CS_SUCCEED) {
            ex_error("ex_fetch_data: ct_bind() failed");
            break;
        }
    }


.............
.............
.............

    /*
     ** Fetch the rows.  Loop while ct_fetch() returns CS_SUCCEED or
     ** CS_ROW_FAIL
     */
    while (((retcode = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED,
            &rows_read)) == CS_SUCCEED) || (retcode == CS_ROW_FAIL)) {

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

При использовании собственных драйверов jconn * .jar необходимо установить параметр «? CHARSET = iso_1» в драйвере JDBC для подключения к серверу Sybase с набором символов по умолчанию Roman 8, в противном случае вы видите эту проблему усечения 255 символов .

Может ли это быть проблемой, с которой вы столкнулись?

0 голосов
/ 10 августа 2011

Даже при использовании Sybase с Uniface мы столкнулись с проблемой, но в драйвере Uniface Sybase есть опция, которая обрезает данные и сохраняет их в какой-то другой таблице, но при получении мы должны извлекать данные из всех таблиц.

...