VB.NET对接SQL表实现登录校验时正确账号仍提示信息错误
核心错误原因
- 最直接的问题是SQL表的
UserName、Pass、Email字段用了定长字符类型char(50):char类型会自动在值末尾补空格填充到指定长度,比如你存入的用户名Imtotiredforthis实际长度不足50,数据库里存储的值后面会带大量空格,你从数据库查询得到的dbUN、dbPW、dbEM都附带多余空格,和前端输入的无空格的字符串比对自然不相等。
修复方案1(改表结构,推荐)
把三个字段的类型从char(50)改成变长字符类型varchar(50),不会自动补空格:
ALTER TABLE MembershipInfo ALTER COLUMN UserName varchar(50) NOT NULL; ALTER TABLE MembershipInfo ALTER COLUMN Pass varchar(50) NOT NULL; ALTER TABLE MembershipInfo ALTER COLUMN Email varchar(50) NOT NULL;
改完之后需要把之前存入的字段值末尾的空格手动清理掉,或者重新插入数据。
修复方案2(不改表,临时处理查询结果)
每次取查询结果的时候调用Trim()方法去掉首尾空格:
dbUN = cmdUN.ExecuteScalar?.ToString().Trim() dbPW = cmdPW.ExecuteScalar?.ToString().Trim() dbEM = cmdEM.ExecuteScalar?.ToString().Trim()
其他需要修复的严重问题
- 重复查询效率极低:不需要分三次查三个字段,单次查询就能取出对应用户的所有校验字段,修改SQL语句即可:
Dim cmd As New SqlCommand("Select UserName, Pass, Email from MembershipInfo Where Username = @p1", con) With cmd.Parameters .Clear() .AddWithValue("@p1", un) End With ' 执行查询用SqlDataReader一次取三个值,不需要三次ExecuteScalar
- 共享SqlConnection会引发并发错误:ASP.NET是多线程环境,不要用
Public Shared声明全局连接对象,应该每次操作数据库的时候新建连接、用完立即释放,遵循“晚开早关”原则。 - Web窗体不能用
MsgBox:MsgBox是WinForm的API,在服务端执行只会弹在服务器的桌面上,用户浏览器完全看不到提示,应该用前端弹窗方案比如ClientScript.RegisterStartupScript输出JS的alert。 - 明文存储密码是重大安全隐患:生产环境绝对不能明文存储用户密码,必须加盐哈希之后再存入库。
- 空值异常风险:如果用户名不存在,
ExecuteScalar会返回Nothing,直接转字符串会抛空引用异常,需要加空值判断。
内容的提问来源于stack exchange,提问作者Cornelius Spark
相关产品推荐
相关产品推荐

