高手帮忙!!
做一个用户登录注册界面,在登录界面点击注册时delphi报错q_stu:Cannot perform this operation on a open dataset (q_stu为query name)   属性:active:true requsetlive:true注册窗体代码如下  
unit Unit2;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Mask, DBCtrls,unit1;type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Btn_tj: TButton;
    Btn_exit: TButton;
    L_name: TLabel;
    L_password: TLabel;
    L_qrp: TLabel;
    Label3: TLabel;
    DBEdt_name: TDBEdit;
    DBEdt_password: TDBEdit;
    DataSource1: TDataSource;
    edt_qrp: TEdit;
    procedure Btn_exitClick(Sender: TObject);
    procedure Edt_qrpChange(Sender: TObject);
    procedure Btn_tjClick(Sender: TObject);
    procedure DBEdt_nameChange(Sender: TObject);
    procedure DBEdt_passwordChange(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form2: TForm2;
implementation
{$R *.dfm}procedure TForm2.Btn_exitClick(Sender: TObject);
begin
 close;
end;
procedure TForm2.Edt_qrpChange(Sender: TObject);
begin
if(dbedt_password.Text<>edt_qrp.Text) then L_qrp.Caption:='与原密码不符'
else  L_qrp.Caption:='';
end;procedure TForm2.Btn_tjClick(Sender: TObject);
var str:string;
begin
str:='insert into student(sname,sno) values(';
str:=str+''''+dbedt_name.Text+''''+dbedt_password.Text+'''';
if(L_name.Caption<>'') or (L_password.Caption<>'') or (L_qrp.Caption<>'')
  or (dbedt_name.Text='') or (dbedt_password.Text='') or (edt_qrp.Text='')
  then
  begin
  showmessage('填写不正确!');
  dbedt_name.SetFocus;
  exit;
  end;
    form1.q_stu.close;
    form1.q_stu.sql.clear;
    form1.q_stu.sql.add(str);
    form1.q_stu.open;
    form1.Q_stu.UpdateRecord;
    showmessage('注册成功!');
end;procedure TForm2.DBEdt_nameChange(Sender: TObject);
begin
form1.q_stu.close;
form1.q_stu.sql.clear;
form1.q_stu.sql.add('select sname from student');
form1.q_stu.sql.add('where sname='''+dbedt_name.Text+'''');
form1.q_stu.Open;
if form1.q_stu.RecordCount<>0
 then L_name.Caption:='用户名已存在'
 else  L_name.Caption:='';
 if(length(dbedt_name.Text)>15) then L_name.Caption:='不超15字';
end;procedure TForm2.DBEdt_passwordChange(Sender: TObject);
begin
  if(length(dbedt_password.Text)>20) then L_password.Caption:='密码不超20字';
end;procedure TForm2.FormShow(Sender: TObject);
begin  form1.Q_stu.Append;
  dbedt_name.SetFocus;
end;end.

解决方案 »

  1.   

    注册按钮下的
    form1.q_stu.open;
    修改为
    form1.q_stu.ExecSQL;
      

  2.   

    只有select之类的查询语句才能用open,其它如update,insert,delete等更新数据的语句必须用ExecSQL
      

  3.   

    adoquery.open是要返回一个数据集的,一般select要用open,insert,update没有数据集返回要用ExecSql
      

  4.   

    adoquery.open是要返回一个数据集的,一般select要用open,insert,update没有数据集返回要用ExecSql
      

  5.   

    提交數據要用execsql
    還有類似的ado錯誤是因為:ado是非insert或edit狀態,所以要:
     if qry_hrqj.State in [dsedit,dsinsert] then