Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQLite и С++, Давайте поработаем здесь 
:(
    Опции темы
Coocky
Дата 3.8.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Итак, скачал я 213 Кб файлов с расширением *.С и *.H
а так же билиотеку sqllite3.dll
Что делать дальше?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
sergejzr
Дата 3.8.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



 Да, много воды утекло с тех пор, как я последний раз брался за SQLite. Сорри, я конечно не мог знать, что они конкретно поменяли интерфейс. Но это не беда, конечно smile Я потихоньку начал разбираться заного. Всё уже работает, но только пока одним способом и пока без дллsmile

К сожалению в прошлый раз я дал тебе ссылочку на старую версию. Чтобы не топтаться на месте переходим на новейшую: http://www.sqlite.org/sqlite-source-3_2_2.zip

вот helloword'ик (работает, но будет ещё меняться)

Код

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

Теперь создаём проект. Самый быстрый способ:
Рспаковываем архив в папку.
Берём вышеописанный пример и сохраняем его в той же папке как (например) sergej.cpp
Открываем sergej.cpp в VC6 и просим закомпилить.
Компилер ругается на unresolved symbols. Открываем таб FileView и правой кнопкой мыши в меню выбираем "add Files to Project". Забираем ВСЕ *.с файлы кроме: shell.c и tclsqlite.c.

Компилируем.
Всё!

Как альтернативу, подсоеденю готовый проект. 

Присоединённый файл ( Кол-во скачиваний: 102 )
Присоединённый файл  sqlite_sergej.z.zip 656,63 Kb


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 3.8.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Вот тоже неплохой пример работы. Там так же описываются примеры работы вторым способом - через sqlite3_prepare() sqlite3_step()
http://www.adp-gmbh.ch/sqlite/bind_insert.html
Таким образом можно забирать результат строка за строкой.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Kurt
Дата 4.8.2005, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Кстати, кто-то мне говорил, что в SQLite проблемы с удалением записей - приходилось копировать таблицу, убивать и заново воссоздавать.
В новых версиях SQLite эта проблема решена?

P.S. Сории за оффтоп, просто интересно очень..


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
sergejzr
Дата 4.8.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Kurt @ 3.8.2005, 23:32)
Кстати, кто-то мне говорил, что в SQLite проблемы с удалением записей - приходилось копировать таблицу, убивать и заново воссоздавать.
В новых версиях SQLite эта проблема решена?

smile Это в любой базе проблема. одно дело запись удалить из базы, а другое дело физически с диска. Просто "нормальные" базы находятся где то далеко на сервере и юзер не задумывается о том, что становится с удалёнными записями, а в локальной штуке конечно становится подозрительным, что при удалении записей размер не меняется. Это всё конечно обязательно для скорости. Чтобы не перелопачивать всю структуру, при удалении запись лишь помечается как удалённая.
Проблема сводится к вырезанию части контента из файла. Так что решить её однозначно никогда и нигде не удастся.
Хотим удалить физически, надо переписывать файлы БД чтобы не оставалось там "пустых" мест.
В новой версии есть "autovacuum", который эту процедуру будет повидимому автомвтически делать. Я к сож. первый раз за 2 года за SQLite взялся, поэтому точно говорить не буду. Раньше это делалось коммандой "vacuum"


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coocky
Дата 4.8.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Так,
sergej.z, начинаю пробовать.
Думаю эта тема хорошо разовьется.
Сейчас проблема сохранения данных без привязки к установки базы-очень актуальна.
Раньше пользовались файлами DBF, но сейчас на них бесплатных библиотек нет.А в Инете много встречается просьб.SQLite-лучшая тому альтернатива.
Думаю, если хорошо пойдет, тема будет большой, и можно FAQ смело делать.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
Твой пример работает.
Только вот в 7 студии я не могу так сделать!
Пишет
Код

c:\Documents and Settings\Robert Blake\My Documents\Visual Studio Projects\TestSQl\where.c(1378): fatal error C1010: unexpected end of file while looking for precompiled header directive


Итак со всеми файлами..


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
sergejzr
Дата 4.8.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



