Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > FireBird + Си? Нужна помощь с туториалами..


Автор: Kurt 7.7.2005, 01:30
Хотелось бы опробовать связку FireBird+Cи (on Linux). Пытаюсь по примерам разобраться с FireBird'овым API, но что-то тяжко.
Может, кто-нибудь знает ссылку, где в виде туториала (или еще как-нить доступно) описано, как общатьсся с FireBird на Си?

Автор: g-m 7.7.2005, 07:30
http://www.firebirdsql.org/index.php?op=doc&id=userdoc

-------
InterBase 6.0 manuals
-------
API Guide

А лучше скачай все 7 томов...

Что будет не понятно, пиши на nik_x at hotbox.ru
Если будет не сильно в напряг - помогу...

Автор: Kurt 7.7.2005, 19:09
OK, скачаю. Спасибо. Только чуток позже - сейчас много народу через один модем сидят, мнее просто не дадут такой возможности. smile
..
Может, у кого сохранились собственные поделки и первые шаги на поприще FireBird+Cи?
Было бы очень интересно посмотреть. smile

Автор: g-m 8.7.2005, 12:28
Примерчик - небольшой - лови...
Правда посано под 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.

Автор: Kurt 9.7.2005, 00:08
Благодарю. Буду разбираться.
Одна просьба.. Если не затруднит, пользуйся тегом [code=cpp] - так код легче читается. smile

Автор: maddoc 6.7.2007, 14:08
может кто использовал пример выше?
подскажите как подсоеденится с его помощью к сетевой БД. спасибо.

Автор: Rodman 6.7.2007, 14:16
а вот в это строке путь к ней не можешь задать?
Код

char *DBName = "c:\\i\\i.fdb";

Автор: maddoc 6.7.2007, 14:28
я это понимаю, но как?
я перепробовал уже много вариантов но они не отрабатывают.

Автор: xgm 5.8.2007, 16:27
2: Kurt http://booksforall.ru/view_607.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)