Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQLite через API в BDS2006 помогите разобраться :), попытка переехать с Mysql на SQLite  
:(
    Опции темы
AleAle
Дата 15.9.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем!

такая вот задача... необходимо в BDS2006 освоить работу с SQLite через API.

основная задача подключиться к файлу базы SQLite  и получить в листвью данные из таблицы.

есть рабочая аналогичная утилитка на том же BDS2006 для работы с MySQL так же через API? но не хватает знаний что бы её переделать... smile 

исчу  smile  советчегов)) за одно постараюсь поглубже освоить Cpp.. сессия на носу..  smile 

пока шарился по темам в этом форуме нашел пример вот такой..

Код

#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
}


в принципе все что нужно.. и конект и получение данных.. все есть.. только вот не могу перенести под биддер... smile .. нуб что тут скажешь  smile 

очень надеюсь на вас..


Вот ссылка на тему откуда взял код примера работы с SQLite на С++

ссылка


Это сообщение отредактировал(а) AleAle - 15.9.2008, 16:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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