Простая БД на SQLite

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 17:31:13

вот он
У вас нет необходимых прав для просмотра вложений в этом сообщении.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 10.10.2009 17:45:19

Код: Выделить всё
   SQLTransaction1.Active:=true;
SQLTransaction1.Commit;

это выкинул
и далее
Код: Выделить всё
  SQLite3Connection1.DatabaseName:='c:\test\test.db3';

заменил левые слеши ( \ ) на правые ( /)
и все заработало :)

Добавлено спустя 5 минут 12 секунд:
и еще у меня не
Код: Выделить всё
Sqlite3Dataset1.Open;

а
Код: Выделить всё
SQLite3Connection1.Connected:=True;
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 17:57:29

Код: Выделить всё
     Sqlite3Dataset1.Open;
     try
     SQLite3Connection1.DatabaseName:='c:/test/test.db3';
     SQLite3Connection1.Connected := true;
     //SQLTransaction1.Active:=true;
     SQLite3Connection1.Open;
     sql.sql.add('SELECT DISTINCT name FROM pers');
     sql.ExecSQL;
     //SQLTransaction1.Commit;
     sql.open;
     sql.first;
     while not sql.EOF do
     begin
          writeln(sql.FieldByName('name').AsString);
          sql.next;
     end;

     except
       on E: Exception do
        writeln('error: '+E.message);
       end;

C этим кодом ошибка осталась: Unable to open file " ' test.db3 ' "
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 10.10.2009 18:42:25

wofs писал(а):и еще у меня не
Sqlite3Dataset1.Open;
а
SQLite3Connection1.Connected:=True;

Это потому что у Вас совершенно другой компонент с другим функционалом работы. Не путайте человека.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 18:43:46

Переделал все без использование TSql3Dataset, теперь ошибка: нет таблицы pers
Ссылка на проект.
в нем выполняется такой код:
Код: Выделить всё
try
     conn.DatabaseName:='c:/test/test.db3';
     conn.Connected := true;
     //SQLTransaction1.Active:=true;
     conn.Open;
     querry.sql.add('SELECT DISTINCT name FROM pers');
     querry.ExecSQL;
     //SQLTransaction1.Commit;
     querry.open;

     querry.first;
     while not querry.EOF do
     begin
          writeln(querry.FieldByName('name').AsString);
          querry.next;
     end;

     except
       on E: Exception do
        writeln('error: '+E.message);
       end;
end;


Добавлено спустя 41 минуту 50 секунд:
Странно но с
Код: Выделить всё
querry.sql.add('SELECT * FROM pers');

работает...

Добавлено спустя 15 часов 37 минут 39 секунд:
Вернулся к прежнему варианту с Datasource и Sqlite3Dataset:
Код: Выделить всё
datasrc.Enabled:=false;
dataset.FileName:='C:\test\test.db3';
dataset.PrimaryKey:='id';
dataset.Active:=true;
dataset.ExecSQL('select distinct surname from pers');
dataset.First;

while not dataset.EOF do
begin
     writeln(dataset.FieldByName('surname').AsString);
     dataset.next;
end;

//datasrc.Enabled:=true;
dataset.sql := 'select * from pers where id = 2';
dataset.ExecSQL;           

Такой вариант вроде работает и в консоль выводит то что надо, но почему то d DBGrid отображается вся таблица, хотя связанный с ней Datasource.Enabled установлен в false.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 12.10.2009 09:25:35

Это потому что у Вас совершенно другой компонент с другим функционалом работы. Не путайте человека.

да, простите... не посмотрел...
2 EatMyShorts
а чем обусловлен выбор компонента Sqlite3Dataset ?
--
на выходных покрутил sqlite3 в связке с SQLite3Connection1 - все работает прекрасно (добавлял, удалял, выбирал по условию, группировал)...
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 12.10.2009 10:59:18

wofs
Ну мне показалось :D проще добавить 1 компонент Sqlite3Dataset, вместо 3х: Connection, Transaction, SqlQuery.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 12.10.2009 11:07:48

EatMyShorts писал(а):wofs
Ну мне показалось :D проще добавить 1 компонент Sqlite3Dataset, вместо 3х: Connection, Transaction, SqlQuery.

угу, зато заменив один только компонент - Connection
я смогу это приложение заставить работать с любой из существующих БД. без переделки кода.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 12.10.2009 11:17:55

угу, зато заменив один только компонент - Connection
я смогу это приложение заставить работать с любой из существующих БД. без переделки кода.

Переделка под другую БД не планирую. Но сейчас еще раз попробую с этими компонентами разобраться.
на выходных покрутил sqlite3 в связке с SQLite3Connection1 - все работает прекрасно (добавлял, удалял, выбирал по условию, группировал)...

