Примерчик - небольшой - лови... Правда посано под MS VS 98, но под линухои проблем быть не должно...
Код | #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ibase.h> #include "convert.h"
#define ERREXIT(status, rc) {isc_print_status(status); return rc;}
static char isc_tpb[] = { isc_tpb_version3, isc_tpb_write, isc_tpb_concurrency, isc_tpb_wait};
int main() { isc_db_handle db; isc_tr_handle tr; isc_stmt_handle stmt; ISC_STATUS status_vector[20]; XSQLDA *sqlda; XSQLVAR *sqlvar;
char *UserName = "sysdba"; char *UserPassword = "masterkey"; char *DBName = "c:\\i\\i.fdb"; //char *DBName = "i.fdb"; char sql_stmt[16000];// = "select i, d1, coalesce(vs,'<Null>') from tst"; int dpbLength, sqlcode, i, num_cols; char dpbBuffer[256], *dpb, *p; char *nls = "dos866";
char s[64000]; char sp[64000]; short flag0, flag1, flag2, *l, j; int db_i; double db_d1; long fetch_stat;
db=NULL; tr = NULL; stmt = NULL; flag0 = 0; strcpy(sql_stmt, "select tst from tst order by tst");
sqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(5)); sqlda->version = SQLDA_VERSION1; sqlda->sqln = 5; sqlda->sqld = 5;
dpb = dpbBuffer; *dpb++ = isc_dpb_version1; *dpb++ = isc_dpb_user_name; *dpb++ = strlen(UserName); for (p = UserName; *p;) *dpb++ = *p++; *dpb++ = isc_dpb_password; *dpb++ = strlen(UserPassword); for (p = UserPassword; *p;) *dpb++ = *p++;
*dpb++ = isc_dpb_lc_ctype; *dpb++ = strlen(nls); for (p = nls; *p;) *dpb++ = *p++;
dpbLength = dpb - dpbBuffer;
isc_attach_database(status_vector, (short) strlen(DBName), DBName, &db, (short) dpbLength, dpbBuffer); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
isc_start_transaction(status_vector, &tr, 1, &db, (unsigned short) sizeof(isc_tpb), isc_tpb); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
isc_dsql_allocate_statement(status_vector, &db, &stmt); // in first call if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
isc_dsql_prepare(status_vector, &tr, &stmt, 0, sql_stmt, SQL_DIALECT_V6, sqlda); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
// SQL_TEXT SQL_VARYING SQL_SHORT SQL_LONG SQL_FLOAT SQL_DOUBLE SQL_D_FLOAT // SQL_TIMESTAMP SQL_BLOB SQL_ARRAY SQL_QUAD SQL_TYPE_TIME SQL_TYPE_DATE SQL_INT64
sqlda->sqlvar[0].sqldata = (char*) s; sqlda->sqlvar[0].sqltype = SQL_VARYING + 1; sqlda->sqlvar[0].sqlind = &flag2; //s[sqlda->sqlvar[0].sqllen] = '\0';
isc_dsql_execute(status_vector, &tr, &stmt, 1, NULL); //isc_dsql_execute(status_vector, &tr, &stmt, 1, sqlda); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0) { // s[sqlda->sqlvar[0].sqllen] = '\0'; // printf("%9d - ", db_i); // printf("%s , %d , %d , %s |\n", sqlda->sqlvar[0].sqldata, flag2, sqlda->sqlvar[0].sqllen, s);
l = (short*)&s; for(j=2;j<*l+2;j++) sp[j-2] = s[j]; sp[j-2] = '\0'; //*sp = *convert(sp, "dos866","win1251");
printf("%d - ", *l); (flag2<0) ? printf("<NULL>\n") : printf("%s\n", sp); // printf("%s|\n", sqlda->sqlvar[0].sqldata); }
if (fetch_stat != 100L) ERREXIT(status_vector, 1);
isc_commit_transaction(status_vector, &tr); //isc_commit_retaining(status_vector, &tr); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
isc_detach_database(status_vector, &db); sqlcode = isc_sqlcode(status_vector); printf("SqlCode-Detach-%d\n",sqlcode); if (status_vector[0] == 1 && status_vector[1]) ERREXIT(status_vector, 1);
free(sqlda); return(0); }
|
! | Пользуемся тегами [code=cpp]! Спасибо. Chipset.
| |