Страница 2 из 3

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

СообщениеДобавлено: 26.07.2010 21:52:55
Padre_Mortius
можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?

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

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

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

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

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

СообщениеДобавлено: 27.07.2010 09:25:05
debi12345
FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный".

Ща-а-с :)
Текстовый редактор с сохранением в UTF8 + компиляция таких исходников с опцией "-Fcutf8".

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

СообщениеДобавлено: 27.07.2010 11:11:49
Odyssey
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.

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

СообщениеДобавлено: 27.07.2010 11:32:33
Padre_Mortius
Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String

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

СообщениеДобавлено: 27.07.2010 11:46:14
Odyssey
Padre_Mortius писал(а):Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String

Вообще говоря, Utf8String есть и в 2.4.0, и даже раньше, при этом везде он эквивалентен AnsiString.

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

СообщениеДобавлено: 27.07.2010 14:59:41
modjo
Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

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

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


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

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

СообщениеДобавлено: 27.07.2010 15:23:42
Odyssey
http://www.webmasterworld.com/forum88/5049.htm
И наверное это зависит от СУБД.

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

СообщениеДобавлено: 27.07.2010 21:33:45
Nik
update users set username=username+" егоров" where uid="1"

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


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

Если вы для себя с первого взгляда плюсов не нашли, скорее всего для вас их просто нет. Подбирал/изменял под себя - если кому-то ещё он пригодится, пользуйтесь, если нет - стандартный компонент Lazarus никуда не делся :)
Что касается версии библиотеки, то всё проверено на версиях 3.6.x. Буквально на днях вышла версия 3.7.0 - на ней ещё не проверял (только сегодня добрался до компа после недельного отпуска).

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

СообщениеДобавлено: 27.07.2010 22:29:35
evd
modjo писал(а):Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

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

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


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


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

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

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

СообщениеДобавлено: 28.07.2010 10:11:13
modjo
evd
Оно самое, спасибо!

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

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

Судя по этой ветке форума, работа с блобами в SQLite(3)DataSet всё же не поддерживается. Т.е. интерфейс есть, а реализации нет.

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

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

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

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

PS. Записать в файл, вроде бы как, получается через TFileStream (write(str^)), но пока нет внятных мыслей как эту массу прочитать обратно. Писать для каждой записи её размер?

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

СообщениеДобавлено: 13.05.2011 14:49:25
Vadim
Nik
TStringList не подойдёт?

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

СообщениеДобавлено: 13.05.2011 15:15:26
Nik
Vadim писал(а):Nik
TStringList не подойдёт?

А есть простой способ преобразовать TList в TStringList и обратно? Я, увы, не знаю такого :(