sqlite и dbgrid

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

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

Ответить
julius
незнакомец
Сообщения: 4
Зарегистрирован: 09.12.2010 14:04:51

sqlite и dbgrid

Сообщение julius »

Подскажите пожалуйста где можно почитать на русском как работать с бд в лазарусе.
У меня получается только добавлять в бд записи а как удалять и редактировать?
Можно ли редактировать сразу в dbgrid?
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

можно.

Добавлено спустя 6 минут 52 секунды:
возьми любую книжку по delphi и БД на русском языке. не смотри примеры где используются TDataSet, TTable, TClientDataSet, borland BDE, BDE Express и TADO*. Смотри примеры с TSQL. Помни, что цепочка должны быть примерно такой T*Connection -> TSQL/TTransact -> TDataSource ->TDB*.
В TSQL задай все свойства *SQL (updateSQL, deleteSQL).
julius
незнакомец
Сообщения: 4
Зарегистрирован: 09.12.2010 14:04:51

Сообщение julius »

ясно буду искать, вопрос еще про столбцы в датагриде. Тоесть если поставить авто размер столбцов то он сам все выравнивает, а если добавлять самому столбцы через параметры то он им присваивает титл1 титл2 и тд... как поменять эти титлы и их размер и что бы туда выводились нужные значения. Тоесть если недобавляю стобцы то он выводит всю таблицу с названием стобцов как в таблице базы если создаю хоть 1 стобец сам то он ничего невыводит(
starling13
незнакомец
Сообщения: 5
Зарегистрирован: 26.12.2010 20:16:01

Сообщение starling13 »

Решил написать здесь не создавая новую тему.
Сделал тестовый пример с Sqlite3.
БД:

Код: Выделить всё

CREATE TABLE "Люди"
(
   "ID" INTEGER NOT NULL,
   "ФИО" VARCHAR(128) NOT NULL,
   "e-mail" VARCHAR(50),
   "Дата рождения" DATE,
   PRIMARY KEY ("ID")
)

Приложение:
1. Модуль данных - SQLite3Connection, SQLTransaction, SQLQuery.
2. У SQLQuery SQL = SELECT * FROM "Люди"; UpdateSQL и InsertSQL - пусто.
UsePrimaryKeyAsKey = True
UpdateMode = upWhereKeyOnly (Выражение UPDATE/DELETE будет использовать только ... WHERE "ID" = ...)
Добавлены поля для всех клонок таблицы. У ID required = false,
ProviderFlags = [pfInUpdate,pfInWhere,pfInKey]
У остальных полей ProviderFlags = [pfInUpdate]
3. На форме
DataSource, DBGrid, DBNavigator.
В DBGrid есть колонки на все поля SQLQuery кроме ID (ему передаётся NULL при INSERT и в SQLite срабатывает Autoincrement)
На событиях AfterDelete и AfterPost стоят SQLQuery.ApplyUpdates


В Ubuntu всё прекрасно работает (добавление, модификация, удаление), в Windows XP поля e-mail и "Дата рождения" вызывают проблему. SELECT проходит, а при вставке/редактировании в DBGrid возникает ошибка:
не найдено поле "e" и "Дата".
Если изменить поля в таблице на "email" и "ДатаРождения", то естественно работает.

Отчего такая разница?
Пример1.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

starling13
В Windows всегда были проблемы с чтением пробелов. Для примера, попробуйте вывести в консоли список файлов из каталога "Program files". Если Вы это название не заключите в кавычки, то сей каталог просто не будет найден, т.к. вместо одного получается два каталога. ;)
starling13
незнакомец
Сообщения: 5
Зарегистрирован: 26.12.2010 20:16:01

Сообщение starling13 »

Спасибо за ответ. Но наверно это стоит поместить в баги, т.к. СУБД поддерживает такой способ описания идентификаторов (в двойных кавычках с пробелами, национальными и специальными символами), а компоненты доступа не совсем. Проблема похоже на этапе автоматического формирования SQL запросв INSERT/UPDATE.
В описанном примере возникает ошибка "не найдено поле e" (это от e-mail)
Если руками написать updateSQL: UPDATE "Люди" SET ... "e-mail" = :"e-mail" ... , то ошибка: не найдено поле ""e-mail"" - то есть сам параметр кавычками обрамил, и мои помешали. Если написать UPDATE "Люди" SET ... "e-mail" = :e-mail,
то таже ошибка про поле e.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

