Table is read only(100分)

  • 主题发起人 主题发起人 nkczx
  • 开始时间 开始时间
N

nkczx

Unregistered / Unconfirmed
GUEST, unregistred user!
当我用到Query1.prepare时
总出现Table is read only
把prepare;注释掉时,则顺利
不知何故?

我用的是sybase sql anywhere 7.0
 
你的QUEYR的查询语句是什么?
 
贴源代码出来!
 
经调试第一次执行到showmessage('4.8'); 第二次在showmessage('4.8');后出错

procedure TForm_main.Button3Click(Sender: TObject);
var once:boolean;
begin
once:=true;
with dm_main.query_select_2 do
begin //A
// dm_main.query_select_2.DisableControls;
first;
while not eof do
begin//B
if once=false then next;
once:=false;
showmessage('1');
with dm_main.query_tmp do
begin //C
close;
sql.clear;
sql.add('select * from t_b_i_movein_detail where cig_code=:cig_code');
parambyname('cig_code').asstring:=dm_main.query_select_2.fieldbyname('cig_code').asstring;
prepare;
open;
end;//C
showmessage(dm_main.query_select_2.fieldbyname('cig_code').asstring);
if dm_main.query_tmp.IsEmpty then
begin//C
showmessage('2.01');
with dm_main.query_insert do
begin //D
showmessage('2.05');
close;
showmessage('2.1');
sql.clear;
showmessage('2.2');
sql.add('insert into t_b_i_movein_detail(cig_code,movein_no,cur_package_amount) values(:cig_code,:movein_no,:cur_package_amount)');
params[0].AsString:=dm_main.query_select_2.fieldbyname('cig_code').asstring;
params[1].AsString:=dm_main.query_select_1.fieldbyname('movein_no').asstring;
params[2].AsString:=dm_main.query_select_2.fieldbyname('cur_package_amount').asstring;
showmessage('2.3');
if not (Prepared) then prepare;
showmessage('2.5');
ExecSQL;
showmessage('3');
close;
sql.clear;
sql.add('insert into t_b_i_movein_detail(cig_code,movein_no,cur_package_amount) values(:cig_code,:movein_no,:cur_package_amount)');
params[0].AsString:=dm_main.query_select_2.fieldbyname('cig_code').asstring;
params[1].AsString:='0';//dm_main.query_select_1.fieldbyname('movein_no').asstring;
params[2].AsString:=dm_main.query_select_2.fieldbyname('cur_package_amount').asstring;
if not (Prepared) then prepare;
execsql ;
showmessage('4');
end;//D
end//C
else begin //C
showmessage('4.5');
with dm_main.query_insert do
begin //D
close;
showmessage('4.6');
requestlive:=true;
sql.clear;
sql.add('insert into t_b_i_movein_detail(cig_code,movein_no,cur_package_amount) values(:cig_code,:movein_no,:cur_package_amount)');
params[0].AsString:=dm_main.query_select_2.fieldbyname('cig_code').asstring;
params[1].AsString:=dm_main.query_select_1.fieldbyname('movein_no').asstring;
params[2].AsString:=dm_main.query_select_2.fieldbyname('cur_package_amount').asstring;
showmessage('4.8');
prepare;
showmessage('5');
ExecSQL;
showmessage('6');
close;
requestlive:=true;
sql.clear;
sql.add('select * from t_b_i_movein_detail where cig_code=:cig_code and movein_no=''0'';');
dm_main.query_insert.parambyname('cig_code').asstring:=dm_main.query_select_2.fieldbyname('cig_code').asstring;
prepare;
open ;
showmessage('6.3');
edit;
showmessage('6.5');
dm_main.query_insert.fieldbyname('cur_package_amount').asfloat:=fieldbyname('cur_package_amount').asfloat+dm_main.query_select_2.fieldbyname('cur_package_amount').asfloat;
post;
showmessage('7');
close;
end; //D
end;//C
end; //B
// dm_main.query_select_2.EnableControls;

end;//A
dm_main.query_select_3.close;
dm_main.query_select_3.Open;
end;
 
show message('2');等为调试用
 
你应该再放一updateSQL控件,然后与去query连起就行!因为你的SQL语句中涉及2个表以上!
 
解决问题者,再加300分
 
你换一种数据库再试一试,可能是SQL anywhere不支持prepare
 
有时很怪,第一次可执行,第二次却出错
 
有时注释prepare;query。open时也会出现Table is read only
 
query1.requestlive:=false;
 
如果query1.requestlive:=false; 则只能用sql语句对数据库操作,不能用query的函数,
如果要用函数的话,query1.requestlive:=true;不能同时用sql语句
 
在execsql后加refresh
因数据更新后没有刷新
 
听一朋友说,他也遇到过如此问题,
最后在showmessage('4.6');处,加open;再加close;
就可以了
或许是Delphi的一个Bug吧
可以试一试
 
把不该用requestlive:=true;的去掉,即可
我试过
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
2K
import
I
I
回复
0
查看
994
import
I
后退
顶部