Класс-обёртка для SQLite

Планы, идеология, архитектура и т.п.

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

Re: Класс-обёртка для SQLite

Сообщение Padre_Mortius » 26.07.2010 21:52:55

можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Класс-обёртка для SQLite

Сообщение Vadim » 27.07.2010 06:15:07

Odyssey писал(а):SQLiteTable3.pas, строка 120, используется тип TDate. В текущем релизе FPC 2.4.0 этот тип не определён в модуле System.

Odyssey писал(а):Там же, строка 173. UTF8String -- это тот же string

Граждане! Не смешивайте в одну кучу FPC и Lazarus!
String, типа UTF8 - это в Lazarus, а не в FPC. FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный". Вы убеждены, что если компиляция будет не в среде Lazarus, то с вашими строками ничего не случится без такого преобразования?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Класс-обёртка для SQLite

Сообщение debi12345 » 27.07.2010 09:25:05

FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный".

Ща-а-с :)
Текстовый редактор с сохранением в UTF8 + компиляция таких исходников с опцией "-Fcutf8".
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Класс-обёртка для SQLite

Сообщение Odyssey » 27.07.2010 11:11:49

Vadim писал(а):
Odyssey писал(а):Там же, строка 173. UTF8String -- это тот же string

Граждане! Не смешивайте в одну кучу FPC и Lazarus!
String, типа UTF8 - это в Lazarus, а не в FPC. FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный". Вы убеждены, что если компиляция будет не в среде Lazarus, то с вашими строками ничего не случится без такого преобразования?

Убеждён. В библиотеке есть такой код:
Код: Выделить всё
constructor TSQLiteDatabase.Create(const FileName: string);
...
utf8FileName := UTF8String(FileName);

Если заглянуть в <fpc>/source/rtl/inc/systemh.inc, то увидим:
Код: Выделить всё
UTF8String          = type ansistring;

В режиме {$H+} (который в данном случае включен) String = Ansistring, следовательно String = UTF8String, следовательно данное приведение типов не делает ровным счётом ничего, вне зависимости от того, откуда происходит компиляция (через IDE или чистым FPC). При этом код выглядит так, как будто автор хотел преобразовать входной String в кодировку utf-8. Поскольку реально этого не происходит, я и посоветовал убрать приведение, чтобы не вводить в заблуждение тех, кто не читает systemh.inc.

Более того, на данный момент приведение Utf8String(SomeStr) физически не может сделать никакого преобразования, поскольку не знает исходную кодировку SomeStr. Вот когда/если FPC будет "юникодный", и в строках будет храниться информация о кодировке, тогда эта конструкция, может быть, сработает, но не сейчас. Поэтому при работе с библиотекой в любом случае нужно самому позаботиться о том, чтобы FileName, передаваемый в конструктор, был в кодировке utf-8. Потому что именно эту кодировку ожидает SQLite.

Добавлено спустя 19 минут 18 секунд:
Padre_Mortius писал(а):можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?

Если имеются в виду отличия от SQLite(3)DataSet, то навскидку можно назвать:
* другой API, при отсутствии опыта работы с Dataset'ами он может оказаться проще;
* возможность работы с blob'ами (насколько я знаю, в Dataset'ах её нет); вот тут я ошибся, значит этот пункт вычёркиваем.
* это не компонент, а набор из двух классов -- "база данных" и "таблица".
Поддерживает версии SQLite начиная с 3.x точно, возможно работает для версий 2.x, только нужно помнить об изменении кодировки строк передаваемых через API.
Последний раз редактировалось Odyssey 27.07.2010 11:34:58, всего редактировалось 1 раз.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Класс-обёртка для SQLite

Сообщение Padre_Mortius » 27.07.2010 11:32:33

Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Класс-обёртка для SQLite

Сообщение Odyssey » 27.07.2010 11:46:14

Padre_Mortius писал(а):Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String