ээээ седьмой у меня нет. И не будет smile. Сказать ничего не могу.
Это компилерские приколы. А может она вообще си не понимает?
Можно в либу скомпилить конечно.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coocky
Дата 4.8.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



B в смысле библиотеку подключить sqlite3.dll?
А пример под либу можешь преписать? smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Так Сережа, работаем дальше!
Для тех , кто не понял, добавлякм файлы...
Project->Add Existing Item, и выбираю файлы с расширеним *.C, как писал sergej.z
А потом в свойствах проекта делаем
Цитата
C\C++ -> Precompiled Headers -> Not Using Precompiled Headers

Все работает.. smile
Итак, дальше..
Попробоввал я в коде сделать
Код

argv[1]=" Dima.db";

Появилась библиотека
Dima.dll
Я так понял это моя база?
Добавлено @ 12:58
Вообще,sergej.z,
может вкратце описать создание базы, открытие, выполнение всех запросов, закрытие smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
DENNN
Дата 4.8.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Цитата
unexpected end of file while looking for precompiled header directive

Может быть простой Rebuild All помог бы?
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



DENNN
Нет, это проблема в файлах, потому, что они на С написаны, а не на С++


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Итак давйте для начала возьмем три кита
sqlite3_open()-Открывает/создает базу данных

sqlite3_exec() -Выполняет запрос.Весь синтаксис у них описан...

sqlite3_close()-Собсвтенно закрывает базу..
Ну что,sergej.z, давай потренируемся на создании трех таблиц..
Я предлагаю это тебе, хотя буду пробывать сам smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Так, все нормально, теперь вопрос, как ходить по записям, кроме как
int myCallback(void*,int,char**, char**);



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Первые проблемы..
Не отрабатывает функция в классе
Код

int ListBox(void*,int,char**, char**);


......
......
......
......
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{

char *zErrMsg = 0;
int i=sqlite3_exec(theApp.db, "SELECT URL FROM Project;",ListBox,&m_wndDlgBar,&zErrMsg);


return 0;
}

ListBox(void *NotUsed, int columns, char **pazValue, char **pazColName)
{
    CDialogBar*dlg=(CDialogBar*)NotUsed;
int i;
 for(i=0; i<columns; i++){
    CComboBox*cmb=(CComboBox*) dlg->GetDlgItem(IDC_COMBO1);
    cmb->AddString(pazValue[i]);
 }

return 0;
}




Все нормально i, возвращает ноль, а вот до функции дело не доходит...

Это сообщение отредактировал(а) Coocky - 4.8.2005, 16:51


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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




Нет, тут есть проблемка, все таки, запросы правильные...
Серега, ты хоть отвечай, а то я сам с собой болтаю....

Это сообщение отредактировал(а) Coocky - 4.8.2005, 17:53


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 4.8.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
А вот действительно проблема
И так, запускаем твою прогу первый раз.Все нормально..
Теперь коменнтируем добавление записей..Я их удалю
Код

#include <stdio.h>
#include "sqlite3.h"

int myCallback(void*,int,char**, char**);
int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

char * Name="Base";

    rc = sqlite3_open(Name,&db);

  rc=sqlite3_exec(db, "select * from test;", myCallback, NULL, &zErrMsg);
 if(rc!=SQLITE_OK)
  {
      printf( "%s\n", zErrMsg);
      return 1;
     }

  
   sqlite3_close(db);
  return 0;
}

