Ingres 正在将 select 提取到 SQLDA 中
Ingres fetching select into SQLDA
我正在尝试使用 C 中的嵌入式 SQL 从 Ingres 数据库中获取行,并将结果 return 放入 SQLDA 结构中。我将选择整数、长整数和字符串。到目前为止,我的程序可以很好地获取字符串,但我对整数和长整数有问题。
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 字节)按预期工作。信息被编码到 char 数组 (sqlda->sqlvar[]->sqldata) 的第一个位置。一旦你尝试超过 1 个字节,它就会开始变得奇怪。该字符串被截断了 2 个字节,但是如果您将两个字节再读入 char 数组,数据就在那里,所以我不担心。
我做错了什么/我如何正确地提取到 sqlda 中,以便 ints/longs 以我以后可以检索它们的方式保存?
当显示从数据库中检索到的 int2 值之一时,请尝试如下操作:
*(短 *)sqlda->sqlvar[i].sqldata
字符串值 'dfsdfsf' 正在作为 varchar 而不是 char 检索(请参阅 sqlda->sqlvar[i].sqltype),varchar 的前 2 个字节包含字符串长度。
我正在尝试使用 C 中的嵌入式 SQL 从 Ingres 数据库中获取行,并将结果 return 放入 SQLDA 结构中。我将选择整数、长整数和字符串。到目前为止,我的程序可以很好地获取字符串,但我对整数和长整数有问题。
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 字节)按预期工作。信息被编码到 char 数组 (sqlda->sqlvar[]->sqldata) 的第一个位置。一旦你尝试超过 1 个字节,它就会开始变得奇怪。该字符串被截断了 2 个字节,但是如果您将两个字节再读入 char 数组,数据就在那里,所以我不担心。
我做错了什么/我如何正确地提取到 sqlda 中,以便 ints/longs 以我以后可以检索它们的方式保存?
当显示从数据库中检索到的 int2 值之一时,请尝试如下操作: *(短 *)sqlda->sqlvar[i].sqldata
字符串值 'dfsdfsf' 正在作为 varchar 而不是 char 检索(请参阅 sqlda->sqlvar[i].sqltype),varchar 的前 2 个字节包含字符串长度。