Исспользование Interbase API
Я подключаю файл "ibase.h" . При вызове функции isc_attach_database линковщик выдает ошибку
Unresolved external 'isc_attach_database' referenced from D:\WORK\U_MAIN.OBJ
Эта же ошибка появляется при вызове любой функции из этого файла.
Может нужно задать какие-то опции проекте?
USELIB("gds32.lib");
Пишу:
isc_db_handle db;
char *db_path = "d:\work\base.gdb";
ISC_STATUS st_vector[20];
...
db = OL;
isc_attach_database(st_vector, strlen(db_path), db_path, &db, 0, NULL);
if(st_vector[0] == 1 && st_vector[1]) ShowMessage(isc_print_status(st_vector));
Ошибка возникает постоянно.
Сервер запущен, база открыта/закрыта. Ошибка номер 335544344. Текстовое описание найти не смог, может быть плохо искал.
maximaximax, спасибо. Программа начала нормально запускаться, но теперь возникла другая проблемма: не получается соединиться с базой.
Пишу:
isc_db_handle db;
char *db_path = "d:\work\base.gdb";
ISC_STATUS st_vector[20];
...
db = OL;
isc_attach_database(st_vector, strlen(db_path), db_path, &db, 0, NULL);
if(st_vector[0] == 1 && st_vector[1]) ShowMessage(isc_print_status(st_vector));
Ошибка возникает постоянно.
Сервер запущен, база открыта/закрыта. Ошибка номер 335544344. Текстовое описание найти не смог, может быть плохо искал.
Я думаю проблема в том что ты не передаёшь login /password. У меня есть функциия IbConnect:
bool __fastcall MvAl::IbConnect(
TISC_DB_HANDLE &hDb,
const AnsiString &strDbPath,
const AnsiString &strUserName,
const AnsiString &strUserPassword)
{
long iaSt[20];
char *cpDpb((char *)malloc(7));
char *p(cpDpb);
char *cpDpbCopy(cpDpb);
*p++ = '\1';
*p++ = isc_dpb_sweep_interval;
*p++ = '\4';
long sweep_interval(16384);
long l(::isc_vax_integer((char *) &sweep_interval, 4));
char *d((char *) &l);
*p++ = *d++;
*p++ = *d++;
*p++ = *d++;
*p = *d;
short dpb_length(7);
isc_expand_dpb(&cpDpb, &dpb_length,
isc_dpb_user_name, strUserName.c_str(),
isc_dpb_password, strUserPassword.c_str(),
isc_dpb_sql_dialect, "1", NULL); // before it was 3
if (isc_attach_database(iaSt, strDbPath.Length(), strDbPath.c_str(),
(void **)&hDb, dpb_length, cpDpb)) {
ERREXIT(iaSt, 1);
}
free(cpDpbCopy);
return true;
}
Я думаю проблема в том что ты не передаёшь login /password.
В документации по Interbase приводится пример соединения с базой без исспользовании dpb.
Я заменил в твоей функции ERREXIT(iaSt, 1) на ShowMessage(isc_print_status(iaSt)). При запуске программа выдает всю туже ошибку 335544344. Я нашел в файле "iberror.h" макрос
#define isc_io_error 335544344L.
Как могла возникнуть ошибка ввода/вывода?
В документации по Interbase приводится пример соединения с базой без исспользовании dpb.
Я заменил в твоей функции ERREXIT(iaSt, 1) на ShowMessage(isc_print_status(iaSt)). При запуске программа выдает всю туже ошибку 335544344. Я нашел в файле "iberror.h" макрос
#define isc_io_error 335544344L.
Как могла возникнуть ошибка ввода/вывода?
не, ну если ты пишешь
то конечно возникнет ошибка. Это же С всё-таки, надо писать
Теперь все работает! Спасибо:)
maximaximax, как я понял, ты в Interbase профи. У тебя нет простенького примерчика его исспользования(на уровне выполнения элементарного запроса)? Я только начинаю работать с Interbase и помощь профессионала была бы как нельзя кстати.
Действительно глупость. Надо же так лопухнуться:(
Теперь все работает! Спасибо:)
maximaximax, как я понял, ты в Interbase профи. У тебя нет простенького примерчика его исспользования(на уровне выполнения элементарного запроса)? Я только начинаю работать с Interbase и помощь профессионала была бы как нельзя кстати.
Не, я бы себя профи в Interbase API не назвал. Просто использую его, для одной задачки надо было, пришлось разобраться.
Ниже простенькая функция для извлечения из запроса целого поля. Я использую его для получения RecordCount таблицы.
bool __fastcall IbGetIntField(
TISC_DB_HANDLE &hDb,
const AnsiString &strQuery,
int &iResult)
{
void *hSt(NULL);
void *hTr(NULL);
long iaSt[20];
XSQLDA *sqlda(NULL);
long fetch_stat;
static char isc_tbp[] = {
isc_tpb_version3, isc_tpb_write, isc_tpb_concurrency, isc_tpb_wait};
if (isc_start_transaction(iaSt, &hTr, 1, &hDb, sizeof(isc_tbp), isc_tbp)) {
ERREXIT(iaSt, 1);
}
sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1));
sqlda->sqln = 1;
sqlda->sqld = 1;
sqlda->version = 1;
if (isc_dsql_allocate_statement(iaSt, (void**)&hDb, &hSt)) {
ERREXIT(iaSt, 1);
}
if (isc_dsql_prepare(iaSt, &hTr, &hSt, 0, strQuery.c_str(), 1, sqlda)) {
ERREXIT(iaSt, 1);
}
short flag0(0);
sqlda->sqlvar[0].sqldata = (char *) &iResult;
sqlda->sqlvar[0].sqltype = SQL_LONG + 1;
sqlda->sqlvar[0].sqlind = &flag0;
if (isc_dsql_execute(iaSt, &hTr, &hSt, 1, NULL)) {
ERREXIT(iaSt, 1);
}
if (isc_dsql_fetch(iaSt, &hSt, 1, sqlda)) {
ERREXIT(iaSt, 1);
}
if (isc_dsql_free_statement(iaSt, &hSt, DSQL_close)) {
ERREXIT(iaSt, 1);
}
free(sqlda);
if (isc_commit_transaction(iaSt, &hTr)) {
ERREXIT(iaSt, 1);
}
return true;
}