procedure Tlogin.Button1Click(Sender: TObject);
var
   n,s:string;
begin
   //DBcombobox1是用户名
   n:=DBCombobox1.text;
   //Edit2是密码
   s:=Edit2.text;
   //判断用户名和密码是否存在
   with ADOQuery1 do
    begin
    close;
    sql.clear;
    sql.add('select * from login where name=:t1 and passw=:t2');
    parameters[0].value:=n;
    parameters[1].value:=s;
    open;
    //如果用户名和密码不正确
    if recordcount<1 then
    begin
    showmessage('用户名与密码不符,请重新输入密码!');
    end else
    //用户名和密码正确
    begin
    showmessage('登陆成功!');
    login.close;
    end;
  end;
  //如果用户选择浏览数据
  if RadioButton1.Checked=true then
     begin
      //判断数据表在数据库中有没有
      with DataModule1.ADOQuery1 do begin
      SQL.Clear;
      SQL.Add('SELECT * FROM sysobjects WHERE name=:st AND type=''U''');
      Parameters.ParamByName('st').value:='gz'+Edit1.Text;
      Open;
      end;
      //如果返回值(有数据表)
      if not DataModule1.ADOQuery1.IsEmpty then
      begin
       //设置DataModule1.ADODataset1数据源为要浏览的数据表
       with DataModule1.ADODataset1 do begin
       commandtext:='';
       commandtype:=cmdText;
       commandtext:='select * from'+' '+'gz'+Edit1.text;
       open;
       end;
      end
      //如果没有返回值(没有数据表)
      else begin
      showmessage('对不起!没有'+Edit1.text+'月份的工资');
      end;
     end;
   //如果用户选择增加工资模式
   if RadioButton2.Checked=true then
      begin
      //复制上一个月的工资表到以这个月命名的表中
      with DataModule1.ADOCommand1 do begin
      commandtext:='';
      commandtype:=cmdtext;
      commandtext:='SELECT * into'+' '+'gz'+Edit1.text+' '+'from'+' '+'gz'+leftstr(Edit1.text,4)+inttostr(strtoint(Rightstr(Edit1.text,2))-1);
      execute;
      end;
      //更新新加表格的日期字段的值为最新月份
      with DataModule1.ADOCommand1 do begin
      commandtext:='';
      commandtype:=cmdtext;
      commandtext:='update'+' '+'gz'+Edit1.text+' '+'set'+' '+'rq='+Edit1.text;
      execute;
      end;
      //判断新增表的结果是否正确
      with DataModule1.ADOQuery1 do begin
      sql.clear;
      sql.add('select * from'+' '+'gz'+Edit1.text);
      open;
      end;
      //判断是否增加成功
      if not DataModule1.ADOQuery1.IsEmpty then
      begin
       //如果成功,设置DataModule1.ADODataset1数据源
       with DataModule1.ADODataset1 do begin
        commandtext:='';
        commandtype:=cmdText;
        commandtext:='select * from'+' '+'gz'+Edit1.text;
        open;
        end;
      end
      //如果不成功
      else begin
      showmessage('对不起!不能生成'+Edit1.text+'月份的工资');
      end;
      end;
end;
请各位看看错误出在哪里?
运行以后总是提示我这里有错:
//设置DataModule1.ADODataset1数据源为要浏览的数据表
       with DataModule1.ADODataset1 do begin
       commandtext:='';
       commandtype:=cmdText;
       commandtext:='select * from'+' '+'gz'+Edit1.text;
       open;
       end;
提示信息:
cannot perform this operation on an open dataset.

解决方案 »

  1.   

    设置属性前要先关闭数据集.       with DataModule1.ADODataset1 do begin
           Close;//
           commandtext:='';
           commandtype:=cmdText;
           commandtext:='select * from'+' '+'gz'+Edit1.text;
           open;
           end;
      

  2.   

    你在Data Access中拉一个DataSource控件下来,设置它的DataSet为你的ADOQuery就可以了,再将DBGRID的属性改一下就OK了!
      

  3.   

    说得不好别笑话,我常用的几个函数//取符合条件的一条记录的某字段的值
    function TFormMainWin.getFieldBySQL(SQLStr : string) : string;
    var
      getFieldValue : string;
    begin
      if ExecSQLResult(SQLStr, mySQLQResult) then
        if not (mySQLQResult.Bof and mySQLQResult.Eof) then
          getFieldValue := mySQLQResult.FieldByName('FFieldValue').AsString;
      mySQLQResult.Close;  Result := getFieldValue;
    end;//返回返回记录集的SQL
    function TFormMainWin.ExecSQLResult(SQLStr : string; TmpQuery : TmySQLQuery) : Boolean;
    begin
      try
        with TmpQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add(SQLStr);
          Open;
        end;
        Result := True;
      except
        //尝试失败,则返回假值
        Result := False;
      end;
    end;//执行无返回值的SQL
    function TFormMainWin.ExecSQLNoResult(SQLStr : string) : Boolean;
    begin
      try
        with mySQLQOnce do
        begin
          Close;
          SQL.Clear;
          SQL.Add(SQLStr);
          ExecSQL;
          Close;
        end;
        Result := True;
      except
        //尝试失败,则返回假值
        Result := False;
      end;
    end;
    一般的问题都可以用这几个函数解决登陆:
    if getFieldBySQL('Select Count(FAutoID) As FFieldValue From tLogin Where (name=...) And (passw=...)') = '0' then
    begin
      //登陆不成功
      ...
    end;commandtype:=cmdtext;//不需要设置,我从来没用过Parameters.ParamByName('st').value:='gz'+Edit1.Text;//是个好东西,但我也从来不用它,我把SQL语句分成几行写,每行是一个字段,类似于SQLStr := 'Update ttable Set' +
              ' username = ''' + username.text + ''',' +
              ' userpass = ''' + userpass.text + '''' +
              ' Where userid = ''' + userid.text + '''';
    同样非常明了
      

  4.   

    整个程序我只用了一个CONNECTION,二个临时记录集,一个叫SQLQONCE,一个叫SQLQRESULT,二个打开的记录集,对应两个数据源,SQLQMAIN,SQLQSUB。四个都是SQLQUERY,当前用的是mySQLQuery,属于MySQLDAC,在此打一广告,特别好用。发布程序时,只需把MYSQL系统的libmySQL.DLL,288K放在程序相同目录下即可。不需客户安装任何驱动。程序转换成ADO时,只需把CONNECTION改一下连接字符串,几个QUERY相同名称即可。
    当然,在程序中的SQL语句要注意符合ANSI SQL标准,不要使用LIMIT或TOP等语句