Вообще говоря, Utf8String есть и в 2.4.0, и даже раньше, при этом везде он эквивалентен AnsiString.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Класс-обёртка для SQLite

Сообщение modjo » 27.07.2010 14:59:41

Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:

Код: Выделить всё
update users set username=username+" егоров" where uid="1"


При таком подходе пишется 0 в ячейку.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Класс-обёртка для SQLite

Сообщение Odyssey » 27.07.2010 15:23:42

http://www.webmasterworld.com/forum88/5049.htm
И наверное это зависит от СУБД.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Класс-обёртка для SQLite

Сообщение Nik » 27.07.2010 21:33:45

update users set username=username+" егоров" where uid="1"

Не уверен, что такой запрос в случае с SQLite корректен (хотя сам не пробовал). Читайте документацию.


можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?

Если вы для себя с первого взгляда плюсов не нашли, скорее всего для вас их просто нет. Подбирал/изменял под себя - если кому-то ещё он пригодится, пользуйтесь, если нет - стандартный компонент Lazarus никуда не делся :)
Что касается версии библиотеки, то всё проверено на версиях 3.6.x. Буквально на днях вышла версия 3.7.0 - на ней ещё не проверял (только сегодня добрался до компа после недельного отпуска).
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Класс-обёртка для SQLite

Сообщение evd » 27.07.2010 22:29:35

modjo писал(а):Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:

Код: Выделить всё
update users set username=username+" егоров" where uid="1"


При таком подходе пишется 0 в ячейку.


Надо делать не сложение, а конкатенацию строк

Код: Выделить всё
update users set username=username || " егоров" where uid="1"
Аватара пользователя
evd
новенький
 
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда

Re: Класс-обёртка для SQLite

Сообщение modjo » 28.07.2010 10:11:13

evd
Оно самое, спасибо!
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Класс-обёртка для SQLite

Сообщение Odyssey » 05.11.2010 16:22:07

Odyssey писал(а):
Padre_Mortius писал(а):можно узнать плюсы данного компонента перед стандартным? .../quote]
...
* возможность работы с blob'ами (насколько я знаю, в Dataset'ах её нет); вот тут я ошибся, значит этот пункт вычёркиваем.
...

Судя по этой ветке форума, работа с блобами в SQLite(3)DataSet всё же не поддерживается. Т.е. интерфейс есть, а реализации нет.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Класс-обёртка для SQLite

Сообщение Nik » 13.05.2011 12:43:12

Возникла интересная проблема. Есть сабжевые компоненты (собственно, с другими примерно та же ситуация). Отправляем к базе запрос, скажем, типа "SELECT * FROM table". Результаты запроса лежат в таблице TSQLiteTable. Требуется каким-то образом сохранить эти результаты в файл, а затем загрузить их из файла в другой TSQLiteTable.

Своих методов для сохранения/загрузки данных у этого класса нет. Пока пытаюсь решить проблему путём работы с переменной fResults, которая хранит внутри класса TSQLiteTable результаты выборки. Сама эта переменная имеет тип TList, и хранит данные в виде разномастных указателей (pstring, pint64 и ещё нескольких).

Собственно, вопрос к знатокам: как все эти указатели записать в файл, а потом считать обратно так, чтобы получился точно такой же TList, какой был в оригинале? Возможно ли это вообще, или стоит копать в другую сторону?

PS. Записать в файл, вроде бы как, получается через TFileStream (write(str^)), но пока нет внятных мыслей как эту массу прочитать обратно. Писать для каждой записи её размер?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Класс-обёртка для SQLite

Сообщение Vadim » 13.05.2011 14:49:25

Nik
TStringList не подойдёт?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Класс-обёртка для SQLite

Сообщение Nik » 13.05.2011 15:15:26

Vadim писал(а):Nik
TStringList не подойдёт?

А есть простой способ преобразовать TList в TStringList и обратно? Я, увы, не знаю такого :(
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Пред.След.

Вернуться в Разработки на нашем сайте

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

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

Рейтинг@Mail.ru