You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

其他需要修复的严重问题

  1. 重复查询效率极低:不需要分三次查三个字段,单次查询就能取出对应用户的所有校验字段,修改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
  1. 共享SqlConnection会引发并发错误:ASP.NET是多线程环境,不要用Public Shared声明全局连接对象,应该每次操作数据库的时候新建连接、用完立即释放,遵循“晚开早关”原则。
  2. Web窗体不能用MsgBox:MsgBox是WinForm的API,在服务端执行只会弹在服务器的桌面上,用户浏览器完全看不到提示,应该用前端弹窗方案比如ClientScript.RegisterStartupScript输出JS的alert。
  3. 明文存储密码是重大安全隐患:生产环境绝对不能明文存储用户密码,必须加盐哈希之后再存入库。
  4. 空值异常风险:如果用户名不存在,ExecuteScalar会返回Nothing,直接转字符串会抛空引用异常,需要加空值判断。

内容的提问来源于stack exchange,提问作者Cornelius Spark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:06:02