read-only database
Модератор: kdv
read-only database
Приветствую, господа!
Вопрос такой:
Пишу клиента на С++ используя Borland Builder. Сервер FireBird 2.0 (SS).
компоненты доступа к базе - с панели InterBase.
Использую:
TIBDatabase
TIBTransaction
TIBQuery
TDataSource
TDBGrid
+ TIBDatabaseInfo.
При попытке сделать IBQuery1->Edit() или IBQuery1->Insert() вылетает ошибка "cennot modify read-only database". (аналогично с любым DataSet).
IBDatabaseInfo1->ReadOnly возвращает "0".
Прописываю параметры IBDatabase1->Params вручную(на всякий...):
user_name=SYSDBA
password=password
lc_ctype=WIN1251
read_write
nowait
read_committed
rec_version
результат прежний.
Может, я не правильно прописываю? Как добиться редактируемости базы?
Вопрос такой:
Пишу клиента на С++ используя Borland Builder. Сервер FireBird 2.0 (SS).
компоненты доступа к базе - с панели InterBase.
Использую:
TIBDatabase
TIBTransaction
TIBQuery
TDataSource
TDBGrid
+ TIBDatabaseInfo.
При попытке сделать IBQuery1->Edit() или IBQuery1->Insert() вылетает ошибка "cennot modify read-only database". (аналогично с любым DataSet).
IBDatabaseInfo1->ReadOnly возвращает "0".
Прописываю параметры IBDatabase1->Params вручную(на всякий...):
user_name=SYSDBA
password=password
lc_ctype=WIN1251
read_write
nowait
read_committed
rec_version
результат прежний.
Может, я не правильно прописываю? Как добиться редактируемости базы?
Re: read-only database
Ну что, господа, будут версии?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
прочитать, наконец, документацию.Как добиться редактируемости базы?
если база в readonly, так выключи readonly.
и не пихай бред в параметры ibdatabase.
см.
www.ibase.ru/devinfo/ibx.htm
Блин, торопился - описАлся. Именно "cannot modify read-only dataset"!Dimitry Sibiryakov писал(а):Ты уверен, что ошибка именно такая, а не "cannot modify read-only dataset"?
Прошу прощения.
прочитал уже, и не раз. К cамой базе имею доступ на чтение/запись из программ управления БД(FlameRobin, Interbase&Firebird development Studio).kdv писал(а):прочитать, наконец, документацию.
www.ibase.ru/devinfo/ibx.htm
если база в readonly, так выключи readonly.
Что значит "бред"? Что лишнего или неправильного?kdv писал(а): и не пихай бред в параметры ibdatabase.
изначально вообще ставил только
user_name=SYSDBA
lc_ctype=WIN1251
полагался на умолчания, которые не очень подходят. Но результат один.
бред это запихивание параметров транзакции в параметры коннекта.Что значит "бред"? Что лишнего или неправильного?
тогда ЕЩЕ РАЗ ЧИТАЙ статью.Именно "cannot modify read-only dataset"!
по диагонали читаешь ведь. в статье все написано. см. IBDataSet.прочитал уже, и не раз.
цитирую текст, которым начинается раздел по используемому тобой IBQuery:
"Компонент для выполнения запросов. Если не требуется выполнять "редактирование" записей запроса, то IBQuery можно использовать вместо IBDataSet. Или, как замену IBDataSet можно использовать комбинацию IBQuery + IBUpdateSQL."
и ты говоришь что "читал и не раз"?
Хотите сказать из Query нельзя редактировать базу?kdv писал(а): цитирую текст, которым начинается раздел по используемому тобой IBQuery:
"Компонент для выполнения запросов. Если не требуется выполнять "редактирование" записей запроса, то IBQuery можно использовать вместо IBDataSet. Или, как замену IBDataSet можно использовать комбинацию IBQuery + IBUpdateSQL."
Так бред же, по-моему: зачем тогда наследуемые у dataset-а вункции перехода в режим вставки и редактирования?
Можно ли, например, редактировать?:
Код: Выделить всё
IBQuery1->Edit();
IBQuery1->FieldByName("Field1")->AsString= "aaaaaaa";
IBQuery1->Post();
И почему нельзя так?:
Код: Выделить всё
IBDataSet1->InsertSQL->Clear();
IBDataSet1->InsertSQL->Add("insert into mybase (Field1)");
IBDataSet1->InsertSQL->Add("values (\'aaaa\')");
IBDataSet1->ExecSQL();
Код: Выделить всё
IBDataSet1->InsertSQL->Clear();
IBDataSet1->InsertSQL->Add("insert into mybase (Field1)");
IBDataSet1->InsertSQL->Add("values (\'aaaa\')");
IBDataSet1->ExecSQL();
Попробовал через ParamByName - то же самое.
если несложно и можно, пришли, плиз, маленький примерчик с возможностью редактирования записей табл., чтобы увидеть воочию что-где прописано.
в SQL базах данных данные редактируются тремя операторами - insert, update, delete. SELECT - это оператор ЧТЕНИЯ данных, соответственно он "редактироваться" никак не может. Если ты написал SELECT, и хочешь редактировать, значит или ты сам должен дописать необходимые для "редактирования" запросы, как это показано на примере IBDataSet в пресловутой статье, или чтобы эти запросы сформировала АВТОМАТИКА в компонентах, как это делалось раньше в BDE.Хотите сказать из Query нельзя редактировать базу?
Так бред же, по-моему: зачем тогда наследуемые у dataset-а функции перехода в режим вставки и редактирования?
www.ibase.ru/devinfo/bde.htm
Именно поэтому, раз такой "автоматики" IBX нет, то "редактируемость" набора данных можно обеспечить только вручную. Т.е. или прописыванием нужных запросов IBDataSet, или конструированием аналога IBDataSet из IBQuery + IBUpdateSQL.
меня уже смех разбирает, если честно.если несложно и можно, пришли, плиз, маленький примерчик с возможностью редактирования записей табл., чтобы увидеть воочию что-где прописано.
что ж ты, злыдень, не можешь прочитать
www.ibase.ru/devinfo/ibx.htm#ibdataset по человечески?
там же с картинками все объясняется.
p.s. и еще - не все SQL-операторы могут быть "редактируемыми". Элементарный пример - любой запрос с агрегатами. select id, count(*) from table group by id.
могу еще цитатку из www.ibase.ru/devinfo/bde.htm подкинуть
"Живые" запросы
Если способность TTable редактировать и удалять записи ни у кого не вызывает удивления, то TQuery требует, чтобы свойство RequestLive было установлено в True. Если при False запрос отправлялся непосредственно на сервер, то при True запрос предварительно обрабатывается локальным SQL (модуль IDSQL32.DLL). Это необходимо для того, чтобы TQuery смог сформировать запросы INSERT/UPDATE/DELETE на основании заданного SELECT. Для TTable построение таких запросов не представляет сложности, т.к. задано только имя таблицы, имена полей считаны и т.п. А существующий SQL-запрос нужно синтаксически разобрать, чтобы понять, сколько в нем используется таблиц, какие выбираются поля и из каких таблиц, и можно ли вообще сформировать запросы на вставку, обновление и удаление данных.
Именно таким разбором SQL и занимается Local SQL. Разумеется, он поддерживает весьма ограниченный синтаксис SQL, что не позволяет делать "живыми" запросы, использующие расширенные конструкции SQL, пользовательские функции или специфические для конкретного сервера особенности. Например, для организации "живого" запроса вместо
SELECT * FROM TABLE
WHERE FIELD STARTING WITH 'A'
придется писать
SELECT * FROM TABLE
WHERE FIELD LIKE 'A%'
Подобную замену еще можно пережить, но не всегда возможно найти замену конструкции, которую не понимает Local SQL, и прекрасно понимает сервер.
примечание: вы сами можете убедиться в изложенном, поместив первый запрос в TQuery, переключив RequestLive в True. Попытайтесь установить Active компонента в True и посмотрите что получится.
Собственно, как вы поняли, на самом деле никаких "живых" запросов не существует. В SQL оператор SELECT выполняет только чтение, а вставить, обновить или удалить записи можно только операторами INSERT, UPDATE и DELETE, и никак иначе.
При переключении TQuery.RequestLive:=True TQuery начинает вести себя как TTable - т.е. он сначала разбирает запрос, извлекает оттуда имя таблицы, и потом выбирает информацию из системных таблиц о полях таблицы, индексах и т.п. Вы можете все это увидеть в SQL Monitor.
"Живые" запросы
Если способность TTable редактировать и удалять записи ни у кого не вызывает удивления, то TQuery требует, чтобы свойство RequestLive было установлено в True. Если при False запрос отправлялся непосредственно на сервер, то при True запрос предварительно обрабатывается локальным SQL (модуль IDSQL32.DLL). Это необходимо для того, чтобы TQuery смог сформировать запросы INSERT/UPDATE/DELETE на основании заданного SELECT. Для TTable построение таких запросов не представляет сложности, т.к. задано только имя таблицы, имена полей считаны и т.п. А существующий SQL-запрос нужно синтаксически разобрать, чтобы понять, сколько в нем используется таблиц, какие выбираются поля и из каких таблиц, и можно ли вообще сформировать запросы на вставку, обновление и удаление данных.
Именно таким разбором SQL и занимается Local SQL. Разумеется, он поддерживает весьма ограниченный синтаксис SQL, что не позволяет делать "живыми" запросы, использующие расширенные конструкции SQL, пользовательские функции или специфические для конкретного сервера особенности. Например, для организации "живого" запроса вместо
SELECT * FROM TABLE
WHERE FIELD STARTING WITH 'A'
придется писать
SELECT * FROM TABLE
WHERE FIELD LIKE 'A%'
Подобную замену еще можно пережить, но не всегда возможно найти замену конструкции, которую не понимает Local SQL, и прекрасно понимает сервер.
примечание: вы сами можете убедиться в изложенном, поместив первый запрос в TQuery, переключив RequestLive в True. Попытайтесь установить Active компонента в True и посмотрите что получится.
Собственно, как вы поняли, на самом деле никаких "живых" запросов не существует. В SQL оператор SELECT выполняет только чтение, а вставить, обновить или удалить записи можно только операторами INSERT, UPDATE и DELETE, и никак иначе.
При переключении TQuery.RequestLive:=True TQuery начинает вести себя как TTable - т.е. он сначала разбирает запрос, извлекает оттуда имя таблицы, и потом выбирает информацию из системных таблиц о полях таблицы, индексах и т.п. Вы можете все это увидеть в SQL Monitor.
Мля, не поверишь... бывает же.. - сегодня на свежую голову дошло, "как это работает". И сам ржаль.kdv писал(а): меня уже смех разбирает, если честно.
что ж ты, злыдень, не можешь прочитать
Как понял IBDataSet при "редактировании" базы(вставка, например) методом компонентных функций:
Код: Выделить всё
IBDataSet1->Insert();
IBDataSet1->FieldByName("Field1")->AsString= "aaaaaaa";
IBDataSet1->Post();
insert into mybase (Field1) values (:Field1)
подставив вместо параметра :Field1 значение "aaaaaaa".
что, впрочем мона делать и самому вручную.
Создал проектик, проверил - работает.
Так это работает только в BDE-компонентах. IBQuery такого вообще не имеет.kdv писал(а): При переключении TQuery.RequestLive:=True TQuery начинает вести себя как TTable
А ты быстро прогрессируешь и в нужную сторону, молодец Не, низзя. Если только залезть к нему в кишки и поправить кое-что в нескольких местах. Квалифицированному человеку работы недели на две-три. Или купить FIBPlusFilSCool писал(а):Вот возник попутно вопрос еще...
Много читал про положительность использования отдельных транзакций операциями...
Можно ли используя один IBDataSet, выполнять запросы SelectSQL, InsertSQL, RefreshSQL,... разными транзакциями, а не одной, что прописана по умолчанию, не закрывая DataSet?
Ты про вот эту нерабочую ссылку?Merlin писал(а):Для связки IBQuery-IBUpdateSQL. Где-где, на сайте, вестимо
Не, я про эту рабочуюWildSery писал(а):Ты про вот эту нерабочую ссылку?Merlin писал(а):Для связки IBQuery-IBUpdateSQL. Где-где, на сайте, вестимо
http://www.ibase.ru/fibc/wr_trans.txt
работу я не тестил, сам понимаешь.
Слушай, FISCool, мне ведь смеяться надоест, и я осерчаю.
сколько раз можно повторять чтобы ты читал ibx.htm по человечески?
опять цитирую:
IBUpdateSQLW
В поставке такого компонента нет. Зато он есть здесь. Он предназначен для выполнения операторов Select/refresh и insert/update/delete в разных транзакциях. Зачем это нужно, см. дальше информацию по транзакциям в приложении.
...
Эта проблема решается, причем один из способов описан выше - это вынос запросов insert/update/delete в отдельные компоненты IBSQL/IBQuery. Второй способ - использование IBQuery + специальная модификация IBUpdateSQL (см. IBUpdateSQLW выше)
p.s. это просто кандец какой-то...
сколько раз можно повторять чтобы ты читал ibx.htm по человечески?
опять цитирую:
IBUpdateSQLW
В поставке такого компонента нет. Зато он есть здесь. Он предназначен для выполнения операторов Select/refresh и insert/update/delete в разных транзакциях. Зачем это нужно, см. дальше информацию по транзакциям в приложении.
...
Эта проблема решается, причем один из способов описан выше - это вынос запросов insert/update/delete в отдельные компоненты IBSQL/IBQuery. Второй способ - использование IBQuery + специальная модификация IBUpdateSQL (см. IBUpdateSQLW выше)
p.s. это просто кандец какой-то...