语句如下:
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”错误。
请问该怎么解决啊??是怎么回事呢?
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”错误。
请问该怎么解决啊??是怎么回事呢?
感覺可能性不大, 要麼是出錯, 轉到 except 那里了,
如果能到showMessage, 應該是Open了的啊
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是变量?类型是否匹配?
...
try
if login_query.Prepare then
login_query.Open;
showmessage(inttostr(login_query.RecordCount));
...
except
...
end;
login_query.active:=true;
admin不是变量,是一个值,类型是对的啊,我把语句写成:login_query.SQL.Add('select * from admin where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=''admin''');也不行。
TO:luke5678(~类~)
那样也不行,不管login_query.Open有没有去掉,都是那样的错误啊
login_query.SQL.Add('select * from admin where admpwd='''+char(39)+ edit1.Text +char(39)+''' and admname=''admin''');
还有你的表最好不要用admin。
还是不行的啊,我把表的名字改成:admuser了,但还是那样的错误的啊!
55555,怎么办啊?
我觉的这句加在这里没多大意义
如果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));
因该是可以通过的啊
如果还有问题再贴出来,大家再研究.
如果Query不是反复使用的话,去掉login_query.Prepare , Note: When you change the text of a query at runtime, the query is automatically closed and unprepared.
还不行啊,我用的是ODBC,不是用的ADO,还是说没有打开TO:IFindit(寻找其中的乐趣)
就是那句错了啊:login_query.Open;就那句错了,
根本就没有打开。
还有办法吗?
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组件,结果是一样的。
login_query.Open;//有这个就什么都有了。ACTIVE我从来没用过。
Query1.DatabaseName := '数据源名称'
在控制面板下的数据源找到相应的数据源测试一下连接就可以了
如果测试成功那连接应该没问题了。
我测试过了啊,要管理工具里的ODBC客户端里测试是测试完全成功!
在程序里,测试时,把login_query.active 设为True时,弹出一个窗口,要求输入用户名和密码,只要输入sa 和sa的登陆密码,就可以连上。我的程序应该没有问题吧!
我真找不出问题所在,是不是数据库有问题或是ODBC有问题啊??
如果admname字段是字符型的话admin前后应该加上两个单引号
否则SQL语句执行不了
login_query.SQL.Add('select * from admuser where admpwd='+char(39)+ edit1.Text +char(39)+' and admname=''admin''');
不行的,都试过了,都不行啊
我已经给你发邮件了,我弄不明白了。
请你帮我看看吧!
这就奇怪了!
但是在程序中却把OPEN放在了TRY EXCEPT中间,这样的话程序可能认为那个输入密码的窗口是错误就跳到了EXCEPT后面去了。
建议把
login_query.Open;
放到TRY EXCEPT外面试试。。
我上面那样应该是没有错误的啊??
怎么会那样呢??
谢谢大家的帮助,是tdatabase的设置错误,没有把loginpropt 设为FALSE
结帖,散分,
分不多,不好意思!