Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.9.2008
Репутация: нет Всего: нет
|
Привет всем! такая вот задача... необходимо в BDS2006 освоить работу с SQLite через API. основная задача подключиться к файлу базы SQLite и получить в листвью данные из таблицы. есть рабочая аналогичная утилитка на том же BDS2006 для работы с MySQL так же через API? но не хватает знаний что бы её переделать... исчу  советчегов)) за одно постараюсь поглубже освоить Cpp.. сессия на носу.. пока шарился по темам в этом форуме нашел пример вот такой.. Код | #include <stdio.h> #include <windows.h> /* Конечно SQLite можно загрузить из DLL или же Link Lib(?). */ #define SQLITEDLL #ifdef SQLITEDLL #define SQLITE_OK 0 /* Successful result */ #define SQLITE_ERROR 1 /* SQL error or missing database */ #define SQLITE_ROW 100 /* sqlite_step() has another row ready */ #define SQLITE_DONE 101 /* sqlite_step() has finished executing */ #define SQLITE_DENY 1 /* Abort the SQL statement with an error */ #define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ typedef int (*sqlite3_callback)(void*,int,char**, char**); typedef struct sqlite3 sqlite3; typedef struct sqlite3_stmt sqlite3_stmt; typedef int (*sqlite3_close_dll)(sqlite3 *); typedef int (__cdecl * sqlite3_open_dll)( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); typedef int (__cdecl * sqlite3_exec_dll)( sqlite3*, /* An open database */ const char *sql, /* SQL to be executed */ sqlite3_callback, /* Callback function */ void *, /* 1st argument to callback function */ char **errmsg /* Error msg written here */ ); typedef int (__cdecl * sqlite3_errcode_dll)(sqlite3 *db); typedef const char * (__cdecl * sqlite3_errmsg_dll)(sqlite3*); typedef int (__cdecl * sqlite3_prepare_dll)( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nBytes, /* Length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); typedef int (__cdecl * sqlite3_column_count_dll)(sqlite3_stmt *pStmt); typedef const void * (__cdecl * sqlite3_column_name_dll)(sqlite3_stmt*,int); typedef const char * (__cdecl * sqlite3_column_decltype_dll)(sqlite3_stmt*,int); typedef const unsigned char * (__cdecl * sqlite3_column_text_dll)(sqlite3_stmt*,int); typedef int (__cdecl * sqlite3_step_dll)(sqlite3_stmt*); typedef int (__cdecl * sqlite3_finalize_dll)(sqlite3_stmt *pStmt); sqlite3_exec_dll sqlite3_exec; sqlite3_open_dll sqlite3_open; sqlite3_close_dll sqlite3_close; sqlite3_errmsg_dll sqlite3_errmsg; sqlite3_prepare_dll sqlite3_prepare; sqlite3_step_dll sqlite3_step; sqlite3_finalize_dll sqlite3_finalize; sqlite3_column_count_dll sqlite3_column_count; sqlite3_column_name_dll sqlite3_column_name; sqlite3_column_decltype_dll sqlite3_column_decltype; sqlite3_column_text_dll sqlite3_column_text; HINSTANCE SQLiteDLL; #else #include "sqlite3.h" #endif int myCallback(void*,int,char**, char**); int init(); void finish(); int main(int argc, char **argv){ sqlite3 *db; char *zErrMsg = 0; int rc; if( init()!=0) { printf("DLL's not loaded "); return 1; } /*arg1: Моя_БД.db есть файл БД. Если его несуществует, SQLite сама его создаст. arg2: указатель на структуру нашего БД ../Где_Угодно/Моя_БД.db */ // argv[1]="test.bd"; rc = sqlite3_open(argv[1], &db); /* Если было невозможно создать файлик то rc содержит номер ошибки. */ if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } /* Всё в порядке, можно работать! В SQLite существует два способа получения результата БД. 1. exec/callback Функция callback будет вызываться SQLite с каждой строкой от ResultSet'a Чем то похоже Listener на в JAVA 2. compile/step/finalize в этом случае можно забирать ResultSet строка за строкой Пока не разобрался с новой версией :) */ /* рассмотрим sqlite_exec arg1: Наша БД arg2: SQL statement arg3: Функция callback (Здесь нам не нужна). arg4: Аргумент, который будет передаваться в функцию callback. Например вектор, в который мы хотим добавлять результат, или вообще указатель на какой нибудь обьект (Здесь нам не нужeн). arg5: Сообщение об ошибке. Его можно распечатать, но только если возвращённый rc!=0. Накидаем табличку */ rc=sqlite3_exec(db, "create table test(num integer,name string);", NULL, NULL, &zErrMsg); /* if(rc!=SQLITE_OK) { printf( "%s\n", zErrMsg); return 1; } */ /* При импорте данных очень важно начать с begin иначе БД будет тормозить. Обьяснение: Все записи будут осуществляться в памяти и только с commit писаться на диск. После этого SQLite проверит, всё ли записано правильно. Без beginn'a это будет осуществляться при каждой записи */ rc=sqlite3_exec(db, "begin;", NULL, NULL, &zErrMsg); for(int i=0;i<10;i++) { /* На оригинальность не претендую :) */ char sqlText[200]; sprintf(sqlText,"insert into test values(%i,'name_%i');",i,i); rc=sqlite3_exec(db, sqlText, NULL, NULL, &zErrMsg); if(rc!=SQLITE_OK) { printf( "%s\n", zErrMsg); break; } } /* Добавлено!!!!!! Commit - база перенимает все изменения */ rc=sqlite3_exec(db, "commit;", NULL, NULL, &zErrMsg); /* произведём селект способом 1: */ printf("\n exec/callback \n"); rc=sqlite3_exec(db, "select * from test;", myCallback, NULL, &zErrMsg); if(rc!=SQLITE_OK) { printf( "%s\n", zErrMsg); return 1; } /* произведём SELECT способом 2: */ const char *sqlText="select * from test;"; /* ppVm непрозрачная структура виртуальной машины. В некоторых случаях я исползьовал несколько таких машин, чтобы опрашивать несколько разных ResultSet'ов. */ sqlite3_stmt *ppVm; /* рассмотрим sqlite_compile arg1:Наша БД arg2:SQL statement arg3:Длинна запроса. Если -1, то SQLite сама определит её arg4:Виртуальная машинка. arg5:Остаток запроса после выполнения. */ rc=sqlite3_prepare(db, sqlText,-1,&ppVm,&sqlText); if(rc!=SQLITE_OK) { printf( "%s\n", zErrMsg); return 1; } printf("\n compile/step/finalize \n"); /*sqlite3_column_count отдаст количество колонок в результате*/ int colcount=sqlite3_column_count(ppVm); /* рассмотрим sqlite_step arg1:Виртуальная машинка Она везде передаётся. Таким образом можно выполнять кучу запросов одновременно. */ while(sqlite3_step(ppVm)!=SQLITE_DONE) { for(int i=0;i<colcount;i++) { printf("%s(%s)=%s |",sqlite3_column_name(ppVm,i), sqlite3_column_decltype(ppVm,i), sqlite3_column_text(ppVm,i)); } printf("\n"); } /*destructor Виртуальной машины*/ rc=sqlite3_finalize(ppVm); sqlite3_close(db); finish(); return 0; } static int myCallback(void *NotUsed, int columns, char **pazValue, char **pazColName){ int i; for(i=0; i<columns; i++){ /* Раньше был отступ в columns для типов данных..Сейчас вроде по другому, но как, пока не разобрался.. */ printf("%s(%s)=%s |",pazColName[i],pazColName[i+columns],pazValue[i] ? pazValue[i]:"NULL"); } printf("\n"); finish(); return 0; } int init() { #ifdef SQLITEDLL HINSTANCE SQLiteDLL = LoadLibrary("sqlite3.dll"); sqlite3_exec=((sqlite3_exec_dll) GetProcAddress (SQLiteDLL, "sqlite3_exec")); sqlite3_open=((sqlite3_open_dll) GetProcAddress (SQLiteDLL, "sqlite3_open")); sqlite3_step=((sqlite3_step_dll) GetProcAddress (SQLiteDLL, "sqlite3_step")); sqlite3_finalize=((sqlite3_finalize_dll) GetProcAddress (SQLiteDLL, "sqlite3_finalize")); sqlite3_close=((sqlite3_close_dll) GetProcAddress (SQLiteDLL, "sqlite3_close")); sqlite3_errmsg=((sqlite3_errmsg_dll) GetProcAddress (SQLiteDLL, "sqlite3_errmsg")); sqlite3_prepare=((sqlite3_prepare_dll) GetProcAddress (SQLiteDLL, "sqlite3_prepare")); sqlite3_column_count=((sqlite3_column_count_dll) GetProcAddress (SQLiteDLL, "sqlite3_column_count")); sqlite3_column_name=((sqlite3_column_name_dll) GetProcAddress (SQLiteDLL, "sqlite3_column_name")); sqlite3_column_decltype=((sqlite3_column_decltype_dll) GetProcAddress (SQLiteDLL, "sqlite3_column_decltype")); sqlite3_column_text=((sqlite3_column_text_dll) GetProcAddress (SQLiteDLL, "sqlite3_column_text")); return SQLiteDLL==NULL ? 1:0; #endif return 0; } void finish() { #ifdef SQLITEDLL if(SQLiteDLL!=NULL) FreeLibrary(SQLiteDLL); #endif }
|
в принципе все что нужно.. и конект и получение данных.. все есть.. только вот не могу перенести под биддер...  .. нуб что тут скажешь очень надеюсь на вас.. Вот ссылка на тему откуда взял код примера работы с SQLite на С++ ссылкаЭто сообщение отредактировал(а) AleAle - 15.9.2008, 16:11
|