Не могли бы вы поделиться со мной данными наработками :) . Заранее благодарю
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 12.10.2009 11:37:27

Переделка под другую БД не планирую

я тоже раньше не планировал)) а когда приспичило - постратил кучу ночей на переделку кода... лучше смотреть на перспективу, но эт мое мнение :)
Не могли бы вы поделиться со мной данными наработками .

конечно, пример примитивный, но работает.
прикрепить не получилось (размер великова) - выложил на народе (~500кб) http://siri-us.narod.ru/wofs/lazarus_sqlite3/src.zip
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 12.10.2009 11:59:24

конечно, пример примитивный, но работает

Спасибо, и правда просто разобраться и все понятно.
Но есть вопросик:
Бросил на форму еще кнопку и выполняю такй код для нее
Код: Выделить всё
DS1.Enabled:=false;
//DBGrid1.DataSource := nil;
   with Q1 do begin
     close;
     sql.Clear;
     sql.Add('select distinct ID from table1');
     ExecSQL;
     //Open;
   end;   

Если оставить ExecSql; то DBGrid полностью очищается, если его убрать и поставить Open то в DBGrid выведется 1 колонка с ID.
А нужно чтобы таблица не обновилась, то есть в ней осталос все из 'SELECT * FROM table1'.
Или для такой ситуации нужен еще 1 SqlQuerry?

Добавлено спустя 17 минут 25 секунд:
И правда нужно было всего то 2ой Query добавить :P .

Добавлено спустя 4 минуты 13 секунд:
А теперь немного не по базам вопрос. Подскажите пожалуйста какой-нить компонент для простого и удобного ведения лога.
И почему когда в приложении пытаюсь сделать так:
Код: Выделить всё
{$apptype console} 
. . .
     First;
     while not Q2.EOF do begin
           writeln( (FieldByName('ID').AsString) );
           Next;
     end;     

программа падает.
А если просто writeln('Hello'); то все норм?
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 12.10.2009 13:32:25

EatMyShorts писал(а):И почему когда в приложении пытаюсь сделать так:
{$apptype console}
. . .
First;
while not Q2.EOF do begin
writeln( (FieldByName('ID').AsString) );
Next;
end;
программа падает.

Потому что First и Next должны идти только как методы Q2, а не сами по себе. ;)
Вдобавок, слово "падает" никому ни о чём не говорит. Мы ведь не умеем Ваши мысли читать. Да и подглядывать через внепространственный канал в Ваш монитор пока ещё никто не научился. Объясните как можно более подробно, что означает слово "падает".
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 12.10.2009 13:46:54

Потому что First и Next должны идти только как методы Q2, а не сами по себе.

Моя вина, сократил код в сообщении, с ним все норм.

А падала она так :lol: : project raised exception class RunError(103)
А когда поставил в модуле, где вызывался writeln {$apptype console} то стало выводиться. Но русские буквы не правильно выводит.
Пробовал ставить {$codepage utf8} - не помогло :( .
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 12.10.2009 15:38:48

EatMyShorts
Не пишите консольные приложения в Lazarus. :) Lazarus работает с кодировкой UTF-8, а консоль в винде - либо cp866, либо (зависит от ключа запуска cmd.exe) с Unicode UTF-16. А вот UTF-8 консолька не поддерживает...
Я, например, для написания консольных приложений использую встроенный редактор FAR'а.
Можно в Lazarus'е в окне кода нажать правую кнопку мыши и выбрать в выпадающем меню "Параметры файла - Кодировки - СР866". ПРавда мне кажется удобней в FAR'е работать - вышел из редактора, откомпилировал, тут же запустил. Всё перед глазами. :)

Добавлено спустя 4 минуты 37 секунд:
{$ APPTYPE тип_приложения} задаёт тип создаваемого приложения - оконное или консольное. В Lazarus'е приложение по умолчанию именно оконное, поэтому надо обязательно задавать тип {$APPTYPE CONSOLE}.
Если писать сразу в консоле и компилировать в командной строке, там всё наоборот - тип приложения по умолчанию консольный, поэтому специально тип писать не надо.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 12.10.2009 15:43:41

Ладно, фиг с ней с консолью, не очень пока надо. А вот с базой есть еще вопросы.
Итак имеем:
Sqlite3Connection связана с базой ('test.db')
SQLTransaction и SQLQuery связаны с этим TSqlite3Connection
DataSource, свойство Dataset которого устновлен SQLQuery
Так же на форме расположен DBNavigator, его свойство Datasource установлено в DataSource.
Во время выполнения программы все редактируется нормально, но при закрытии изменения не сохраняются.
Как я понял действия производятся над данными полученными в запросе SQLQuery('select * from table')
Вообщем как заставить нормально работать DBNavigator?
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru