Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将select提取到SQLDA中_C_Ingres_Embedded Sql - Fatal编程技术网

将select提取到SQLDA中

将select提取到SQLDA中,c,ingres,embedded-sql,C,Ingres,Embedded Sql,我尝试使用C中的嵌入式SQL从Ingres数据库中获取行,并将结果返回到SQLDA结构中。我将选择整数、长整数和字符串。到目前为止,我的程序可以很好地获取字符串,但是我对int和long有问题 EXEC SQL DECLARE select_string STATEMENT; EXEC SQL BEGIN DECLARE SECTION; char sql[1000]; int errorno; /* ingres error number */

我尝试使用C中的嵌入式SQL从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);
观察:小整数1字节按预期工作。信息被编码到第一个位置的字符数组sqlda->sqlvar[]->sqldata中。一旦你尝试超过1字节,它就开始变得奇怪。字符串被截断了2个字节,但是如果在char数组中再读取两个字节,数据就在那里了,所以我不担心这一点


我做错了什么/我如何正确地提取到sqlda中,以便以我以后可以检索到的方式保存Int/Long?

当显示从数据库检索到的int2值之一时,请尝试以下操作: *short*sqlda->sqlvar[i].sqldata


字符串值“DFSFSF”将作为varchar而不是char进行检索。请参见sqlda->sqlvar[i]。sqltype,varchar的前2个字节包含字符串长度。

工作正常。谢谢你的洞察力。入口文档有点缺乏。
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