Can't Get Integers with Dynamic Fetch
Posted in 1995
Topics: Error Codes & Troubleshooting, Connectivity: ESQL/C, 4GL & Embedded SQL
I hope this question hasn't been asked before. I am hitting a problem with dynamic SQL. I am using the sqlda structure because we are stuck with an older version of Informix. I am creating a set of procedures for generic retrieval, and cannot seem to be able to get "integer" or "date" type of data back from the database. Is there something unique about these? I coped the program code directly from the manual, but of course, the manual (Informix ESQL/C Programmer's Manual" does not have integer or date type examples. Basically, the fetch returns good data for character type data, but no apparent data for "integer" type and "date" type fields. Sorry, I don't know how to annotate this any better. This is the program. I run it against any table that has character columns, integer columns, and date columns, and it prints out the field label and data for all character columns, and field label and GARBAGE for all integer or date columns, even when isql shows valid data in those columns. Any help would be appreciated. I must be doing something wrong. gph@zeppelin.pa.itc.hp.com #include <stdio.h> $include sqlca; $include sqlda; $include sqlstype; $include sqltypes; #include "sql_sizes.h" struct sqlda *db_tab_init(query,dberror) char *query; int dberror; { /* * Initialize cursor for an entirely generic query. */ EXEC SQL BEGIN DECLARE SECTION char *q; EXEC SQL END DECLARE SECTION struct sqlda *qdesc1; register int i; register int pos; register char *cp; register int len; struct sqlvar_struct *col; int *dt; char *buffer=NULL; EXEC SQL database atm; if (sqlca.sqlcode < 0) { dberror=sqlca.sqlcode; fprintf(stderr,"dberror at database command: %d\\n",dberror); return(NULL); } q=(char *) malloc(strlen(query)+1); strcpy(q,query); EXEC SQL prepare qid1 from :q; if (sqlca.sqlcode != 0) { dberror=sqlca.sqlcode; return(NULL); } EXEC SQL describe qid1 into qdesc1; if (sqlca.sqlcode != 0) { dberror=sqlca.sqlcode; return(NULL); } pos=0; for (col = qdesc1->sqlvar, i=0;i < qdesc1->sqld;col++, i++) { fprintf(stderr,"type: %d -- ",qdesc1->sqlvar[i].sqltype); fprintf(stderr,"len: %d\\n",qdesc1->sqlvar[i].sqllen); switch(col->sqltype) { case SQLCHAR: col->sqltype = CCHARTYPE; break; case SQLINT: col->sqltype = CINTTYPE; break; case SQLDATE: col->sqltype = CDATETYPE; break; default: return(NULL); } col->sqllen = rtypmsize(col->sqltype, col->sqllen); pos=(int) rtypalign(pos,col->sqltype) + col->sqllen; col->sqlind=NULL; } buffer=malloc(pos); cp=buffer; for (col = qdesc1->sqlvar, i=0; i< qdesc1->sqld;col++, i++) { cp=rtypalign(cp, col->sqltype); if (col->sqltype == CINTTYPE) col->sqldata=(int *)cp; else col->sqldata=(char *)cp; cp +=col->sqllen; } for (col = qdesc1->sqlvar, i=0; i< qdesc1->sqld;col++, i++) { switch(col->sqltype) { case CCHARTYPE: col->sqltype=SQLCHAR; break; case CINTTYPE: col->sqltype=SQLINT; break; case CDATETYPE: col->sqltype = SQLDATE; break; default: return(NULL); } } EXEC SQL declare qcurs1 cursor for qid1; if (sqlca.sqlcode != 0) { dberror=sqlca.sqlcode; return(NULL); } EXEC SQL open qcurs1; if (sqlca.sqlcode != 0) { dberror=sqlca.sqlcode; return(NULL); } return(qdesc1); } int db_tab_fetch(bufptr, q) struct udi_data_xfer **bufptr; struct sqlda *q; { /* * Fetch data for an entirely generic query. By passing the data * via this memory structure, we do not significantly slow things down. */ struct udi_data_xfer *b; struct udi_data_xfer *START; int i; EXEC SQL fetch qcurs1 using descriptor q; if (sqlca.sqlcode != 0) { fprintf(stderr,"ERROR fetching cursor: %d\\n", sqlca.sqlcode); return(sqlca.sqlcode); } /* * Write out all the normal fields: */ b=NULL; for (i=0;i < q->sqld;i++) { if (b) { b->next=(struct udi_data_xfer *)malloc(sizeof(struct udi_data_xfer)); b->next->prev=b; b=b->next; b->next=NULL; } else { b=(struct udi_data_xfer *)malloc(sizeof(struct udi_data_xfer)); b->next=NULL; b->prev=NULL; START=b; } b->atm_core_tid=0; b->issue_id=NULL; b->label=NULL; b->data=NULL; b->button_name=NULL; b->index=NULL; b->label=(char *)malloc(strlen(q->sqlvar[i].sqlname)+1); strcpy(b->label,q->sqlvar[i].sqlname); b->data=(char *)malloc(strlen(q->sqlvar[i].sqldata)+1); switch(q->sqlvar[i].sqltype) { case SQLINT: b->index=q->sqlvar[i].sqldata; break; case SQLCHAR: strcpy(b->data,q->sqlvar[i].sqldata); break; case SQLDATE: rdatestr(q->sqlvar[i].sqldata,b->data); break; default: ; } } *bufptr=START; return(0); } int db_tab_close() { EXEC SQL CLOSE qcurs1; } main(argc,argv) int argc; char *argv[]; { struct udi_data_xfer *b; struct udi_data_xfer *START; struct sqlda *desc; int dberror, count=0; fprintf(stderr,"printing argument\\n"); fprintf(stderr,"query: %s\\n", argv[1]); fprintf(stderr,"after printing argument\\n"); desc=db_tab_init(argv[1],dberror); if (desc == NULL) { fprintf(stderr,"ERROR during init: %d\\n",dberror); exit(1); } count++; while ((dberror=db_tab_fetch(&b,desc)) == 0){ if (dberror < 0) { fprintf(stderr,"ERROR DURING FETCH: %d\\n", dberror); exit(1); } START=b; fprintf(stderr,"\\n\\nRecord: %d\\n",count); count++; for (b=START;b != NULL;b=b->next) { fprintf(stderr,"%s:",b->label); if (b->data) fprintf(stderr," %s\\n",b->data); else fprintf(stderr," %d\\n",b->index); } } }