注册 登录
编程论坛 VB6论坛

帮我看看这段代码问题出在哪,一个登录窗体

wjq09 发布于 2016-10-28 08:52, 3995 次点击
照书上打的,数据库也连接成功,是Access数据库
程序代码:
Private Sub cmdOK_Click()
    Adodc1.RecordSource = "select * from User where UserName='" + txtUserName.Text + "'"
    Adodc1.Refresh
    If Adodc1.Recordset.RecordCount > 0 Then
    If txtPassword = Adodc1.Recordset.Fields("Password") Then
        '将代码放在这里传递
        '成功到 calling 函数
        '设置全局变量时最容易的
        LoginSucceeded = True
        MsgBox "登录成功"
        
        Me.Hide
    Else
        MsgBox "无效的密码,请重试!", , "登录"
        txtPassword.SetFocus
        SendKeys "{Home}+{End}"
    End If
    Else
        MsgBox "无此用户"
    End If
End Sub

只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
21 回复
#2
xzlxzlxzl2016-10-28 10:21
好像是User必须改成[User]。
在access sql语句里,User是关键字
#3
风吹过b2016-10-28 11:01
同意二楼的,
凡与关键字相同的表名、字段名,通通用 [] 括起来。
#4
xiangyue05102016-10-28 13:54
同意,事实上我现在编写的代码基本都用[]括起来了。
#5
wjq092016-10-31 10:19
回复 2楼 xzlxzlxzl
谢谢楼上几位,我把User和UserName括起来就正常了,但还有个问题VB调试运行取消后自动切换到搜狗输入法,怎么让它不切换
#6
初始元灵2016-10-31 10:53
默认输入法是搜狗吧,修改成美式键盘。
#7
wjq092016-10-31 14:45
回复 3楼 风吹过b
谢谢各位,我现在不想用ADO控件改用ADO对象操作,代码改成了这样,能正常运行但运行结果不对了,弹出“无此用户”,之前用ADO控件时运行结果是正常的,请各位再帮忙看看代码问题出在哪
程序代码:
Private Sub cmdOK_Click()
    Dim adoRs As New ADODB.Recordset
    adoRs.ActiveConnection = adoCon
    adoRs.Open "select * from [User] where [UserName]='" + txtUserName.Text + "'"
    If adoRs.RecordCount > 0 Then
    If txtPassword = adoRs.Fields("Password") Then
        '将代码放在这里传递
        '成功到 calling 函数
        '设置全局变量时最容易的
        LoginSucceeded = True
        MsgBox "登录成功"
        Me.Hide
        MDIFrmMain.Show
    Else
        MsgBox "无效的密码,请重试!", , "登录"
        txtPassword.SetFocus
        SendKeys "{Home}+{End}"
    End If
    Else
        MsgBox "无此用户"
    End If
End Sub
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2016-10-31 15:11编辑过]

#8
ZHRXJR2016-10-31 15:14
1、说明你的数据库中的 [User] 数据表中的 [UserName] 字段没有你在 txtUserName.Text 控件中输入的记录。
这时 adoRs.RecordCount <= 0 了。
2、如果你在 txtUserName.Text 控件中输入的记录是存在的,说明数据表打开方式不正确,不能得到 adoRs.RecordCount 的值。
adoRs.ActiveConnection = adoCon
    adoRs.Open "select * from [User] where [UserName]='" + txtUserName.Text + "'"
应该修改为:
    adoRs.Open "select * from [User] where [UserName]='" & txtUserName.Text & "'", adoCon, 3, 2
3、也可以将 If adoRs.RecordCount > 0 Then 语句修改为:
    If Not adoRs.EOF  Then
#9
wjq092016-10-31 16:19
回复 8楼 ZHRXJR
谢谢,照你说的第二点我试了运行结果正确了,但我还是不明白之前错在哪了,你能详细说明一下吗
#10
ZHRXJR2016-11-01 10:16
回复 9楼 wjq09
    adoRs.Open "select * from [User] where [UserName]='" & txtUserName.Text & "'", adoCon, 3, 2
语句中,adoCon 后面的 3 与 2 是数据表的打开方式。

记录集对象adoRs的Open方法有一些参数,为了好理解,用中文代替
记录集对象.Open [SQL查询连接字符串],  [数据库对象], [数据查询类型] , [查询时的锁定方式]
其中:
A、[SQL查询连接字符串] 是一个字符串,一般形式为:"Select * From 数据表名称 Where 字段名='字符'",用双引号, Where 字段名='字符' 是查询筛选条件;
B、[数据库对象] 是连接数据库的对象,比如我们前面声明的adoCon,但前提必须是数据库对象已经连接数据库了(这里必须区分数据库和数据表的概念,不能混淆);
C、[数据查询类型]  是打算让记录集对象使用什么类型查询数据表,为了简单,这里只使用值来说明:0-只读,只能向后移动;1-读写,可以自由移动,更新后不能立即显示新记录;2-读写,可以自由移动,更新后可以立即显示新记录;3-只读,可以自由移动;
D、[查询时的锁定方式] 是记录集读写在查询时对记录的锁定方式,为了简单,这里只使用值来说明:1-只读锁定,只能打开只读记录;2-悲观锁定,正在编辑的记录会被锁定;3-乐观锁定,只有调用了记录集对象的UpDate方法后才锁定。

