Люди добрые помогите разобраться в следующей проблемой! Имеется следующий код на VC++, вроде все написано нормально, но прога ловит клин в определенном месте. Решения этой проблемы я сам найти не могу !
| Код | ... #include "ibase.h" #define ERREXIT(status, rc) {isc_print_status(status); return rc;} #pragma comment (lib, "gds32_ms.lib")
#define TEL_NOM1 5 #define FAMILIYA1 18 #define IO1 2 #define ULICA1 24 #define DOM1 8 #define GOROD1 20 ...
int nItem;
static char isc_tpb[] = { isc_tpb_version3, isc_tpb_write, isc_tpb_concurrency, isc_tpb_wait};
isc_db_handle db; isc_tr_handle tr; isc_stmt_handle stmt; ISC_STATUS status_vector[20]; XSQLDA *sqlda;
char *UserName = "sysdba"; char *UserPassword = "masterkey"; char *DBName = "tet.gdb"; char sql_stmt[16000]; int dpbLength, sqlcode; char dpbBuffer[256], *dpb, *p; char *nls = "Win1251";
short flag0=0, flag1=0, flag2=0, flag3=0, flag4=0,flag5=0; char TEL_NOM_name[TEL_NOM1], FAMILIYA_name[FAMILIYA1], IO_name[IO1], GOROD_name[GOROD1], ULICA_name[ULICA1], DOM_name[DOM1];
long fetch_stat;
db=NULL; tr = NULL; stmt = NULL; strcpy(sql_stmt, "select NOMER, FAM, IO, GOROD, ULICA, DOM from TELEFONS order by NOMER");
sqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(6)); sqlda->version = SQLDA_VERSION1; sqlda->sqln = 6; sqlda->sqld = 6;
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); 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);
sqlda->sqlvar[0].sqldata = (char *)&TEL_NOM_name; sqlda->sqlvar[0].sqltype = SQL_TEXT + 1; sqlda->sqlvar[0].sqlind = &flag0;
sqlda->sqlvar[1].sqldata = (char *)&FAMILIYA_name; sqlda->sqlvar[1].sqltype = SQL_TEXT + 1; sqlda->sqlvar[1].sqlind = &flag1;
sqlda->sqlvar[2].sqldata = (char *)&IO_name; sqlda->sqlvar[2].sqltype = SQL_TEXT + 1; sqlda->sqlvar[2].sqlind = &flag2;
sqlda->sqlvar[3].sqldata = (char *)&GOROD_name; sqlda->sqlvar[3].sqltype = SQL_TEXT + 1; sqlda->sqlvar[3].sqlind = &flag3;
sqlda->sqlvar[4].sqldata = (char *)&ULICA_name; sqlda->sqlvar[4].sqltype = SQL_TEXT + 1; sqlda->sqlvar[4].sqlind = &flag4;
sqlda->sqlvar[5].sqldata = (char *)&DOM_name; sqlda->sqlvar[5].sqltype = SQL_TEXT + 1; sqlda->sqlvar[5].sqlind = &flag5;
isc_dsql_execute(status_vector, &tr, &stmt, 1, NULL); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0) { TEL_NOM_name[sqlda->sqlvar[5].sqllen] = '\0'; FAMILIYA_name[sqlda->sqlvar[18].sqllen] = '\0'; IO_name[sqlda->sqlvar[2].sqllen] = '\0'; GOROD_name[sqlda->sqlvar[20].sqllen] = '\0'; ULICA_name[sqlda->sqlvar[24].sqllen] = '\0'; DOM_name[sqlda->sqlvar[8].sqllen] = '\0';
nItem = m_listtel.InsertItem(0, TEL_NOM_name); m_listtel.SetItemText(nItem, 1, FAMILIYA_name); m_listtel.SetItemText(nItem, 2, IO_name); m_listtel.SetItemText(nItem, 3, GOROD_name); m_listtel.SetItemText(nItem, 4, ULICA_name); m_listtel.SetItemText(nItem, 5, DOM_name); }
if (fetch_stat != 100L) ERREXIT(status_vector, 1);
isc_commit_transaction(status_vector, &tr); if (isc_sqlcode(status_vector)) ERREXIT(status_vector, 1);
isc_detach_database(status_vector, &db); sqlcode = isc_sqlcode(status_vector); if (status_vector[0] == 1 && status_vector[1]) ERREXIT(status_vector, 1);
free(sqlda); ...
|
С базами работаю недавно, может чего и не допонимаю, поэтому сильно над кодом не смейтесь. Все писал с помощью APIGuide Interbase 6. Драйвер использовал Firebird (Gds32.dll). Слезно прошу посоветуйте, что нибудь! |