Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите решить проблему! Firebird 
:(
    Опции темы
Belarus
Дата 17.10.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



Люди добрые помогите разобраться в следующей проблемой!
Имеется следующий код на VC++, вроде все написано нормально, но прога ловит клин в определенном месте. Решения этой проблемы я сам найти не могу smile smile smile !
Код

...
#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).
Слезно прошу посоветуйте, что нибудь!
PM MAIL   Вверх
Гость_xgm
Дата 17.10.2005, 19:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код ошибки если бы еще привел, было бы совсем здорово...
Если это не embedded версия (судя по имени файла СУБД - нет) (IBv6???),
то неправильно указано имя файла базы.

Пример:
server_name:C:\Path_to_DB_File\tet.gdb

и... не используй IBv6 !!!
Возьми FB 1.5.2
  Вверх
Belarus
Дата 17.10.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



В том-то и дело, все компилится, линкуется без ошибок!
После компиляции(при запуске *.exe) прога выполняется до этого места:

Код

...
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);
...


IBv6 я использовал как мануал, а FB 1.5.2 я и использую!
Сама БД лежит в папке с EXE-шником и драйвером gds32.dll
поэтому БД должна(как мне кажется) определяться!

PM MAIL   Вверх
Belarus
Дата 17.10.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



Попробовал явно указать путь к БД, никакого эфекта smile !
PM MAIL   Вверх
Belarus
Дата 18.10.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.9.2005

Репутация: нет
Всего: нет



Согласен! Я Тормоз smile !
Проблема решилась с помощью:
Код

if (isc_sqlcode(status_vector)) {
pvector = status_vector;
isc_interprete(msg, &pvector);
msg[0] = ' ';
while(isc_interprete(msg + 1, &pvector))
MessageBox(msg, "Ошибочка!", MB_OK+MB_ICONERROR);
OnOK();}


Оказывается прога не может найти указанный файл smile !

Буду выяснять почему!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.