sqlite и dbgrid
Модератор: Модераторы
sqlite и dbgrid
Подскажите пожалуйста где можно почитать на русском как работать с бд в лазарусе.
У меня получается только добавлять в бд записи а как удалять и редактировать?
Можно ли редактировать сразу в dbgrid?
У меня получается только добавлять в бд записи а как удалять и редактировать?
Можно ли редактировать сразу в dbgrid?
можно.
Добавлено спустя 6 минут 52 секунды:
возьми любую книжку по delphi и БД на русском языке. не смотри примеры где используются TDataSet, TTable, TClientDataSet, borland BDE, BDE Express и TADO*. Смотри примеры с TSQL. Помни, что цепочка должны быть примерно такой T*Connection -> TSQL/TTransact -> TDataSource ->TDB*.
В TSQL задай все свойства *SQL (updateSQL, deleteSQL).
Добавлено спустя 6 минут 52 секунды:
возьми любую книжку по delphi и БД на русском языке. не смотри примеры где используются TDataSet, TTable, TClientDataSet, borland BDE, BDE Express и TADO*. Смотри примеры с TSQL. Помни, что цепочка должны быть примерно такой T*Connection -> TSQL/TTransact -> TDataSource ->TDB*.
В TSQL задай все свойства *SQL (updateSQL, deleteSQL).
ясно буду искать, вопрос еще про столбцы в датагриде. Тоесть если поставить авто размер столбцов то он сам все выравнивает, а если добавлять самому столбцы через параметры то он им присваивает титл1 титл2 и тд... как поменять эти титлы и их размер и что бы туда выводились нужные значения. Тоесть если недобавляю стобцы то он выводит всю таблицу с названием стобцов как в таблице базы если создаю хоть 1 стобец сам то он ничего невыводит(
-
starling13
- незнакомец
- Сообщения: 5
- Зарегистрирован: 26.12.2010 20:16:01
Решил написать здесь не создавая новую тему.
Сделал тестовый пример с Sqlite3.
БД:
Приложение:
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" и "ДатаРождения", то естественно работает.
Отчего такая разница?
Сделал тестовый пример с 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" и "ДатаРождения", то естественно работает.
Отчего такая разница?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
starling13
В Windows всегда были проблемы с чтением пробелов. Для примера, попробуйте вывести в консоли список файлов из каталога "Program files". Если Вы это название не заключите в кавычки, то сей каталог просто не будет найден, т.к. вместо одного получается два каталога.
В Windows всегда были проблемы с чтением пробелов. Для примера, попробуйте вывести в консоли список файлов из каталога "Program files". Если Вы это название не заключите в кавычки, то сей каталог просто не будет найден, т.к. вместо одного получается два каталога.
-
starling13
- незнакомец
- Сообщения: 5
- Зарегистрирован: 26.12.2010 20:16:01
Спасибо за ответ. Но наверно это стоит поместить в баги, т.к. СУБД поддерживает такой способ описания идентификаторов (в двойных кавычках с пробелами, национальными и специальными символами), а компоненты доступа не совсем. Проблема похоже на этапе автоматического формирования SQL запросв INSERT/UPDATE.
В описанном примере возникает ошибка "не найдено поле e" (это от e-mail)
Если руками написать updateSQL: UPDATE "Люди" SET ... "e-mail" = :"e-mail" ... , то ошибка: не найдено поле ""e-mail"" - то есть сам параметр кавычками обрамил, и мои помешали. Если написать UPDATE "Люди" SET ... "e-mail" = :e-mail,
то таже ошибка про поле e.
В описанном примере возникает ошибка "не найдено поле 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
- Откуда: Тољя††и
- Контактная информация:
starling13 писал(а):Спасибо за ответ. Но наверно это стоит поместить в баги, т.к. СУБД поддерживает такой способ описания идентификаторов (в двойных кавычках с пробелами, национальными и специальными символами), а компоненты доступа не совсем. ...
У меня вот возникает вопрос: а для чего вообще нужен "такой способ описания идентификаторов"?
starling13
А Вы попробуйте обрамлять названия обратными апострофами, который на кнопке "Ё". Или, если речь идёт именно о sqlite, все названия полей и таблиц заключать вместо ковычек в квадратные скобки. А потом напишите, что получилось.
А Вы попробуйте обрамлять названия обратными апострофами, который на кнопке "Ё". Или, если речь идёт именно о sqlite, все названия полей и таблиц заключать вместо ковычек в квадратные скобки. А потом напишите, что получилось.
Код: Выделить всё
UPDATE [Люди] SET ... [e-mail] = :e-mail,-
starling13
- незнакомец
- Сообщения: 5
- Зарегистрирован: 26.12.2010 20:16:01
UPDATE [Люди] SET ... [e-mail] = :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
- Откуда: Спб
не найден параметр ""e-mail""
Эта ошибка говорит о том, что Query не видит параметра e-mail (значение Query.Params)
Код: Выделить всё
query.Params.ByNameAsAnsiString['e-mail'] := 'a@b.com';-
starling13
- незнакомец
- Сообщения: 5
- Зарегистрирован: 26.12.2010 20:16:01
не найден параметр ""e-mail""
Эта ошибка говорит о том, что Query не видит параметра e-mail (значение Query.Params)
Не совсем так. Обратите внимание на две пары кавычек. Когда я обрамил имя параметра в запросе кавычками:
Код: Выделить всё
... SET "e-mail" = :"e-mail"то возникла эта ошибка.
В любом случае, проблема не столько в самих кавычках, а в различном поведении на различных платформах.
Я делал подругому увы я несмог сделать как Вы написали(((( А как сделать с привязкой к этой бдпанели я не знаю(
Дата модуль я создал но вот прикрутить так что бы все работало не смог. База данных у меня в директории единственное что для работы нужно это библиотека скулайт3.длл в систем32. Посмотрите может кто-то подскажет.
Вобщем чтобы не усложнять подскажите как правильно сделать тот пример что приведен выше. Заранее большое спасибо всем кто помогает.
Кто чем редактирует базы?
Дата модуль я создал но вот прикрутить так что бы все работало не смог. База данных у меня в директории единственное что для работы нужно это библиотека скулайт3.длл в систем32. Посмотрите может кто-то подскажет.
Вобщем чтобы не усложнять подскажите как правильно сделать тот пример что приведен выше. Заранее большое спасибо всем кто помогает.
Кто чем редактирует базы?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
starling13
- незнакомец
- Сообщения: 5
- Зарегистрирован: 26.12.2010 20:16:01
Объясните точнее, что не получилось?
Добавлено спустя 2 минуты 37 секунд:
Для SQLIte есть прекрасная утилита администрирования SQLiteman - и для Windows, и для Linux
Добавлено спустя 2 минуты 37 секунд:
Для SQLIte есть прекрасная утилита администрирования SQLiteman - и для Windows, и для Linux
starling13 писал(а):Объясните точнее, что не получилось?
Добавлено спустя 2 минуты 37 секунд:
Для SQLIte есть прекрасная утилита администрирования SQLiteman - и для Windows, и для Linux
А как в этой программе поставить автоинкремент?
Я пробовал к своему примеру прикрутить эту панель но увы неполучилось сегодня еще раз попробую может получится, если получится отпишу.