static int myCallback(void *NotUsed, int columns, char **pazValue, char **pazColName){
 int i;
 for(i=0; i<columns; i++){
  printf("%s(%s)=%s |",pazColName[i],pazColName[i+columns],pazValue[i] ? pazValue[i]:"NULL");
 }
 printf("\n");

 return 0;


Вот тут и проблема, записи все пустые, такое ощущение, что все перезаписывется, в чем проблема?

Это сообщение отредактировал(а) Coocky - 4.8.2005, 17:50


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
sergejzr
Дата 4.8.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Привет smile Я отвечать могу только рано утром и поздно вечером smile Уж сорри smile

Цитата(Coocky @ 4.8.2005, 16:48)
sergej.z
А вот действительно проблема
И так, запускаем твою прогу первый раз.Все нормально..
Теперь коменнтируем добавление записей..Я их удалю

Нет, всё нормально. Просто надо после добавления выполнить commit. Тогда все изменения действительно войдут в силу.
Я исправил код - пример. Обрати внимание на добавленный:
Код

/*
Добавлено!!!!!!
Commit - база перенимает все изменения
*/
rc=sqlite3_exec(db, "commit;", NULL, NULL, &zErrMsg);


Это главное. теперь пройдусь по предыдущим постам smile

Цитата(Coocky @ 4.8.2005, 11:19)
B в смысле библиотеку подключить sqlite3.dll?
А пример под либу можешь преписать? smile

Либу чтобы подключить, ничего переписывать не надо. Она ведь тоже самое, что и скомпилленые обьекты.
А вот чтобы длль подсоеденить, надо ессно писать подгрузку функций из неё. Если время будет, добавлю так же.

Цитата(Coocky @ 4.8.2005, 11:55)
Появилась библиотека
Dima.dll
Я так понял это моя база?

Ты имеешь ввиду понвился файл Dima.db smile
Да, это и есть файл базы.

Цитата(Coocky @ 4.8.2005, 11:55)
Вообще,sergej.z,
может вкратце описать создание базы, открытие, выполнение всех запросов, закрытие smile

Дык в примере вроде всё описано в комментарах
Цитата(Coocky @ 4.8.2005, 13:18)
Так, все нормально, теперь вопрос, как ходить по записям, кроме как
int myCallback(void*,int,char**, char**);

sqlite3_prepare(), sqlite3_step(). Примеры по линьку, который я давал в одном из первых сообщений. Время будет, добавлю свой пример. Пока очень занят..

Цитата(Coocky @ 4.8.2005, 15:49)
Все нормально i, возвращает ноль, а вот до функции дело не доходит...

Наверное записей нет таких.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coocky
Дата 5.8.2005, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
Держи плюс smile
Да, и еще забыл спросить, нормально будет работать со статической компоновкой?
Я вроде у других проверял, так файл без расширения dll...
И еще,sergej.z, я что-то плохо понимаю, но не нахожу техх нюансов , в мануале, типа commit...
Если можно, напиши, а я пока по MFC пройдусь smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
sergejzr
Дата 5.8.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Coocky @ 5.8.2005, 10:13)
Да, и еще забыл спросить, нормально будет работать со статической компоновкой?

Да, конечно. У всего есть свои плюсы и минусы. например Длльку можно будет быстро заменить при апдейте, за это надо её всегда за собой таскать + подгружать каждый раз. Статическая компоновка позволит сделать один файл, но при обновлении самой SQLite Всё надо будет заного компилить. Хотя конечно, если тебя сегодняшняя версия устраивает, зачем вообще обновлять? smile
Цитата(Coocky @ 5.8.2005, 10:13)
И еще,sergej.z, я что-то плохо понимаю, но не нахожу техх нюансов , в мануале, типа commit...

Ну это вообще то теория баз данных. С библиотекой имеет мало общего, разве что последняя её имплементирует.
begin-> начало трансакции commit -> конец трансакции. Это в любой нормальной БД. Почитай какую нибудь литературу по теории БД.






--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 5.8.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Итак пример первый теперь с возможностью динамической подгрузки и использования sqlite3_step();(пример 2)
Осталась небольшая непонятка. В callback поидее с расстоянием в columns должны лежать типы данных. Но это не так. Где их там взять - ума не приложу. sqlite3_step работает отлично. Да и я бы его рекомендовал конечно вместо callback. И интерфейс его в этой версии намного удобней 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
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coocky
Дата 5.8.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
Найди ошибку...
(не создается первичный ключ)
Код

// TestSQL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include "sqlite3.h"
#include <windows.h>
int myCallback1(void*,int,char**, char**);
int _tmain(int argc, _TCHAR* argv[])
{
sqlite3 *db;
  char *zErrMsg = 0;
  int rc;


char*name="Dima2.db";
  
 rc = sqlite3_open(name, &db);
 
 if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
   
    return 1;
  }
 
 printf( "%s\n", zErrMsg);

 


