当前位置:主页>delphi7/进销存和数据库> 文章内容

SQLSERVER2000数据库的登陆

发布时间:2010-01-26 | QQ免费站
1楼: 我现在想用ADO控件来做一个登陆界面,在登陆窗体中我加入了一个ADOCONNECT,ADOQUERY,AODTABLE,DATASOURCE,不过我看ADOTABLE和DATASOURCE不用也好象可以吧,我设置好了ADOCONNECT和ADOQUERY,数据库也很好,没问题,可是在我运行程序时,出现“口令不对,请核对”,可是我在EDIT里输入的用户名和密码都是正确的,不知怎么回事,是我下边的程序有问题还是控件设置有错误呢,请富翁们解答,谢谢 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ADODB, DB; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; DataSource1: TDataSource; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses unit2; {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); begin adoquery1.disablecontrols; try adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add(‘select * from denglu where yonghuming=‘‘‘+edit1.Text+‘‘‘‘); adoquery1.open; finally adoquery1.enablecontrols; end; if adoquery1.fields[0].value=Null then begin showmessage(‘budui‘+#13+#13+‘queren‘); exit; end; if adoquery1.fields[0].value=Edit2.text then begin form2.show; self.Close; end else begin showmessage(‘口令不对‘+#13+#13+‘请核对‘); exit; edit1.SetFocus; end; end; end. 字串1

2楼: 什么数据库?SQLSERVER吗?是不是空格的问题?(字段类型为定长字串)

字串5

3楼: Trim(adoquery1.fields[0].value)试试 字串4

4楼: 喔对了标题写的是SQLSERVER 不过这和登录有什么关系? 不是已经登录上了吗? 字串3

5楼: 把adoquery1.sql.add(‘select * from denglu where yonghuming=‘‘‘+edit1.Text+‘‘‘‘); 改成 adoquery1.sql.add(‘select * from denglu where yonghuming=‘‘‘+trim(edit1.Text)+‘‘‘‘);试试 字串7

6楼: 兄弟这段代码质量实在不么样,首先adoquery1.disablecontrols;多此一举, 删掉,另外 if adoquery1.fields[0].value=Null then begin showmessage(‘budui‘+#13+#13+‘queren‘); exit; end; 你是判断数据库为空吗?其实也不必这样,adoquery1.fields[0].value=Edit2.text 逻辑关系有点。。。。改为edit2.text=adoquery1.fields[0].value或许更清楚,虽然你结果也对,最后查询约束用到eidt类控件最好加上trim!! 字串1

7楼: 如果判斷空的話用ADOQuery1.fields[0].isnull trim(edit1.text)樓上的都說了,除了這個,更可能的原因 一,表結構甚麼樣子?你能肯定你fields[0]取出的就是yonghuming字段的值? 二,如果你的yonghuming是char類型就鐵定不對了,char類型裡面包含很多空格 if adoquery1.fields[0].value=Edit2.text then 應該改成 if trim(adoquery1.fieldbyname(‘yonghuming‘).asstring)=trim(edit2.text) then 字串4

8楼: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ADODB, DB; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; DataSource1: TDataSource; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; ADOTable1: TADOTable; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses unit2; {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); begin adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add(‘select * from denglu where yonghuming=‘‘‘+trim(edit1.Text)+‘‘‘‘); adoquery1.open; if adoquery1.fields[0].value=Null then begin showmessage(‘用户名不对‘+#13+#13+‘请确认‘); exit; end; if trim(edit2.text)=trim(adoquery1.fieldbyname(‘mima‘).asstring) then begin form2.show; self.Close; end else begin showmessage(‘密码不对‘+#13+#13+‘请核对‘); exit; edit1.SetFocus; end; end; end. 这是照您的指导修改的程序,可是现在运行程序就返回,什么提示也没给出,怎么回事呢?

字串8

9楼: unit u_frmLogin; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, Db, ADODB,Dialogs; type TfrmLogin = class(TForm) Label1: TLabel; txtPassword: TEdit; OKBtn: TButton; CancelBtn: TButton; Label2: TLabel; cmbUserName: TComboBox; ADOTable1: TADOTable; procedure CancelBtnClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure OKBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } bolSuccess:Boolean; //默认为False,True表示登录成功! procedure ListUserName; //列出用户帐号到ComboBox public { Public declarations } end; var frmLogin: TfrmLogin; implementation uses u_frmMain; {$R *.DFM} procedure TfrmLogin.CancelBtnClick(Sender: TObject); begin Close; //退出登录 end; procedure TfrmLogin.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=True; //允许关闭登录对话框。 if not bolSuccess then //退出登录,则关闭登录对话框,再结束程序! frmMain.Close; //关闭主窗口,也就是关闭程序。 end; procedure TfrmLogin.OKBtnClick(Sender: TObject); begin {IndexOf方法从ComboBox中查找指定的文本,如果找到则返回索引值,否则返回-1} if cmbUserName.Items.IndexOf(cmbUserName.Text)<0 then ShowMessage(‘请选择正确的用户帐号!‘) else begin {在数据表中将当前指针移到用户所选择的帐,至于怎么移,还有很复杂的算法, 一口气写下来,这么多,现在正在头痛,不写了,给你一个动脑的机会!^_^! } {这里要求用户编号必须是10位,否则分离出来的用户编号就不正确!} if not ADOTable1.Locate(‘No‘, Copy(cmbUserName.Text,1,10),[]) then begin ShowMessage(‘找不到该帐号,请确定输入或设置的帐号是否正确!‘); exit; //退出该过程 end; {比较用户输入的密码!} if txtPassword.Text=ADOTable1.FieldByName(‘Password‘).AsString then begin bolSuccess:=True; Close; end else begin ShowMessage(‘密码错误,请重新输入!‘); {先将焦点移到别的地方,再将焦点移回密码输入框,就可以选中 密码输入框的文本,等待输入,这是一个秘技哦!不要说没什么,打击我!哼!} OKbtn.SetFocus; txtPassword.SetFocus; end; end; end; procedure TfrmLogin.ListUserName; var i:Integer; begin ADOTable1.Close; ADOTable1.Connection:=frmMain.ADOConnection1; ADOTable1.TableName:=‘Users‘; //数据表名称! ADOTable1.Open; //打开数据库表 cmbUserName.Clear; //先清空ComboBox for i:=0 to ADOTable1.RecordCount-1 do begin cmbUserName.Items.Add(ADOTable1.FieldByName(‘No‘).AsString+‘:‘+ ADOTable1.FieldByName(‘Name‘).AsString); ADOTable1.Next; end; end; procedure TfrmLogin.FormCreate(Sender: TObject); begin ListUserName; //列出用户帐号 end; end. 字串3

10楼: 你这段代码 if adoquery1.fields[0].value=Null then begin showmessage(‘用户名不对‘+#13+#13+‘请确认‘); exit; end; 只是判断了该表第一个字段是否为空,根本就没有达到判断用户名是否正确的目的,建议改成这样if adoquery1.fields[0].value<>trim(edit1.text) then ....
字串4

11楼: 不过我看还是有问题,那是不是我用的控件有问题,我用了ADOCONNECT和ADOQUERY,里面的设置应该是没问题的,难道还少哪个控件吗

字串7

12楼: if trim(edit2.text)=trim(adoquery1.fieldbyname(‘mima‘).asstring) then begin form2.show; self.Close; end 按理說是走到這裡面了吧,當然不會出信息了 不知道你form2.show是怎麼搞得,是不是裡面代碼有問題,還是你根本沒有創建form2? 沒有的話就把form2:=tform2.create(application); 加在form2.show得前面 字串2

13楼: 我创建了FORM2,并且已在UNIT1中引用了UNIT2,我现在怀疑是不是控件上除了问题,是不是少了哪个控件还是,不过我想设置应该没问题的。首先ADOCONNECT的连接字符串已设好了,并且ADOCONNETED:=TRUE,ADOQUERY1中的CONNETTION:=ADOCONNET1。富翁门看是缺少哪个控件还是设置错误,现在我看程序是没问题了吧 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ADODB, DB; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; DataSource1: TDataSource; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; ADOTable1: TADOTable; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses unit3, Unit2; {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); begin adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add(‘select * from denglu where yonghuming=‘‘‘+trim(edit1.Text)+‘‘‘‘); adoquery1.open; if trim(adoquery1.fieldbyname(‘yonghuming‘).asstring)<>trim(edit1.Text) then begin showmessage(‘用户名不对‘+#13+#13+‘请确认‘); exit; end; if trim(edit2.text)=trim(adoquery1.fieldbyname(‘mima‘).asstring) then begin form3.show; self.Close; end else begin showmessage(‘密码不对‘+#13+#13+‘请核对‘); exit; edit1.SetFocus; end; end; end. 字串2

14楼: 我刚测试了你代码,没有出现问题啊, 不需要datasource,adotable等控件,删掉, 只留adoconnection和adoquery足以,另外 在adoconnection.connectstring里面设置好数据库路径后 依次loginprompt设为false,connected设为true。。 你是用access建的库吗?adoconnection.connectstring里面看看设置错了没。

字串7

15楼: liyouweiok您好: 那么说这段程序是没问题了是吗?那应该是哪的问题呢,我当初也试了只用ADOCONNECT和ADOQUERY,而且设置应该也没问题,可是就是没有出现FORM2,对了,我的数据库是SQLSERVER2000,而且里面的数据表也没问题呀 ,那照您看应该是哪的问题呢?

字串9

16楼: 哦,刚用sqlserver2000建了一个库,试了一下也没问题, 在adoconnect.connectstring设置提供程序为microsoft ole provide for sql server 连接第一个选择服务器为你当前机器超级用户名(或点刷新亦可),第二个输入登陆服务器信息选第一个(当然如果你sql库有密码还是选第二个!),第三个就不用多说了吧?点测试连接,若无问题则adoconnect设置完毕,选connected:=true,其它代码就用你上面的,没有任何问题,如还有疑问可以加我qq(9057784)细谈。。 字串7

17楼: form2的创建是在什么位置?是工程运行时就创建了吗? 你的登陆界面是在form2的创建事件中吗?如果是先创建form2,并且登陆界面是在form2的创建事件中。应该没有问题。
字串4

18楼: TO liyouweiok: 现在好了,谢谢老哥了
字串2