如果要得到记录集对象的 RecordCount 的值,数据查询类型的值必须是3,即只读,可以自由移动;查询时的锁定方式的值应该是2或3,即悲观锁定,正在编辑的记录会被锁定 或 乐观锁定,只有调用了记录集对象的UpDate方法后才锁定。
对于记录集对象直接调用数据库对象 adoRs.ActiveConnection = adoCon 其数据查询类型是1,即读写,可以自由移动,更新后不能立即显示新记录,查询时的锁定方式是1,即只读锁定,只能打开只读记录。
因此得不到记录集对象的 RecordCount 的值。

[此贴子已经被作者于2016-11-1 11:17编辑过]

#11
wjq092016-11-02 09:32
回复 6楼 初始元灵
不是啊,默认是美式键盘,只要运行程序弹出登录成功对话框后就自己切换到中文输入法,醉了

[此贴子已经被作者于2016-11-2 09:55编辑过]

#12
xzlxzlxzl2016-11-02 10:10
回复 11楼 wjq09
看来这个代码是^C来的。
如果程序运行后自动切换到中文输入法,那可以肯定是程序自己做了这个操作,有三种方式完成输入法切换,一是通过sendkeys发相关切换键,另一种是通过api强行切换到中文输入法,还有一种是通过设置获得焦点的控件IMEMode属性为on切换,最简单的是第三种方式,不需要代码即可完成。
#13
wjq092016-11-02 18:38
回复 12楼 xzlxzlxzl
窗体是VB工程菜单里添加的登录窗体,其它代码是自己写的,就是显示登陆成功后打开主窗体前切换的,我想原因就在这个窗体里
我看了看VB自己生成的登录窗口里txtPassword文本框的IMEMode属性值是3,但我修改不了它的属性值,这是怎么回事
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2016-11-3 08:42编辑过]

#14
wjq092016-11-02 18:40
回复 10楼 ZHRXJR
原来是这样,谢谢!
#15
风吹过b2016-11-03 12:38
测试了一下,凡设置了 PasswordChar 属性时,
IMEMode 自动设置为3,并且不能修改。

3 IME 被禁止。该模式类似于 IMEMode = 2,区别仅在于数值 2 没有禁止 IME。在本设置下,用户不能够通过键盘将 IME 打开,而且 IME 浮动窗口被隐藏。该设置仅对日文 IME 有效。
这种模式下,不能输入中文,很强大。

我测试时,这行还会报错:拒绝的权限
         SendKeys "{Home}+{End}"


#16
wjq092016-11-03 14:25
回复 15楼 风吹过b
那我这输入法自己切换的问题还有办法解决吗
#17
xzlxzlxzl2016-11-03 15:28
你说登陆成功后启动主窗口时切换,我觉得可能还是主窗口造成的,登陆窗体就那么两个输入控件,很容易排除。如果你打包整个工程文件发上来让大神们分析的话,应该很快找到原因,如果自己分析的话,建议用排除法:
1,排除系统键盘的默认设置就是中文,应该是“简体中文--美式键盘”
2,启动窗体设置为主窗体,绕开登陆窗体,排除登陆窗体切换的可能性
3,清除所有代码,排除代码运行切换的可能性
4,一个个清除可输入控件,排除控件自动切换的可能性

经上述操作,应该能找到问题症结所在。
#18
wjq092016-11-03 15:59
回复 17楼 xzlxzlxzl
我发现我把光标移到登录窗体的密码输入文本框那输入法就切换了,应该就是密码输入框造成的,可文本框设置了PasswordChar属性,IMEMode属性无法修改
#19
xzlxzlxzl2016-11-03 16:07
如果当前状态是中文输入法的情况下,进入密码框应该是自动切换到英文状态的,但不切换输入法。你可以将密码文本框的"Password"属性清空,这时就可以修改IMEMode属性了。
#20
wjq092016-11-03 17:00
回复 19楼 xzlxzlxzl
这个我知道,我试着把PasswordChar属性去掉并把IMEMode属性设为0,这回运行时光标移动到文本框不切输入法了,不过去掉PasswordChar属性就无法起到密码框的输入效果了,现在这个问题是不是没有两全的办法了,

[此贴子已经被作者于2016-11-3 17:02编辑过]

#21
xzlxzlxzl2016-11-03 18:39
密码框获得焦点自动切换输入法也是切换到英文输入法,这是正常的,离开密码框后会自动还原到进入密码框之前的输入法。如果你的密码框是自动进入中文输入法并且离开后不还原倒是个迷。
#22
wjq092016-11-04 08:44
回复 21楼 xzlxzlxzl
我做实验在两个文本框间焦点来回切换,发现焦点到普通文本框时输入法有时能切回有时则不能,现在我想找个两全的方法,让文本框既能显示密码输入格式又不让它自己切换输入法,这样对程序调试和用户使用都会造成麻烦
1