根据上面的代码可以看到当执行了EXECSQL后,如果Query不处于编辑状态,是不需要Post的,否则会出现错误提示,只有当Query处于编辑状态,如使用了如下的语句删除记录:
if Query.State<>dsEdit then
Query.Edit
Query.Delete
后才需要使用Query.Post;
在执行Query.Delete语句前,必须保证Query处于编辑状态,否则也会出错。
下面是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';
也就是你所碰到的“数据集状态不可编辑”的错误
这样的解释满意了吗?
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;