Cannot modify a read-only dataset
Estou usando dois TQuery. Um objeto do Delphi e outro crio em tempo de execussão.
De acordo com a opção escolhida pelo usuário eu modifico a ligação do datasource, ora recebendo o resultado da consulta de um TQuery ora de outro e colocando-o num DBGrid.
Quando o datasource está ligado ao Query criado em tempo de execussão e tento edita-lo, recebo essa mensagem:
raised exception class EDatabaseError with message ´Cannot modify a read-only dataset´.
Quando é com o objeto TQuery do Delphi não tenho problemas, é só com o que é criado na hora.
Além do óbvio que a própria mensagem já diz o que posso fazer para poder editar o resultado o que está no grid?
De acordo com a opção escolhida pelo usuário eu modifico a ligação do datasource, ora recebendo o resultado da consulta de um TQuery ora de outro e colocando-o num DBGrid.
Quando o datasource está ligado ao Query criado em tempo de execussão e tento edita-lo, recebo essa mensagem:
raised exception class EDatabaseError with message ´Cannot modify a read-only dataset´.
Quando é com o objeto TQuery do Delphi não tenho problemas, é só com o que é criado na hora.
Além do óbvio que a própria mensagem já diz o que posso fazer para poder editar o resultado o que está no grid?
Peununes
Curtidas 0
Respostas
Beppe
25/08/2005
Qual a SQL da query criada em run-time?
GOSTEI 0
Peununes
25/08/2005
+- isso:
var
qRS : TQuery;
begin
qRS := TQuery.Create(nil);
qRS.DatabaseName := ´banco´;
with qRS do
begin
qRS.Close;
qRS.SQL.Add(´SELECT bla bla bla´);
qRS.SQL.Add(´ From bla bla bla´);
qRS.SQL.Add(´ WHERE bla bla bla);
qRS.Open;
end;
if qRS.isempety then
begin
ds.dataset := qRP //datasourse (ds) recebe do objeto TQuery
dbgrid.datasource := ds;
end
else
begin
ds.dataset := qRS //datasourse recebe do TQuery criado acima
dbgrid.datasource := ds;
end;
Quando ligo o datasource ao objeto não dá problema mas na ligação com o segundo dá o erro citado.
var
qRS : TQuery;
begin
qRS := TQuery.Create(nil);
qRS.DatabaseName := ´banco´;
with qRS do
begin
qRS.Close;
qRS.SQL.Add(´SELECT bla bla bla´);
qRS.SQL.Add(´ From bla bla bla´);
qRS.SQL.Add(´ WHERE bla bla bla);
qRS.Open;
end;
if qRS.isempety then
begin
ds.dataset := qRP //datasourse (ds) recebe do objeto TQuery
dbgrid.datasource := ds;
end
else
begin
ds.dataset := qRS //datasourse recebe do TQuery criado acima
dbgrid.datasource := ds;
end;
Quando ligo o datasource ao objeto não dá problema mas na ligação com o segundo dá o erro citado.
GOSTEI 0
Evaldobarbosa
25/08/2005
Já que você está usando um TQuery para busca de dados e tenta editá-lo, vc tem que colocar junto dele também um componente TUpdateSQL que posa conter os dados de INSERT, UPDATE e DELETE!!!
Espero que resolva o seu problema, pois só conheço esse erro nesse tipo de situação.
Espero que resolva o seu problema, pois só conheço esse erro nesse tipo de situação.
GOSTEI 0
Adriano Santos
25/08/2005
O RequestLive do TQuery precisa ser modificado. Se estiver True ele vai ficar read only e receberá a mensagem mencionada por voce. Se for usar também um UpdateSQL não esqueça de modificar na TQuery também a propriedade CachedUpdates;
GOSTEI 0
Peununes
25/08/2005
Seguinte galera, mandei um show message:
ShowMessage(ds.DataSet.Name); e... surpresa!!! A mensagem vem vazia!!!
Quando altero da segunda vez para o ds receber o Query montado em tempo real a propriedade dataset não está recebendo a query!!
O engraçado é que em tempo real, o ds recebe a consulta feita no objeto TQuery normalmente!!!
Alguém sabe o que está havendo e como resolvo isso?
ShowMessage(ds.DataSet.Name); e... surpresa!!! A mensagem vem vazia!!!
Quando altero da segunda vez para o ds receber o Query montado em tempo real a propriedade dataset não está recebendo a query!!
O engraçado é que em tempo real, o ds recebe a consulta feita no objeto TQuery normalmente!!!
Alguém sabe o que está havendo e como resolvo isso?
GOSTEI 0
Peununes
25/08/2005
Ah, já ia esquecendo! O ds recebe o resultado da query em tempo real, só não estou conseguinto mudar o dataset dela para essa query, para o objeto é sem problemas!!!
GOSTEI 0
Beppe
25/08/2005
ShowMessage(ds.DataSet.Name); e... surpresa!!! A mensagem vem vazia!!!
Quando altero da segunda vez para o ds receber o Query montado em tempo real a propriedade dataset não está recebendo a query!!
Vc que não está interpretando corretamente o resultado. Na verdade, nada anormal occoreu. Componentes criados em runtime naum tem nome(logo Name = ´´). Se o DataSet naum estivesse setado, uma exceção iria ocorrer, como vc acessou uma propriedade dele.
GOSTEI 0