2010-02-09 1 views
2

У меня возникли проблемы при получении данных из столбцов, которые имеют более 255 символовSybase ошибки при выборке столбцов более 255 символов

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

Open Client Message:
Message number: LAYER = (1) ORIGIN = (4) SEVERITY = (1) NUMBER = (132)
Message String: ct_fetch(): user api layer: internal common library error: The bind of result set item 3 resulted in truncation.

Он извлекает только сначала 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)) { 
+0

@selcuk: можете ли вы проверить свои версии сервера и CT lib и добавить их в вопрос? Вы пробовали поставить вызов ct_capability * после * ct_connect? –

+0

привет мартин это не имело смысла, заменяя ct_capability. Я также пытался установить действие CS_GET на CS_SET, но это тоже не сработало. Я не могу справиться с проблемой при чтении текстовой области, Я не знаком с низким уровнем db, но друг сказал мне, что может быть перечитал область (область текста) как тип blob? Если это так, как ct_lib может считывать тип blob? спасибо – selcuk

+0

плюс я пробовал такой код, который, как я думал, может помочь, хотя эта команда не сработала, это не сработало CS_RETCODE retcode2; int textize = 1000000; retcode2 = ct_options (соединение, CS_SET, CS_OPT_TEXTSIZE и текст, CS_UNUSED, NULL); Кстати, я использую sybase15 libs – selcuk

ответ

0

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

0

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

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