if(rc!=SQLITE_OK)
{
 printf( "%s\n", zErrMsg);
    return 1;
}



 rc=sqlite3_exec(db, "create table sites(Id integer auto_increment,proj_name string,primary key(\"Id\"));", NULL, NULL,NULL);
rc=sqlite3_exec(db, "begin;", NULL, NULL, &zErrMsg);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('Google');", NULL, NULL,NULL);


rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('Yahoo');", NULL, NULL,NULL);

rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('MSN');", NULL, NULL,NULL);

rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('Altheweb');", NULL, NULL,NULL);

rc=sqlite3_exec(db, "insert into sites (\"proj_name \") values ('Altavista');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('HotBot');", NULL, NULL,NULL);

rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('Teoma');", NULL, NULL,NULL);

rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values ('AOL');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "commit;", NULL, NULL, NULL);
 rc=sqlite3_exec(db, "select * from sites;", myCallback1, NULL, &zErrMsg);
 if(rc!=SQLITE_OK)
  {
      printf( "%s\n", zErrMsg);
      return 1;
     }

  
 
  return 0;
}

static int myCallback1(void *NotUsed, int columns, char **pazValue, char **pazColName){
 int i;
 for(i=0; i<columns; i++){
  printf("%s(%s)=%s |",pazColName[i],pazColName[i+columns],pazValue[i] ? pazValue[i]:"NULL");
 }
 printf("\n");


    return 0;
}




Это сообщение отредактировал(а) Coocky - 5.8.2005, 18:15


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
sergejzr
Дата 5.8.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Вообще в SQLite все типы - string.
И существует только int primary key.

Остальные декларации полей просто чисто для информации. Можешь туда писать что хочешь, всё игнорируется. Вообще, прежде чес работать с базой прочитай про Syntax.
А я пока попробую наваять тебе запросы smile
Добавлено @ 18:31
Так же SQLite сам генерит ID для просмотра тебе надо написать например:

select *,ROWID from ..... итд.
Добавлено @ 18:35
Когда добавляешь NULL вместо ключа, он генерится автоматом.
Вот так это надо делать:
Код


int myCallback1(void*,int,char**, char**);
int _tmain(int argc, char* argv[])
{
sqlite3 *db;
  char *zErrMsg = 0;
  int rc;
char*name="Dima2.db";
  
 rc = sqlite3_open(name, &db);
 
 if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
   
    return 1;
  }
 
 printf( "%s\n", zErrMsg);
 
if(rc!=SQLITE_OK)
{
 printf( "%s\n", zErrMsg);
    return 1;
}
 rc=sqlite3_exec(db, "create table project(Id integer primary key autoincrement,Name_proj string);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table blinks(Id integer primary key autoincrement,proj_name string,site_id integer,number string,data integer);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table ldomain(Id integer primary key autoincrement,proj_name string,site_id integer,number string,data integer);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table ipage(Id integer primary key autoincrement,proj_name string,site_id integer,number string,data integer);", NULL, NULL,NULL);    
