Ingres извлекает выбор в SQLDA - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь использовать встроенный SQL в C для извлечения строк из базы данных Ingres и возврата результатов в структуру SQLDA.Я буду выбирать целые, длинные и строки.До сих пор моя программа отлично выбирает строки, но у меня есть проблемы с типами int и long.

EXEC SQL DECLARE select_string STATEMENT;
EXEC SQL BEGIN DECLARE SECTION;
   char sql[1000];
   int errorno;                /* ingres error number */
   char errortext[257];
EXEC SQL END DECLARE SECTION;
strcpy(sql, "SELECT 18, 100, 3774, 2147483647, 'dfsdfsf'");
printf("%s\n",sql);

EXEC SQL DECLARE csr0 CURSOR FOR select_string;
EXEC SQL PREPARE select_string FROM :sql;
EXEC SQL OPEN csr0 FOR READONLY;

//sqlda
IISQLDA *sqlda;
sqlda = (IISQLDA *)calloc(1, IISQDA_HEAD_SIZE + ((longs+ints+strings) * IISQDA_VAR_SIZE));
sqlda->sqln = (5);
EXEC SQL DESCRIBE select_string INTO :sqlda;

int i,j;

for( i = 0; i < sqlda->sqld; i++)
{
   printf("%d ",sqlda->sqlvar[i].sqllen);
   sqlda->sqlvar[i].sqldata = malloc(sqlda->sqlvar[i].sqllen);
   sqlda->sqlvar[i].sqlind = malloc(sizeof(short));
}
printf("\n");

EXEC SQL FETCH csr0 USING DESCRIPTOR sqlda;

for( i=0; i<sqlda->sqld; i++)
{
   printf("len:%d | ",sqlda->sqlvar[i].sqllen);
   for(j=0;j<sqlda->sqlvar[i].sqllen;j++){
      printf("%d ",sqlda->sqlvar[i].sqldata[j]);
   }
   printf(" | ");
   for(j=0;j<sqlda->sqlvar[i].sqllen;j++){
      printf("%c ",sqlda->sqlvar[i].sqldata[j]);
   }
   printf(" | %ld",*sqlda->sqlvar[i].sqldata);
   printf("\n");
}

for( i = 0; i < sqlda->sqld; i++)
{
   free(sqlda->sqlvar[i].sqldata); 
   free(sqlda->sqlvar[i].sqlind);
}
free(sqlda);

Вывод выглядит следующим образом.

SELECT 18, 100, 3774, 2147483647, 'dfsdfsf'
2 2 2 4 7
len:2 | 18 0  |    | 18
len:2 | 100 0  | d   | 100
len:2 | -66 14  | ▒   | 4294967230
len:4 | -1 -1 -1 127  | ▒ ▒ ▒  | 4294967295
len:7 | 7 0 100 102 115 100 102  |   d f s d f  | 7

Замечания: маленькие целые числа (1 байт)) работать как положено.Информация кодируется в массив символов (sqlda-> sqlvar [] -> sqldata) в первой позиции.Как только вы попытаетесь подняться выше 1 байта, он начинает становиться странным.Строка обрезается на 2 байта, однако, если вы прочитаете еще два байта в массив символов, данные там есть, поэтому я не беспокоюсь об этом.

Что я делаю не так / как я делаю правильноизвлечь в sqlda, чтобы сохранить целые / длинные значения таким образом, чтобы я мог получить их позже?

1 Ответ

0 голосов
/ 21 мая 2018

При отображении одного из значений int2, полученных из базы данных, попробуйте что-то вроде: * (short *) sqlda-> sqlvar [i] .sqldata

Строковое значение 'dfsdfsf' извлекается какvarchar, а не char (см. sqlda-> sqlvar [i] .sqltype), первые 2 байта varchar содержат длину строки.

...