Класс-обёртка для SQLite
Модератор: Модераторы
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?
Odyssey писал(а):SQLiteTable3.pas, строка 120, используется тип TDate. В текущем релизе FPC 2.4.0 этот тип не определён в модуле System.
Odyssey писал(а):Там же, строка 173. UTF8String -- это тот же string
Граждане! Не смешивайте в одну кучу FPC и Lazarus!
String, типа UTF8 - это в Lazarus, а не в FPC. FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный". Вы убеждены, что если компиляция будет не в среде Lazarus, то с вашими строками ничего не случится без такого преобразования?
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 раз.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String
Padre_Mortius писал(а):Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String
Вообще говоря, Utf8String есть и в 2.4.0, и даже раньше, при этом везде он эквивалентен AnsiString.
Я тут вопрос задал, но он наверное утонул в ваших размышлениях
Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:
При таком подходе пишется 0 в ячейку.
Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:
Код: Выделить всё
update users set username=username+" егоров" where uid="1"При таком подходе пишется 0 в ячейку.
http://www.webmasterworld.com/forum88/5049.htm
И наверное это зависит от СУБД.
И наверное это зависит от СУБД.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
update users set username=username+" егоров" where uid="1"
Не уверен, что такой запрос в случае с SQLite корректен (хотя сам не пробовал). Читайте документацию.
можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?
Если вы для себя с первого взгляда плюсов не нашли, скорее всего для вас их просто нет. Подбирал/изменял под себя - если кому-то ещё он пригодится, пользуйтесь, если нет - стандартный компонент Lazarus никуда не делся
Что касается версии библиотеки, то всё проверено на версиях 3.6.x. Буквально на днях вышла версия 3.7.0 - на ней ещё не проверял (только сегодня добрался до компа после недельного отпуска).
- evd
- новенький
- Сообщения: 21
- Зарегистрирован: 13.09.2009 09:42:28
- Откуда: Вологда
- Контактная информация:
modjo писал(а):Я тут вопрос задал, но он наверное утонул в ваших размышлениях![]()
Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:Код: Выделить всё
update users set username=username+" егоров" where uid="1"
При таком подходе пишется 0 в ячейку.
Надо делать не сложение, а конкатенацию строк
Код: Выделить всё
update users set username=username || " егоров" where uid="1"evd
Оно самое, спасибо!
Оно самое, спасибо!
Odyssey писал(а):Padre_Mortius писал(а):можно узнать плюсы данного компонента перед стандартным? .../quote]
...
* возможность работы с blob'ами (насколько я знаю, в Dataset'ах её нет); вот тут я ошибся, значит этот пункт вычёркиваем.
...
Судя по этой ветке форума, работа с блобами в SQLite(3)DataSet всё же не поддерживается. Т.е. интерфейс есть, а реализации нет.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Возникла интересная проблема. Есть сабжевые компоненты (собственно, с другими примерно та же ситуация). Отправляем к базе запрос, скажем, типа "SELECT * FROM table". Результаты запроса лежат в таблице TSQLiteTable. Требуется каким-то образом сохранить эти результаты в файл, а затем загрузить их из файла в другой TSQLiteTable.
Своих методов для сохранения/загрузки данных у этого класса нет. Пока пытаюсь решить проблему путём работы с переменной fResults, которая хранит внутри класса TSQLiteTable результаты выборки. Сама эта переменная имеет тип TList, и хранит данные в виде разномастных указателей (pstring, pint64 и ещё нескольких).
Собственно, вопрос к знатокам: как все эти указатели записать в файл, а потом считать обратно так, чтобы получился точно такой же TList, какой был в оригинале? Возможно ли это вообще, или стоит копать в другую сторону?
PS. Записать в файл, вроде бы как, получается через TFileStream (write(str^)), но пока нет внятных мыслей как эту массу прочитать обратно. Писать для каждой записи её размер?
Своих методов для сохранения/загрузки данных у этого класса нет. Пока пытаюсь решить проблему путём работы с переменной fResults, которая хранит внутри класса TSQLiteTable результаты выборки. Сама эта переменная имеет тип TList, и хранит данные в виде разномастных указателей (pstring, pint64 и ещё нескольких).
Собственно, вопрос к знатокам: как все эти указатели записать в файл, а потом считать обратно так, чтобы получился точно такой же TList, какой был в оригинале? Возможно ли это вообще, или стоит копать в другую сторону?
PS. Записать в файл, вроде бы как, получается через TFileStream (write(str^)), но пока нет внятных мыслей как эту массу прочитать обратно. Писать для каждой записи её размер?
Nik
TStringList не подойдёт?
TStringList не подойдёт?
