Простая БД на SQLite
Модератор: Модераторы
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Код: Выделить всё
SQLTransaction1.Active:=true;
SQLTransaction1.Commit;это выкинул
и далее
Код: Выделить всё
SQLite3Connection1.DatabaseName:='c:\test\test.db3';заменил левые слеши ( \ ) на правые ( /)
и все заработало
Добавлено спустя 5 минут 12 секунд:
и еще у меня не
Код: Выделить всё
Sqlite3Dataset1.Open;а
Код: Выделить всё
SQLite3Connection1.Connected:=True;-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
Код: Выделить всё
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 ' "
wofs писал(а):и еще у меня не
Sqlite3Dataset1.Open;
а
SQLite3Connection1.Connected:=True;
Это потому что у Вас совершенно другой компонент с другим функционалом работы. Не путайте человека.
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
Переделал все без использование TSql3Dataset, теперь ошибка: нет таблицы pers
Ссылка на проект.
в нем выполняется такой код:
Добавлено спустя 41 минуту 50 секунд:
Странно но с
работает...
Добавлено спустя 15 часов 37 минут 39 секунд:
Вернулся к прежнему варианту с Datasource и Sqlite3Dataset:
Такой вариант вроде работает и в консоль выводит то что надо, но почему то d DBGrid отображается вся таблица, хотя связанный с ней Datasource.Enabled установлен в false.
Ссылка на проект.
в нем выполняется такой код:
Код: Выделить всё
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.
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Это потому что у Вас совершенно другой компонент с другим функционалом работы. Не путайте человека.
да, простите... не посмотрел...
2 EatMyShorts
а чем обусловлен выбор компонента Sqlite3Dataset ?
--
на выходных покрутил sqlite3 в связке с SQLite3Connection1 - все работает прекрасно (добавлял, удалял, выбирал по условию, группировал)...
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
wofs
Ну мне показалось
проще добавить 1 компонент Sqlite3Dataset, вместо 3х: Connection, Transaction, SqlQuery.
Ну мне показалось
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
EatMyShorts писал(а):wofs
Ну мне показалосьпроще добавить 1 компонент Sqlite3Dataset, вместо 3х: Connection, Transaction, SqlQuery.
угу, зато заменив один только компонент - Connection
я смогу это приложение заставить работать с любой из существующих БД. без переделки кода.
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
угу, зато заменив один только компонент - Connection
я смогу это приложение заставить работать с любой из существующих БД. без переделки кода.
Переделка под другую БД не планирую. Но сейчас еще раз попробую с этими компонентами разобраться.
на выходных покрутил sqlite3 в связке с SQLite3Connection1 - все работает прекрасно (добавлял, удалял, выбирал по условию, группировал)...
Не могли бы вы поделиться со мной данными наработками
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Переделка под другую БД не планирую
я тоже раньше не планировал)) а когда приспичило - постратил кучу ночей на переделку кода... лучше смотреть на перспективу, но эт мое мнение
Не могли бы вы поделиться со мной данными наработками .
конечно, пример примитивный, но работает.
прикрепить не получилось (размер великова) - выложил на народе (~500кб) http://siri-us.narod.ru/wofs/lazarus_sqlite3/src.zip
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
конечно, пример примитивный, но работает
Спасибо, и правда просто разобраться и все понятно.
Но есть вопросик:
Бросил на форму еще кнопку и выполняю такй код для нее
Код: Выделить всё
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 добавить
Добавлено спустя 4 минуты 13 секунд:
А теперь немного не по базам вопрос. Подскажите пожалуйста какой-нить компонент для простого и удобного ведения лога.
И почему когда в приложении пытаюсь сделать так:
Код: Выделить всё
{$apptype console}
. . .
First;
while not Q2.EOF do begin
writeln( (FieldByName('ID').AsString) );
Next;
end;
программа падает.
А если просто writeln('Hello'); то все норм?
EatMyShorts писал(а):И почему когда в приложении пытаюсь сделать так:
{$apptype console}
. . .
First;
while not Q2.EOF do begin
writeln( (FieldByName('ID').AsString) );
Next;
end;
программа падает.
Потому что First и Next должны идти только как методы Q2, а не сами по себе.
Вдобавок, слово "падает" никому ни о чём не говорит. Мы ведь не умеем Ваши мысли читать. Да и подглядывать через внепространственный канал в Ваш монитор пока ещё никто не научился. Объясните как можно более подробно, что означает слово "падает".
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
Потому что First и Next должны идти только как методы Q2, а не сами по себе.
Моя вина, сократил код в сообщении, с ним все норм.
А падала она так
А когда поставил в модуле, где вызывался writeln {$apptype console} то стало выводиться. Но русские буквы не правильно выводит.
Пробовал ставить {$codepage utf8} - не помогло
EatMyShorts
Не пишите консольные приложения в Lazarus.
Lazarus работает с кодировкой UTF-8, а консоль в винде - либо cp866, либо (зависит от ключа запуска cmd.exe) с Unicode UTF-16. А вот UTF-8 консолька не поддерживает...
Я, например, для написания консольных приложений использую встроенный редактор FAR'а.
Можно в Lazarus'е в окне кода нажать правую кнопку мыши и выбрать в выпадающем меню "Параметры файла - Кодировки - СР866". ПРавда мне кажется удобней в FAR'е работать - вышел из редактора, откомпилировал, тут же запустил. Всё перед глазами.
Добавлено спустя 4 минуты 37 секунд:
{$ APPTYPE тип_приложения} задаёт тип создаваемого приложения - оконное или консольное. В Lazarus'е приложение по умолчанию именно оконное, поэтому надо обязательно задавать тип {$APPTYPE CONSOLE}.
Если писать сразу в консоле и компилировать в командной строке, там всё наоборот - тип приложения по умолчанию консольный, поэтому специально тип писать не надо.
Не пишите консольные приложения в Lazarus.
Я, например, для написания консольных приложений использую встроенный редактор FAR'а.
Можно в Lazarus'е в окне кода нажать правую кнопку мыши и выбрать в выпадающем меню "Параметры файла - Кодировки - СР866". ПРавда мне кажется удобней в FAR'е работать - вышел из редактора, откомпилировал, тут же запустил. Всё перед глазами.
Добавлено спустя 4 минуты 37 секунд:
{$ APPTYPE тип_приложения} задаёт тип создаваемого приложения - оконное или консольное. В Lazarus'е приложение по умолчанию именно оконное, поэтому надо обязательно задавать тип {$APPTYPE CONSOLE}.
Если писать сразу в консоле и компилировать в командной строке, там всё наоборот - тип приложения по умолчанию консольный, поэтому специально тип писать не надо.
-
EatMyShorts
- новенький
- Сообщения: 30
- Зарегистрирован: 06.10.2009 19:48:19
Ладно, фиг с ней с консолью, не очень пока надо. А вот с базой есть еще вопросы.
Итак имеем:
Sqlite3Connection связана с базой ('test.db')
SQLTransaction и SQLQuery связаны с этим TSqlite3Connection
DataSource, свойство Dataset которого устновлен SQLQuery
Так же на форме расположен DBNavigator, его свойство Datasource установлено в DataSource.
Во время выполнения программы все редактируется нормально, но при закрытии изменения не сохраняются.
Как я понял действия производятся над данными полученными в запросе SQLQuery('select * from table')
Вообщем как заставить нормально работать DBNavigator?
Итак имеем:
Sqlite3Connection связана с базой ('test.db')
SQLTransaction и SQLQuery связаны с этим TSqlite3Connection
DataSource, свойство Dataset которого устновлен SQLQuery
Так же на форме расположен DBNavigator, его свойство Datasource установлено в DataSource.
Во время выполнения программы все редактируется нормально, но при закрытии изменения не сохраняются.
Как я понял действия производятся над данными полученными в запросе SQLQuery('select * from table')
Вообщем как заставить нормально работать DBNavigator?
