ASP.NET登录失败报错‘Invalid object name 'UserInformation'’原因及解决方法
嘿,我来帮你搞定这个登录代码的问题!你遇到的Invalid object name 'UserInformation'错误,说白了就是SQL Server找不到你指定的UserInformation表,下面我给你拆解下可能的原因和对应的解决办法:
可能的原因
- 表名拼写或大小写问题:先仔细核对数据库里的表名是不是真的叫
UserInformation——有没有少写字母、多写字符,或者大小写不一致?虽然SQL Server默认不区分大小写,但如果你的数据库 collation 设置为区分大小写,那大小写不匹配就会找不到表。 - 连接的数据库不对:你的连接字符串
mHealthDB指向的数据库,是不是真的包含UserInformation表?有可能你不小心连接到了其他数据库(比如系统库master,或者其他测试库),而非你实际存放用户数据的目标库。 - 缺少架构前缀:如果你的表属于某个特定架构(比如不是默认的
dbo,而是自定义的app之类的),那直接写UserInformation就会找不到。比如表实际是dbo.UserInformation,但你没加dbo.前缀,在某些环境下就会报错。 - 数据库账号权限不足:虽然这个错误主要是找不到对象,但也有可能你的数据库登录账号没有访问
UserInformation表的权限,不过这种情况更多会报权限相关的错误,也可以顺便排查下。
对应的解决办法
- 核对表名细节:打开SQL Server Management Studio(SSMS),连接到你的数据库,查看表列表,确认表名和你SQL语句里的完全一致。如果是大小写问题,要么修改SQL语句的表名和数据库一致,要么调整数据库的collation为不区分大小写。
- 验证连接的数据库:你可以在代码里临时加一行调试代码,输出当前连接的数据库名:
Debug.WriteLine(con.Database);,运行后看输出的是不是你预期的数据库。或者直接用连接字符串里的账号在SSMS登录,看看能不能找到UserInformation表。 - 添加架构前缀:把SQL语句里的表名改成带架构的形式,比如默认的
dbo架构就写成select * from dbo.UserInformation where ...,这样明确指定架构,避免找不到表。 - 检查并授权账号权限:如果是权限问题,在SSMS里执行授权语句:
GRANT SELECT ON dbo.UserInformation TO [你的数据库登录账号];,确保账号有查询该表的权限。
另外给你个小建议:你的代码里没有用using语句,容易导致数据库连接资源泄漏,推荐改成下面的写法,让系统自动释放资源:
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["mHealthDB"].ConnectionString)) { con.Open(); using(SqlCommand cmd = new SqlCommand("select * from dbo.UserInformation where UserName =@username and Password=@password", con)) { cmd.Parameters.AddWithValue("@username", TxtUsername.Text); cmd.Parameters.AddWithValue("@password", TxtPassword.Text); using(SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); da.Fill(dt); if (dt.Rows.Count > 0) { Response.Redirect("ExerciseList.aspx"); } else { ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Invalid Username and Password')</script>"); } } } }
内容的提问来源于stack exchange,提问作者user7496575
相关产品推荐
相关产品推荐