rc=sqlite3_exec(db, "create table  curl(Id integer primary key autoincrement,proj_name string,site_id integer,number string,data integer);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table kranking(Id integer primary key autoincrement,site_id integer,key_id integer,number string,data integer);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table keywords(Id integer primary key autoincrement,key string);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "create table sites(Id integer primary key autoincrement,proj_name string);", NULL, NULL,NULL);
rc=sqlite3_exec(db, "begin;", NULL, NULL, &zErrMsg);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'Google');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'Yahoo');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'MSN');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'Altheweb');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name \") values (NULL,'Altavista');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'HotBot');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'Teoma');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "insert into sites (\"proj_name\") values (NULL,'AOL');", NULL, NULL,NULL);
rc=sqlite3_exec(db, "commit;", NULL, NULL, NULL);
 rc=sqlite3_exec(db, "select * from sites;", myCallback1, NULL, &zErrMsg);
 if(rc!=SQLITE_OK)
  {
      printf( "%s\n", zErrMsg);
      return 1;
     }
  
 
  return 0;
}
static int myCallback1(void *NotUsed, int columns, char **pazValue, char **pazColName){
 int i;
 for(i=0; i<columns; i++){
  printf("%s(%s)=%s |",pazColName[i],pazColName[i+columns],pazValue[i] ? pazValue[i]:"NULL");
 }
 printf("\n");
    return 0;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Coocky
Дата 5.8.2005, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
Спасибо!
Цитата

Вообще, прежде чес работать с базой прочитай про Syntax.

Не веришь, как я горю с проектом smile
Поэтому и пользуюсь этим топиком, в своих целях, а заодно и для других. smile
Кстати я тоже не стою на месте, и уже знаю ответы на многие вопросы при работе с SQLite в среде МФС ( а проблем хватает!), но они уже решены.. smile
Кстати, насчет скорости, сложные запросы еще не делал, а вот код при создании базы и таблиц немного подвисат. Не сильно, на секунду. но все же. Но думаю это в порядке вещей.. smile
Добавлено @ 22:00
Цитата
В callback поидее с расстоянием в columns должны лежать типы данных. Но это не так. Где их там взять - ума не приложу. sqlite3_step работает отлично.

Вообще-то callback-нормальный вариант, хотя немного неудобный, для каждого запроса(который отличается от предыдущего) приходится добавлять новую фукнцию, если я хочу присвоить другим переменным даные, хотя написав сво класс от этого можно избавится.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 6.8.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



sergej.z
а пример твой не рабочий... smile
Добавлено @ 11:03
А вот если NULL убрать, то рабочий.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Vatel
Дата 7.8.2005, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, пробовал компилировать helloword'ик, у меня не вышло.

Компилятор Borland C++ v.5.02
выдал такой вот Message

Info :Compiling D:\SQLProject\gendb.c
Warn : gendb.c(95,2):Parameter 'argc' is never used
Warn : gendb.c(76,2):'rc' is assigned a value that is never used
Warn : gendb.c(103,2):Parameter 'NotUsed' is never used
Warn : gendb.c(105,2):Undefined structure 'sqlite3'
Warn : gendb.c(105,2):Undefined structure 'sqlite3_stmt'
Warn : gendb.c(105,2):Undefined structure 'sqlite3_context'
Warn : gendb.c(105,2):Undefined structure 'Mem'
Info :Linking D:\SQLProject\gendb.exe
Error: Error: Unresolved external '_sqlite3_open' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_errmsg' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_exec' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_close' referenced from D:\SQLPROJECT\GENDB.OBJ

Подскажите в чем загвостка

Это сообщение отредактировал(а) Vatel - 7.8.2005, 06:45
PM MAIL   Вверх
sergejzr
Дата 7.8.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Coocky @ 6.8.2005, 10:01)
А вот если NULL убрать, то рабочий.. smile

Да, autoincrement не нужен NULL smile Это я перемудрил.


Vatel, пишет ведь,
Цитата(Vatel @ 7.8.2005, 05:37)
Error: Error: Unresolved external '_sqlite3_open' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_errmsg' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_exec' referenced from D:\SQLPROJECT\GENDB.OBJ
Error: Error: Unresolved external '_sqlite3_close' referenced from D:\SQLPROJECT\GENDB.OBJ

Я вверху уже писал, что *.с файлы надо добавлять в проект отдельно.
Цитата(sergej @ 3.8.2005, 19:20)
Компилер ругается на unresolved symbols. Открываем таб FileView и правой кнопкой мыши в меню выбираем "add Files to Project". Забираем ВСЕ *.с файлы кроме: shell.c и tclsqlite.c

В Бильдере естественно это не FileView , но в меню возможность добавки файлов конечно же имеется.

Для начала попробуйте запустить с ДЛЛь
Код

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

Сама sqlite3.dll должна лежать там же, где проект или в windows\system
PS: Прицепил обновлённый файл примера.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 8.8.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Ув. Vatel, когда скомпилите проект, выложите плиз helloword'ик сюда для примера smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Vatel
Дата 10.8.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, попробовал запустить исходничек с Dll, заработало.

Делал так: Создавал директорию, туда сбрасывал примерчик от 7.8.2005, 13:34 и Dll'ку.
(больше ничего делать не пришлось)


Сейчас сижу разбираюсь, вот состряпал по аналогии свой helloWorld'ик.
прога перебирающая все html-файлы в директории
на основе их сама заполняет БД, Можно вводить SQL - запросы с консоли результаты будут выводится в файл в html - формате.


