I am currently testing with:
- A SQLConnection which is pointed towards an IB database.
- A SQLDataset that has a SQLConnection field set to the one above.
- A DatasetProvider that has the SQLDataset in (2) as its Dataset field value.
- A ClientDataset, with the ProviderName field pointing to the provider in (3).
I use the following method (borrowed from Alister Christie) to get the data…
function TForm1.GetCurrEmployee(const IEmployeeID: integer): OleVariant;
const
SQLSELEMP = 'SELECT E.* FROM EMPLOYEE E WHERE E.EMPLOYEEID = %s';
begin
MainDM.SQLDataset1.CommandText := Format(SQLSELEMP, [Edit1.Text]);
Result := MainDM.DataSetProvider1.Data;
end;
Which populates the DBGrid with just one record. However, when I manually edit the record, click on Post, then try to commit the changes, using
MainDM.ClientDataset1.ApplyUpdates(0); // <<<<<<
It bombs, with the message «SQLDataset1: Cannot modify a read-only dataset.»
I have checked the ReadOnly property of the Provider, and of the ClientDataset, and the SQL has no joins.
What could be causing the error?
|
|
|
Cannot modify read-only dataset
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Member Рейтинг (т): 0 |
Версия дельфи 7ая. База Парадоксовская. Двигло БДЕ. Всё вродер делаю прально: Разместил компоненты, сварганил базу, свотрится она нормально, в дбгрид и редактируется там же отлично, но дбедит возможно редактирование отсутствует т.е., при выполнении:
Table1.Active:=true; Table1.First; Table1.Edit; Вылазит сабжевая ошибка. Что я делаю не так? |
Vit |
|
Автором очевидно проводится проверка телепатических способностей форумчан по угадыванию названия ошибки на расстоянии. |
cr0acker |
|
Member Рейтинг (т): 0 |
А че не понятно. Есть база. Есть алиас в дбе на эту базу. Есть программа на дельфях отлично читающая эту базу, как через ДБГридДБнавигатор, так и черещ ДБедитДбмемо со своими кнопочками. Если запустить софтину пощелкать на кнопки тов всё нормально, но в ДБедит невозможно ничего изменить, при клике он очищается.
Table1.Active:=true; Table1.First; DBEdit1.Text:=mainform.Table1.FieldByName(‘ID’).AsString; DBEdit2.Text:=mainform.Table1.FieldByName(‘SN’).AsString; DBEdit3.Text:=mainform.Table1.FieldByName(‘FN’).AsString; DBEdit4.Text:=mainform.Table1.FieldByName(‘tel’).AsString; DBEdit5.Text:=mainform.Table1.FieldByName(’email’).AsString; DBEdit6.Text:=mainform.Table1.FieldByName(‘addr’).AsString; DBEdit7.Text:=mainform.Table1.FieldByName(‘vac’).AsString; DBEdit8.Text:=mainform.Table1.FieldByName(‘age’).AsString; DBEdit9.Text:=mainform.Table1.FieldByName(‘sallary’).AsString; DBEdit10.Text:=mainform.Table1.FieldByName(‘city2’).AsString; DBMemo1.Text:=mainform.Table1.FieldByName(‘education’).AsString; DBMemo1.Text:=mainform.Table1.FieldByName(‘opit1’).AsString; DbMemo1.Text:=mainform.Table1.FieldByName(‘desc’).AsString; Вопрос а) почему в полях дбедит ничего нельзя изметь. Б)Почему при вышеописанных изменениях вылезает сабжевая ошибка. |
VG_ |
|
Full Member Рейтинг (т): 6 |
Цитата cr0acker @ 21.02.06, 02:05 Вопрос а) почему в полях дбедит ничего нельзя изметь…
А ты пробывал в DBGrid в свойстве Options поставить true у dgEditing? |
dron-s |
|
cr0acker |
Bas |
|
Заполни DataSources,DataField и будет счастье. |
cr0acker |
|
Member Рейтинг (т): 0 |
Цитата Bas @ 21.02.06, 06:33 Заполни DataSources,DataField и будет счастье. Ну, да, значение при клике пропападать перестало, но, отредактировать его невозможно(хотя в гриде все редактируется), а при
Table1.Edit; Table1.Append; Код:
Table1.Active:=true; Table1.First; DBEdit1.DataSource:=DataSource1; DBEdit2.DataSource:=DataSource1; DBEdit3.DataSource:=DataSource1; DBEdit4.DataSource:=DataSource1; DBEdit5.DataSource:=DataSource1; DBEdit6.DataSource:=DataSource1; DBEdit7.DataSource:=DataSource1; DBEdit8.DataSource:=DataSource1; DBEdit9.DataSource:=DataSource1; DBEdit10.DataSource:=DataSource1; DBEdit1.DataField:=’ID’; DBEdit2.DataField:=’SN’; DBEdit3.DataField:=’FN’; DBEdit4.DataField:=’tel’; DBEdit5.DataField:=’email’; DBEdit6.DataField:=’addr’; DBEdit7.DataField:=’vac’; DBEdit8.DataField:=’age’; DBEdit9.DataField:=’sallary’; DBEdit10.DataField:=’city2′; DBMemo1.DataSource:=Datasource1; DBMemo2.DataSource:=Datasource1; DBMemo3.DataSource:=Datasource1; DBMemo1.DataField:=’education’; DBMemo2.DataField:=’opit1′; DBMemo3.DataField:=’desc’; |
dron-s |
|
cr0acker |
Bas |
|
DBEdit1.DataSource:=DataSource1; ………. DBEdit10.DataSource:=DataSource1; DBEdit1.DataField:=’ID’; …………… DBEdit10.DataField:=’city2′; DBMemo1.DataSource:=Datasource1; DBMemo2.DataSource:=Datasource1; DBMemo3.DataSource:=Datasource1; DBMemo1.DataField:=’education’; DBMemo2.DataField:=’opit1′; DBMemo3.DataField:=’desc’; Table1.Active:=true; Table1.First; Table1.Edit ;// если хотим редактировать Table1.Append;// добавляем новую запись |
Coala |
|
Цитата DroN_S @ 21.02.06, 14:39 cr0acker Ага, особливо, если использовать дизайновую привязку ДБЕдитов (и всего остального, если появятся) к соответствующему ДатаСорсу Добавлено 22.02.06, 10:55 Цитата Bas @ 22.02.06, 10:47 Table1.Append;// добавляем новую запись Дык если Table.ReadOnly = true, снова и поимеем ошибку, указанную в сабже первого поста! |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0309 ] [ 16 queries used ] [ Generated: 5.06.23, 15:11 GMT ]
← →
Muzzy
(2006-06-01 08:17)
[0]
Ругается на строке с
FieldByName(«npp»).AsInteger:=StrToInt(edNpp.Text);
говорит следующее:
Cannnot modify a read-only dataset.
Что это такое? Я все проверил на 1024 раза. Может что в real-time нужно делать? И в IB настройки смотрел.
Делаю все по книжке вот так:
with IBDataSetJOTKL do
begin
IBDataSetJOTKL.Active:=True;
try
Insert;
FieldByName(«npp»).AsInteger:=StrToInt(edNpp.Text);
FieldByName(«fidname»).AsString:=edFidname.Text;
FieldByName(«dateotkl»).AsDateTime:=edDateotkl.Date;
FieldByName(«timeotkl»).AsDateTime:=edTimeotkl.Time;
FieldByName(«datevkl»).AsDateTime:=edDatevkl.Date;
FieldByName(«timevkl»).AsDateTime:=edTimevkl.Time;
FieldByName(«lengthotkl»).AsDateTime:=edLengthotkl.Time;
FieldByName(«priotkl»).AsString:=edPriotkl.Text;
FieldByName(«npo»).AsString:=edNpo.Text;
FieldByName(«katpotr»).AsString:=edKatpotr.Text;
FieldByName(«klassif»).AsInteger:=StrToInt(edKlassif.Text);
FieldByName(«nedootp»).AsInteger:=StrToInt(edNedootp.Text);
FieldByName(«datepered»).AsDateTime:=edDatepered.Date;
FieldByName(«timepered»).AsDateTime:=edTimepered.Time;
FieldByName(«peredkomu»).AsString:=edPeredkomu.Text;
FieldByName(«commentmemo»).AsString:=edCommentmemo.Text;
Post;
finally
IBDataSetJOTKL.Active:=False;
end;
end;
В чем проблема?
← →
ANB ©
(2006-06-01 08:28)
[1]
Заполни свойство InsertSQL
← →
dolmat
(2006-06-01 09:03)
[2]
> Ругается на строке с
> FieldByName(«npp»).AsInteger:=StrToInt(edNpp.Text);
Возможно для этого лучше генератор привязать
← →
Sergey13 ©
(2006-06-01 09:05)
[3]
>Делаю все по книжке вот так:
Выкинь такую книжку или почитай внимательнее. ИМХО.
Зачем открывать датасет только для того что бы вставить одну запись!
← →
Muzzy
(2006-06-01 11:39)
[4]
>> Заполни свойство InsertSQL
А что там написать-то?
INSERT и иже с ним? А зачем тогда FieldByName ?
← →
Sergey13 ©
(2006-06-01 11:41)
[5]
2 [4] Muzzy (01.06.06 11:39)
>А что там написать-то?
Похоже, прежде чем написать что то, тебе придется еще многое прочитать. ИМХО.
← →
Muzzy
(2006-06-01 12:03)
[6]
> Похоже, прежде чем написать что то, тебе придется еще многое прочитать. ИМХО.
Да читал я. Тогда уж проще через IBSQL. Но хотелось-то попроще, через DataSet. Ну подскажите че написать-то поля-то в коде есть. И вопрос-то в другом. Почему недает вставить запись? Ладно если другая ошибка, дело-то в этом.
← →
Muzzy
(2006-06-01 12:07)
[7]
Ну подскажите идиоту где еще порыть. Прогу срочно делать надо. Простая ведь. Того и надо, что записи вствлять.
Вот и база:
CREATE TABLE «JOTKL»
(
«npp» INTEGER,
«fidname» VARCHAR(64),
«dateotkl» DATE,
«timeotkl» TIME,
«datevkl» DATE,
«timevkl» TIME,
«lengthotkl» TIME,
«priotkl» VARCHAR(254),
«npo» VARCHAR(254),
«katpotr» VARCHAR(12),
«klassif» SMALLINT,
«nedootp» SMALLINT,
«datepered» DATE,
«timepered» TIME,
«peredkomu» VARCHAR(64),
«commentmemo» VARCHAR(254)
);
← →
Сергей М. ©
(2006-06-01 12:11)
[8]
Замени IBDataset на IBTable и не мучайся.
← →
Muzzy
(2006-06-01 12:11)
[9]
Было в FAQ, но что это и куда пихать???
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988623447&n=14
← →
Sergey13 ©
(2006-06-01 12:12)
[10]
2[6] Muzzy (01.06.06 12:03)
> Да читал я.
Да ладно заливать то.
>Ну подскажите че написать-то
В данном случае ничего и писать то не надо. Надо кликнуть правой кнопкой на датасете и в редакторе правильно указать ключевые и обновляемые поля, после чего сгенерировать (кнопку нажать) модифицирующие запросы.
← →
Muzzy
(2006-06-01 12:15)
[11]
> В данном случае ничего и писать то не надо. Надо кликнуть
> правой кнопкой на датасете и в редакторе правильно указать
> ключевые и обновляемые поля, после чего сгенерировать (кнопку
> нажать) модифицирующие запросы.
Блин! А про это в книжке не сказано!
← →
Muzzy
(2006-06-01 13:38)
[12]
> В данном случае ничего и писать то не надо. Надо кликнуть
> правой кнопкой на датасете и в редакторе правильно указать
> ключевые и обновляемые поля, после чего сгенерировать (кнопку
> нажать) модифицирующие запросы.
Ну сгенерил, вот что получилось:
insert into JOTKL
(npp, fidname, dateotkl, timeotkl, datevkl, timevkl, lengthotkl, priotkl,
npo, katpotr, klassif, nedootp, datepered, timepered, peredkomu, commentmemo)
values
(:npp, :fidname, :dateotkl, :timeotkl, :datevkl, :timevkl, :lengthotkl,
:priotkl, :npo, :katpotr, :klassif, :nedootp, :datepered, :timepered,
:peredkomu, :commentmemo)
Выдает:
Column unknow NPP»
SQL error code = -206.
И что дальше?
← →
Desdechado ©
(2006-06-01 13:41)
[13]
судя по скрипту таблицы — БД в 3-м диалекте
а в нем важен регистр символов для имен, если они стоят в кавычках
поэтому нет поля NPP, но есть «npp»
подправь INSERT кавычками для полей
← →
dolmat
(2006-06-02 09:30)
[14]
Возможно свойство Fieds не заполнено
Щелкнуть по IBDataset правой кнопкой мышки, выбрать Fiels editor, потом тойже кнопкой мышки Add All ..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
unit obiekt; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls, inifiles, Vcl.Buttons, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Menus, Data.DB, IBX.IBDatabase, IBX.IBCustomDataSet, IBX.IBQuery; type Tf_ned = class(TForm) PageControl1: TPageControl; Panel1: TPanel; TabSheet1: TTabSheet; TabSheet2: TTabSheet; TabSheet3: TTabSheet; Panel2: TPanel; Panel3: TPanel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn3: TBitBtn; BitBtn4: TBitBtn; DBGrid1: TDBGrid; IBDatabase1: TIBDatabase; IBQuery1: TIBQuery; DataSource1: TDataSource; IBTransaction1: TIBTransaction; IBTransaction2: TIBTransaction; IBQuery2: TIBQuery; procedure FormShow(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure BitBtn1Click(Sender: TObject); private FNew: boolean; public { Public declarations } end; var f_ned: Tf_ned; implementation {$R *.dfm} uses add_arenda; procedure Tf_ned.BitBtn1Click(Sender: TObject); begin f_add_arenda.Show; FNew:=true; try with IBQuery2 do begin if FNew then SQL.Text := 'execute procedure PROC_ZHIL(-1, ''' + f_add_arenda.Edit1.Text + ''', ' + f_add_arenda.Edit2.Text + ', ''' + f_add_arenda.Edit3.Text + ''', ' + f_add_arenda.Edit4.Text + ', ' + f_add_arenda.Edit5.Text + ', ' + f_add_arenda.Edit6.Text + ', ''' + f_add_arenda.Edit7.Text + ''', ''' + f_add_arenda.Edit8.Text + ''', ' + f_add_arenda.Edit9.Text + ''', ' + f_add_arenda.Edit10.Text + ''', ''' + f_add_arenda.Edit11.Text + ''', ' + f_add_arenda.Edit12.Text + ', ''' + f_add_arenda.Edit13.Text + ''')' else SQL.Text := 'execute procedure PROC_ZHIL('+f_ned.IBQuery1.FieldByName('ID').AsString + ', ''' + f_add_arenda.Edit1.Text + ''', ' + f_add_arenda.Edit2.Text + ', ''' + f_add_arenda.Edit3.Text + ''', ' + f_add_arenda.Edit4.Text + ', ' + f_add_arenda.Edit5.Text + ', ' + f_add_arenda.Edit6.Text + ', ''' + f_add_arenda.Edit7.Text + ''', ''' + f_add_arenda.Edit8.Text + ''', ' + f_add_arenda.Edit9.Text + ''', ' + f_add_arenda.Edit10.Text + ''', ''' + f_add_arenda.Edit11.Text + ''', ' + f_add_arenda.Edit12.Text + ', ''' + f_add_arenda.Edit13.Text + ''')'; Transaction.StartTransaction; ExecSQL; Transaction.Commit; Transaction.Active:=false; end; IBQuery1.Close; IBQuery1.Open; except if IBQuery2.Active then IBQuery2.Transaction.Rollback; end; end; procedure Tf_ned.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin IBQuery1.Close; IBDatabase1.Connected:=false; end; procedure Tf_ned.FormShow(Sender: TObject); var FIniFile: TIniFile; begin try FIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'config.ini'); try IBDatabase1.DatabaseName := FIniFile.ReadString('Base', 'Path', ''); finally FInifile.Free; end; IBDatabase1.Connected :=true; with IBQuery1 do begin SQL.Text:='select * from zhilie'; Open; end; except on E:Exception do begin Application.MessageBox(PChar(E.Message), 'Ошибка', MB_ICONERROR); Halt; end; end; end; end. |
Форум программистов Vingrad
Поиск: |
|
Cannot modify a read-only dataset Ошибка |
Опции темы |
Иван Человеков |
|
||
Бывалый Профиль
Репутация: нет
|
BDE, Paradox. автор
На Insert вылетает с ошибкой: «QFirms. Cannot modify a read-only dataset». Подскажите пожалуйста, что неверно. Спасибо. |
||
|
|||
Fazil6 |
|
||
Эксперт Профиль
Репутация: 1
|
какой запрос у QFirms? ORDER BY там нет? |
||
|
|||
Иван Человеков |
|
||
Бывалый Профиль
Репутация: нет
|
Fazil6, ORDER BY убрал и получилось. Неужели в этом причина? |
||
|
|||
Fazil6 |
|
||
Эксперт Профиль
Репутация: 1
|
|
||
|
|||
Иван Человеков |
|
||
Бывалый Профиль
Репутация: нет
|
Fazil6, спасибо в LOCALSQL.HLP нашёл P.S. Если кому понадобится:
Добавлено @ 21:08 |
||
|
|||
|
Правила форума «Delphi: Базы данных и репортинг» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |