语句如下:
   login_query.Close;
 login_query.SQL.Clear;
 login_query.SQL.Add('select * from admin where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=admin');
 showmessage(login_query.SQL.Text); // 语句提示一
 try
   login_query.Prepare;
    login_query.Open;
    showmessage(inttostr(login_query.RecordCount));// 语句提示二
    if login_query.IsEmpty then
       main_unit.isadmin:=0
    else
      main_unit.isadmin:=1;
  
  except
    showmessage(inttostr(main_unit.isadmin));// 语句提示四
    showmessage('请输入正确的密码!');// 语句提示五
  end;但在执行的过程中,执行到“语句提示二”那里便出错,提示“login_Query:cannot perform this operation on a closed dataset”错误。
请问该怎么解决啊??是怎么回事呢?

解决方案 »

  1.   

    showmessage(inttostr(login_query.RecordCount-1));
      

  2.   

    >>但在执行的过程中,执行到“语句提示二”那里便出错,
    感覺可能性不大, 要麼是出錯, 轉到 except 那里了, 
    如果能到showMessage, 應該是Open了的啊
      

  3.   

    理论上是问题不可能出在
    login_query.Open;
    showmessage(inttostr(login_query.RecordCount));// 语句提示二
    个人觉得问题可能出在login_query.SQL.Add('select * from admin where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=admin');这里。
    你的admin是变量?类型是否匹配?
      

  4.   

    错误的意识是你的数据集没有打开不防试试
    ...
    try
      if login_query.Prepare then
        login_query.Open;
      showmessage(inttostr(login_query.RecordCount));
    ...
    except
    ...
    end;
      

  5.   

    楼主去掉login_query.Open这句试试,应该可以了
      

  6.   

    错了,是去掉login_query.Prepare (呵呵copy错了)
      

  7.   

    在login_query.Open;前面加上这条语句
    login_query.active:=true;
      

  8.   

    TO:Shiyl(云淡风清(回到梦开始的地方)) 
    admin不是变量,是一个值,类型是对的啊,我把语句写成:login_query.SQL.Add('select * from admin where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=''admin''');也不行。
    TO:luke5678(~类~) 
      那样也不行,不管login_query.Open有没有去掉,都是那样的错误啊
      

  9.   

    试试
    login_query.SQL.Add('select * from admin where admpwd='''+char(39)+ edit1.Text +char(39)+''' and admname=''admin''');
    还有你的表最好不要用admin。
      

  10.   

    TO: yuhouyangguang(雨后阳光)
       还是不行的啊,我把表的名字改成:admuser了,但还是那样的错误的啊!
       55555,怎么办啊?
      

  11.   

    楼主我说的是去掉login_query.Prepare 
    我觉的这句加在这里没多大意义
    如果ConnectString没有错的话,那么以下代吗应该是可以通过的啊(我机子上装了MySql)login_query.Close;
    login_query.SQL.Clear;
    login_query.SQL.Add('select * from admin where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=admin');
    login_query.SQL.Open;
    showmessage(inttostr(login_query.RecordCount));
    因该是可以通过的啊
    如果还有问题再贴出来,大家再研究.
      

  12.   

    建议单步跟踪一下,看是在哪一句出现的错误,打开数据库前加上login_query.active:=true;
     如果Query不是反复使用的话,去掉login_query.Prepare , Note: When you change the text of a query at runtime, the query is automatically closed and unprepared.
      

  13.   

    TO:luke5678(~类~) 
        还不行啊,我用的是ODBC,不是用的ADO,还是说没有打开TO:IFindit(寻找其中的乐趣)
        就是那句错了啊:login_query.Open;就那句错了,
       根本就没有打开。
      还有办法吗?
      

  14.   

    应该你是的SQL语句错误导致不能OPEN,显示RECORDCOUNT当然出错,你可单步跟踪看看是不是这样,应该在OPEN时候出错吧
      

  15.   

    你先静态连接试一下, 如果connection没问题, 将auery 的active置成True,看看行不行,估计query的connection根本就没有连接上!
      

  16.   

    我用的Tquery,不是用的ADO,没有connection啊,但我把tquery组件的active置为True时,弹出一个框,输入用户名和密码,输入后是可以的,连上了啊!完整代码如下:
      
      login_unit:   //登陆窗口     unit login_Unit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, DBTables, ADODB;type
      Tlogin_Form = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      login_Form: Tlogin_Form;implementationuses main_unit,login_model_unit;{$R *.dfm}procedure Tlogin_Form.Button2Click(Sender: TObject);
    begin
    close;
    end;procedure Tlogin_Form.Button1Click(Sender: TObject);
    begin
     if edit1.Text='' then
        begin
            showmessage('请输入登陆密码!');
            exit;
        end;
     with login_datamodule do
     begin
     login_query.Close;
     login_query.SQL.Clear;
     login_query.SQL.Add('select * from admuser where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=admin');
     showmessage(login_query.SQL.Text);
     try
       // login_query.Prepare;
        login_query.Active;
        login_query.Open;
        showmessage(inttostr(login_query.RecordCount));
        if login_query.IsEmpty then
           main_unit.isadmin:=1
        else
          main_unit.isadmin:=0;
          showmessage(inttostr(main_unit.isadmin));
      except
        showmessage(inttostr(login_query.RecordCount));
        showmessage(inttostr(main_unit.isadmin));
        showmessage('请输入正确的密码!');
      end;
      end;
    end;end.
    login_model_Unit;  //数据模块   unit login_model_Unit;interfaceuses
      SysUtils, Classes, DB, DBTables;type
      Tlogin_DataModule = class(TDataModule)
        modi_pass_Query: TQuery;
        login_Query: TQuery;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      login_DataModule: Tlogin_DataModule;implementation{$R *.dfm}end.数据模块窗体中:两个TQuery组件的Databasename为所建的数据源的名称。我个人觉得是没有连上数据库,所以根本OPEN不了,但代码应该没有错的啊,昨天再加了个Tdatabase组件,结果是一样的。
      

  17.   

    我连的是SQL数据库,是在远程的,不是本地数据库。
      

  18.   

    login_query.Active;////这个好像是多余的
        login_query.Open;//有这个就什么都有了。ACTIVE我从来没用过。
      

  19.   

    先测试数据源配置,既
    Query1.DatabaseName := '数据源名称'
    在控制面板下的数据源找到相应的数据源测试一下连接就可以了
    如果测试成功那连接应该没问题了。
      

  20.   

    TO: luke5678(~类~) 
       我测试过了啊,要管理工具里的ODBC客户端里测试是测试完全成功!
       在程序里,测试时,把login_query.active 设为True时,弹出一个窗口,要求输入用户名和密码,只要输入sa 和sa的登陆密码,就可以连上。我的程序应该没有问题吧!
     我真找不出问题所在,是不是数据库有问题或是ODBC有问题啊??
      

  21.   

    login_query.SQL.Add('select * from admuser where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=admin');
    如果admname字段是字符型的话admin前后应该加上两个单引号
    否则SQL语句执行不了
      

  22.   

    改成这样应该没问题了
    login_query.SQL.Add('select * from admuser where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=''admin''');
      

  23.   

    TO: aley(冰雷) 
      
       不行的,都试过了,都不行啊
      

  24.   

    怪了去了, 我这和你的代码一模一样,没问题, 就是SQL语句,比较简单.我连接的是远程infomix数据库,你的程序应该不大发给我也可以[email protected]
      

  25.   

    注,我是在DATAbaseName那里写的我远程数据库的数据源名称!
      

  26.   

    TO: IFindit(寻找其中的乐趣) 
      
        我已经给你发邮件了,我弄不明白了。
       请你帮我看看吧!
      

  27.   

    ixingarden(心愿) ,  你的程序我已经收到, 我在本地SQLSERVER上建立了一个你一模一样的表,数据库,同样名称的数据源,    你的代码一点没动,没有发现错误。然后连接远程informix数据库,把aliasName改为它的数据源名GInformix,也没有发现问题,后来我在你的Open数据库后加了一句ogin_query.SQL.Add('select * from cs_asite');对Sql的操作才总是有了“提示“login_Query:cannot perform this operation on a closed dataset”的错误。我想提示此错误肯定不是因为Open,而是因为Open后,因为操作其中的SQL语句所致的数据集关闭!
      

  28.   

    可是我的open后面,只是让程序弹出个提示而已啊,并没有哪里会把数据集给关闭的啊,
    这就奇怪了!
      

  29.   

    还是open的问题,open后面加一句简单的showmessage('aaaaaa');程序运行时都不会执行,没有弹出提示框,而是转到except语句块中去了。
      

  30.   

    问题可能处在DBE上,因为使用DBE在连接数据库的时候总是会弹出一个窗口,让输入密码。
    但是在程序中却把OPEN放在了TRY  EXCEPT中间,这样的话程序可能认为那个输入密码的窗口是错误就跳到了EXCEPT后面去了。
    建议把
    login_query.Open;
    放到TRY EXCEPT外面试试。。
      

  31.   

    奇怪,我把try except去掉后,提示错误说是:用户名(null)登陆失败,Unkown user name or password.Alias:one_card.
      

  32.   

    再问:DELPHI里用ODBC连远程SQL SERVER数据库是怎么样连的?
    我上面那样应该是没有错误的啊??
    怎么会那样呢??
      

  33.   

    ixingarden(心愿),  不知道你的问题解决了没有,如果你建立数据源时,改为window验证,以上错误将不会出现!
      

  34.   

    BDE和micrsoft的东西最好不要一起用了,还是用ADO吧!
      

  35.   

    谢谢,问题已经解决!
    谢谢大家的帮助,是tdatabase的设置错误,没有把loginpropt 设为FALSE
    结帖,散分,
    分不多,不好意思!