Код

#include <windows.h>
#include <stdio.h>
#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 */

char outputBuff[14096]="<html><head><title>Result</title></head><body bgColor=#fff55f>";

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;
int init()
{
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;
}
void finish()
{
 if(SQLiteDLL!=NULL)
 FreeLibrary(SQLiteDLL);
}
//******************************************************************************
//
//Процедура извлечения из файла содержимого тега <Title>
//
//******************************************************************************
int GetTitleStr(char *Pach,char *Title){
HANDLE InFile;
char lpBuffer[1024];
DWORD BytesRead;
char tegname[]="Title";
char *ptr;
int q;
Title[0]=0;
InFile=CreateFile(Pach,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_TEMPORARY,NULL);
ReadFile(InFile,lpBuffer,1024,&BytesRead,NULL);
strupr(lpBuffer);strupr(tegname);
ptr = strstr(lpBuffer,tegname);
if(ptr==NULL)return 1;
while(ptr[0]!='>')
    {
   if(ptr>lpBuffer+BytesRead-2)return 1;
   ptr++;
   }
ptr++;
q=0;
while(ptr[0]!='<')
{
if(q==255)break;
if(ptr>lpBuffer+BytesRead-2)break;
Title[q]=ptr[0];
ptr++;
q++;
}
Title[q]=0;
return 0;
}
//******************************************************************************
static int myCallback(void *NotUsed, int columns, char **pazValue, char **pazColName){
 int i;
 char temp[300];
 strcat(outputBuff,"<Table cellSpacing=5 cellPadding=10  bgColor=#eeeeff border=3><tr>");
 for(i=0; i<columns; i++){
 //if(columns==)
 printf("%s |",pazValue[i]);
 sprintf(temp,"<td>%s</td>",pazValue[i]);
 strcat(outputBuff,temp);}
 printf("\n");
 strcat(outputBuff,"</tr></table>");
 //finish();
 return 0;}

int main(int argc, char **argv)
{
HANDLE hStdInputHandle,hStdOutputHandle,File,OutFile;
AllocConsole();
SetConsoleTitle("Finder");
hStdInputHandle=GetStdHandle(STD_INPUT_HANDLE);
hStdOutputHandle=GetStdHandle(STD_OUTPUT_HANDLE);
char s[255];
int q,w;
sqlite3 *db;
char *zErrMsg = 0;
int rc;
DWORD dw;
int i = 0;
char strTitle[255];
char strSourse[255];
char sqlText[200];
char strFileName[255]="D:\\*.htm";
char OutputFile[]="d:\\TempV.htm";
WIN32_FIND_DATA FindData;

if( init()!=0){ printf("DLL's not loaded ");getchar();return 1; }
rc = sqlite3_open("FilesDB.bd", &db);
 if( rc ){
           fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
           sqlite3_close(db);
         getchar();
           return 1;
           }
rc=sqlite3_exec(db, "create table Files(num integer,Pach string,Title string);", NULL, NULL, &zErrMsg);





//***********************************************************Заполнение Таблицы.
rc=sqlite3_exec(db, "begin;", NULL, NULL, &zErrMsg);
File=FindFirstFile(strFileName,&FindData);
if(File!=INVALID_HANDLE_VALUE)
    {
   GetTitleStr(FindData.cFileName,strTitle);
   sprintf(sqlText,"insert into Files values(%i,'%s','%s');",i,FindData.cFileName,strTitle);
   rc=sqlite3_exec(db, sqlText, NULL, NULL, &zErrMsg);
   i++;
   if(rc!=SQLITE_OK){ printf( "%s\n", zErrMsg);}
   while(FindNextFile(File,&FindData))
      {
         GetTitleStr(FindData.cFileName,strTitle);
         sprintf(sqlText,"insert into Files values(%i,'%s','%s');",i,FindData.cFileName,strTitle);
         rc=sqlite3_exec(db, sqlText, NULL, NULL, &zErrMsg);i++;
            if(rc!=SQLITE_OK){ printf( "%s\n", zErrMsg); break;   }
         }
   }
rc=sqlite3_exec(db, "commit;", NULL, NULL, &zErrMsg);
//*****************************************************************************


   printf("Find?: >");
   gets(s);
  // q=0;w=q;
  //DeleteFile(OutputFile);
   OutFile=CreateFile(OutputFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,NULL,NULL);

 rc=sqlite3_exec(db, s, myCallback, NULL, &zErrMsg);
//  rc=sqlite3_exec(db, "select * from files where num >6", myCallback, NULL, &zErrMsg);
 if(rc!=SQLITE_OK)  {      printf( "%s\n", zErrMsg);    getchar();  return 1;     }
 strcat(outputBuff,"</body></html>\n");

 printf("\n%s",outputBuff);

 WriteFile(OutFile,outputBuff,strlen(outputBuff),&dw,NULL);
 CloseHandle(OutFile);

 // Здесь будет код заставляющий Inet-Browser отобразить сгенерированный нами файл.



  getchar();
  sqlite3_close(db);
  finish();
  return 0;
}