starling13 писал(а):Спасибо за ответ. Но наверно это стоит поместить в баги, т.к. СУБД поддерживает такой способ описания идентификаторов (в двойных кавычках с пробелами, национальными и специальными символами), а компоненты доступа не совсем. ...

У меня вот возникает вопрос: а для чего вообще нужен "такой способ описания идентификаторов"? :|
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

starling13
А Вы попробуйте обрамлять названия обратными апострофами, который на кнопке "Ё". Или, если речь идёт именно о sqlite, все названия полей и таблиц заключать вместо ковычек в квадратные скобки. А потом напишите, что получилось. ;)

Код: Выделить всё

UPDATE [Люди] SET ... [e-mail] = :e-mail,
starling13
незнакомец
Сообщения: 5
Зарегистрирован: 26.12.2010 20:16:01

Сообщение starling13 »

UPDATE [Люди] SET ... [e-mail] = :e-mail,

Нет, это не помогло. Та же ошибка. Ошибка именно в имени параметра
Имена параметров похоже обрамляются кавычками, то есть, как я писал уже, если будет:
... "e-mail" = :"e-mail" ... , то пишет: не найден параметр ""e-mail""

И ещё повторюсь: в Ubuntu для БД с таблицей "Люди", состоящей из полей "ID", "ФИО", "e-mail", "Дата рождения" достаточно написать в свойстве SQL 'SELECT * FROM "Люди"'.

Раз один и тот же код работает по разному в двух ОС, - это баг. То ли в Lazarus для Windows, то ли в SQLIte3 для Windows.
Предлагаю описать пример разработчикам.

Добавлено спустя 16 минут 41 секунду:
У меня вот возникает вопрос: а для чего вообще нужен "такой способ описания идентификаторов"?


Он очень важен. Я ещё не выяснил до конца, но ANSI SQL-92 определяет:
...
5.4 Names and identifiers
Function
Specify names.
Format

<identifier> ::=
[ <introducer><character set specification> ] <actual identifier>

<actual identifier> ::=
<regular identifier>
| <delimited identifier>
...


Я не понял только, определяет ли стандарт какие именно делимитеры нужно использовать, но почти все СУБД используют двойные кавычки. Не работал с MySQL, но кажетсчя он может и ` , и " . Только M$ как всегда умнее всех и у них []
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

не найден параметр ""e-mail""

Эта ошибка говорит о том, что Query не видит параметра e-mail (значение Query.Params)

Код: Выделить всё

query.Params.ByNameAsAnsiString['e-mail'] := 'a@b.com';
starling13
незнакомец
Сообщения: 5
Зарегистрирован: 26.12.2010 20:16:01

Сообщение starling13 »

не найден параметр ""e-mail""

Эта ошибка говорит о том, что Query не видит параметра e-mail (значение Query.Params)


Не совсем так. Обратите внимание на две пары кавычек. Когда я обрамил имя параметра в запросе кавычками:

Код: Выделить всё

... SET "e-mail" = :"e-mail"
,
то возникла эта ошибка.

В любом случае, проблема не столько в самих кавычках, а в различном поведении на различных платформах.
julius
незнакомец
Сообщения: 4
Зарегистрирован: 09.12.2010 14:04:51

Сообщение julius »

Я делал подругому увы я несмог сделать как Вы написали(((( А как сделать с привязкой к этой бдпанели я не знаю(
Дата модуль я создал но вот прикрутить так что бы все работало не смог. База данных у меня в директории единственное что для работы нужно это библиотека скулайт3.длл в систем32. Посмотрите может кто-то подскажет.

Вобщем чтобы не усложнять подскажите как правильно сделать тот пример что приведен выше. Заранее большое спасибо всем кто помогает.
Кто чем редактирует базы?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
starling13
незнакомец
Сообщения: 5
Зарегистрирован: 26.12.2010 20:16:01

Сообщение starling13 »

Объясните точнее, что не получилось?

Добавлено спустя 2 минуты 37 секунд:
Для SQLIte есть прекрасная утилита администрирования SQLiteman - и для Windows, и для Linux
julius
незнакомец
Сообщения: 4
Зарегистрирован: 09.12.2010 14:04:51

Сообщение julius »

starling13 писал(а):Объясните точнее, что не получилось?

Добавлено спустя 2 минуты 37 секунд:
Для SQLIte есть прекрасная утилита администрирования SQLiteman - и для Windows, и для Linux


А как в этой программе поставить автоинкремент?
Я пробовал к своему примеру прикрутить эту панель но увы неполучилось сегодня еще раз попробую может получится, если получится отпишу.
Ответить