用TQUERY删除数据后,在提交数据时说数据集状态不可编辑,如何修改TQUER才能行呀

sduzjw 2003-03-26 05:23:34
如上了
...全文
47 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
afei78223 2003-03-27
  • 打赏
  • 举报
回复
根据上面的代码可以看到当执行了EXECSQL后,如果Query不处于编辑状态,是不需要Post的,否则会出现错误提示,只有当Query处于编辑状态,如使用了如下的语句删除记录:
if Query.State<>dsEdit then
Query.Edit
Query.Delete
后才需要使用Query.Post;
在执行Query.Delete语句前,必须保证Query处于编辑状态,否则也会出错。
sduzjw 2003-03-27
  • 打赏
  • 举报
回复
那删除后还需要提交吗
afei78223 2003-03-26
  • 打赏
  • 举报
回复
Post是不需要的,直接执行了EXECSQL后就会把数据库的内容删除掉的

下面是TDataSet.Post的源代码:
procedure TDataSet.Post;
begin
UpdateRecord;
case State of
dsEdit, dsInsert:
begin
DataEvent(deCheckBrowseMode, 0);
CheckRequiredFields;
DoBeforePost;
CheckOperation(InternalPost, FOnPostError);
FreeFieldBuffers;
SetState(dsBrowse);
Resync([]);
DoAfterPost;
end;
end;
end;
而UpdateRecord的代码如下:
procedure TDataSet.UpdateRecord;
begin
if not (State in dsEditModes) then DatabaseError(SNotEditing, Self);
DataEvent(deUpdateRecord, 0);
end;
其中 dsEditModes = [dsEdit, dsInsert, dsSetKey];
所以当Query1的State不在dsEdit,dsInsert和dsSetKey时会调用
DatabaseError(SNotEditing, Self);这一句

SNotEditing在DbConsts.pas单元定义如下:

SNotEditing = 'Dataset not in edit or insert mode';
也就是你所碰到的“数据集状态不可编辑”的错误
这样的解释满意了吗?
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
大哥,,可以搞定了,但还是有点不理角,虽然问题解决了,可是我觉得过程中有点欠缺,

不管怎样,我得给分了
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
我觉得能行,可是这种修改是直接对数据库操作的呢,还是需要用POST将缓存中的数据写入库中,

不过我也写过不用提交也可以库中数据的代码,
afei78223 2003-03-26
  • 打赏
  • 举报
回复
把Post去掉行不行?
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
能解决问题的话,分全是你的
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
到post便提示说dataset not in edit or insert mode;;;;;;;;;;
afei78223 2003-03-26
  • 打赏
  • 举报
回复
设置一个断点,单步运行一下,看看在执行到哪一句的时候出现错误提示的!
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
能解决问题的话,可以再加分的,,
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
当然没必要刷新,只要在删除后能提交到数据库就行
afei78223 2003-03-26
  • 打赏
  • 举报
回复
把上面的Query1.Post都去掉试一下,如果必须要刷新,可以用下面的代替:
Query1.Close;
Query1.Open;
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
帮忙看一下拉
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
procedure Tperson.N3Click(Sender: TObject);
var
departdel,content:string;
query1:tquery;
//TEMPtable:ttable;
begin
departdel:=person.TreeView1.Selected.Text;
content:='确认删除:'+departdel;
if Application.MessageBox(pchar(content),'提示',mb_okcancel or mb_iconinformation)=mrok then
try
try
xldm.DB_XL.StartTransaction;

query1:=tquery.Create(self);
query1.Databasename:='DBXL';
//query1.Database.ReadOnly:=false;
query1.Close; //delete the department
query1.SQL.Clear;
query1.SQL.Add('delete from department where id=:departID');
query1.ParamByName('departID').AsString:=pstring(person.TreeView1.Selected.Data)^;
//query1.Prepare;
query1.RequestLive:=true;

query1.ExecSQL;

//query1.Edit;
query1.Post;

query1.Close; //delete the relation person
query1.SQL.Clear;
query1.SQL.Add('delete from person where id=:departID');
query1.ParamByName('departID').AsString:=pstring(person.TreeView1.Selected.Data)^;
//query1.Prepare;
query1.RequestLive:=true;
query1.ExecSQL;
query1.post;


xldm.DB_XL.Commit;

treeview1.Items.Delete(treeview1.Selected);
table1.close;
table1.open;
table2.close;
table2.Open;
finally
query1.Free;
end;

except
xldm.DB_XL.Rollback;

end;

end;
afei78223 2003-03-26
  • 打赏
  • 举报
回复
你把你删除更新数据的代码贴上来,看看到底错在哪里?
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
大哥,又出错了,它说数据集没有打开呀,,,



afei78223 2003-03-26
  • 打赏
  • 举报
回复
如果你是使用Query.Delete方法来删除记录的话,Query要处于编辑状态
可以在Query.Delete前加上
if NOT Query.CanModify then
Query.Edit;

sduzjw 2003-03-26
  • 打赏
  • 举报
回复
各位老大怎么还不行呀,拉小弟一把吧
sduzjw 2003-03-26
  • 打赏
  • 举报
回复
大哥,还没有解决问题呀,还是提示dataset not in edit or insrt mode
afei78223 2003-03-26
  • 打赏
  • 举报
回复
在EXECSQL前加上一举
Query.RequestLive:=True;
加载更多回复(2)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