PM MAIL   Вверх
sergejzr
Дата 10.8.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Прекрасно! Рад, что получилось smile
Всё же попробуйте статиком скомпилить, чтобы длльку не таскать за собой (в этом конечно большое преимущество SQLite)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Vatel
Дата 11.8.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, пытался более подробно разобраться с
примерчиком от 7.8.2005, 13:34 и наткнулся на такие строки

Код

typedef struct sqlite3 sqlite3;


я так понял это описание ползовательского типа данных, но оно какоето непонятное,
вот если бы я увидел нечто вроде
Код

typedef struct
    {
    ...
    описание структуры;
    и т.д.;
    ...
    } sqlite3;


то до меня бы дошло, а вот

Код

typedef struct sqlite3 sqlite3;

ни как в голове не укладывается.
Обьясните плиз чего это значит то (или хотябы ссылку на доки дайте).

Это сообщение отредактировал(а) Vatel - 11.8.2005, 13:17
PM MAIL   Вверх
sergejzr
Дата 11.8.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Непрозрачная структура. Просто обьявление, что такой тип данных где то в программе определён.
Так как поля этой структуры не используются в нашем коде, их и не нужно определять.

Мы пользуемся функциями возвращающими этот указатель и передаём его опять же в функции. Самим указателем мы не пользуемся.
PS:
это как обьявление:
Код

class MyClass;



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
patison
Дата 31.1.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Скачал я архив с хидерами и .c-файлами. Но подключать всё это к проекту, по некоторым причинам, не очень удобно. Если я правильно понял, я могу не подключать к своему проекту все .h и .c, а могу использовать dll, из предложенного архива. 
Объясните пожалуйста, как мне прилинковать функции из длл к проекту. (надеюсь, прально выразился smile)
Спасибо за помощь
PM MAIL   Вверх
sergejzr
Дата 31.1.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Выше находится пример кода с описанием и комментами. Необходимо будет только в проекте только sqlite.h. ДЛЛ динамически подгружается во время работы программы.
Кстати не уверен точно, но вроде бы в этой теме архив цеплял с работающим примером даже.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
patison
Дата 1.2.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, Сергей! Я действительно не обратил внимание на приведенный выше пример. Теперь всё работает! smile
PM MAIL   Вверх
wotker
Дата 17.2.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 18.7.2006
Где: Ростов-на-Дону

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



Хочу вытащить некоторые поля из базы данных firefox-а. ее имя mozStorage.db.
 rc = sqlite3_open("mozStorage.db", &db); 
 rc = sqlite3_exec(db, "SELECT Title, FROM moz_history;", callback, 0, &zErrMsg);

Появляются след. вопросы:
mozStorage не виден. rc равен нулю. тоесть создается новая db. 
Вопрос такой: как узнать что создается новая база данных, а не используется старая? 
И как увидеть список  всех баз данных на компьютере?

--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
sergejzr
Дата 17.2.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(wotker @  17.2.2008,  15:51 Найти цитируемый пост)
И как увидеть список  всех баз данных на компьютере?

Вы должны понимать, что база данных SQLite - обыкновенный файл. Поэтому список всех баз на компьтере можно получить толъко проверив последовательно каждый файл на диске на наличие формата SQLite. 

Цитата(wotker @  17.2.2008,  15:51 Найти цитируемый пост)
mozStorage не виден. rc равен нулю. тоесть создается новая db. 

Надо указывать полный путь к файлу


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergex
Дата 20.2.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем кто написал данный топик, который  мне очень помог,  благодаря ему разобрался в азах работы с sqlite . В ходе работы возник  вопрос: есть БД в которой 2 таблицы table1 и table2, опишите в двух словах как можно осуществить поиск по базе в общем и для каждой таблицы в частности и как можно обработать результать.

Это сообщение отредактировал(а) sergex - 20.2.2008, 22:35
PM MAIL   Вверх
sergejzr
Дата 21.2.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Что конкретно непонятно по ссылке?




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergex
Дата 21.2.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В ссылке я разглядел режим создания, добавления и удаления забисей в БД
Интересует описание функции которая возвращала бы список всех таблиц в базе, а так функции которая бы искала определенное значение в определенном столбце определенной таблицы и возвращала строку результата из этой таблийцы,  предполагаю что это можно сделать через функцию sqlite3_exec но какие передавать при этом параметры не соображу.
PM MAIL   Вверх
sergejzr
Дата 21.2.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(sergex @  21.2.2008,  12:30 Найти цитируемый пост)
Интересует описание функции которая возвращала бы список всех таблиц в базе

Вообще всё, что может API описано в примере. Остально делается с помощью SQL
Код

SELECT * FROM sqlite_master WHERE type = "table"


Это возвратит названия всех таблиц в базе.


Цитата(sergex @  21.2.2008,  12:30 Найти цитируемый пост)
а так функции которая бы искала определенное значение в определенном столбце определенной таблицы и возвращала строку результата из этой таблийцы,


Код

SELECT * FROM ИМЯ_ТАБЛИЦЫ WHERE ОПРЕДЕЛЁННЫЙ_СТОЛБЕЦ=ИСКОМОЕ_ЗНАЧЕНИЕ


Это?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergex
Дата 21.2.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получается описание функции которая возвращала бы список всех таблиц в базе выглядит так?
Код

sqlite3_exec(db, "SELECT * FROM sqlite_master WHERE type = "table";", callback, 0, &zErrMsg);


а результат находится в функции callback?
 
Тогда вопрос - результат запроса SELECT * FROM sqlite_master WHERE type = "table" представляет собой массив строк находящийся в массиве rows функции callback ? 


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


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(sergex @  21.2.2008,  14:04 Найти цитируемый пост)
Тогда вопрос - результат запроса SELECT * FROM sqlite_master WHERE type = "table" представляет собой массив строк находящийся в массиве rows функции callback ? 

да. Можно распечатать и посмотреть.
Но мой совет не пользоваться callback, а троицей prepare/step/finalize это удобнее и более контролируемо. В примере это показано после коммента "//произведём SELECT способом 2:"




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergex
Дата 21.2.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за быстрый и содержательный ответ. smile 
Ушел учить синтаксис SQL запросов
PM MAIL   Вверх
Alca
Дата 17.4.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



A SQLite с блобами дружит?


--------------------
PM WWW ICQ Skype Jabber   Вверх
sergejzr
Дата 17.4.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Alca @  17.4.2009,  15:23 Найти цитируемый пост)
A SQLite с блобами дружит? 

SQLite дружит исключительно со строками. Если желаете хранить БЛОБ, надо будет сперва байты кодировать например в base64 и при получении раскодировать обратно  (можно конечно свой обработчик подвесить и облегчит часть процессов).




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Alca
Дата 17.4.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



smile буду знать, спасибо

Добавлено через 57 секунд
Есть ли готовые классы для работы с SQLite?


--------------------
PM WWW ICQ Skype Jabber   Вверх
SenkraD
Дата 21.4.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Это пойдёт?


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Alca
Дата 21.4.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Это пойдёт?

Сейчас гляну.


--------------------
PM WWW ICQ Skype Jabber   Вверх
needDrivers
Дата 12.5.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кто-нибудь пробовал пересобрать amalgamation с опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT?
Я не смог найти информации от том, как они собирают всё в один большой файл?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

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

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


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

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


 




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


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

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