Sql server 使用MS SQL Server在VB.net中使用多用户登录表单
我的项目遇到了问题,这是一个数据库中涉及多个用户的项目 我不明白Sql server 使用MS SQL Server在VB.net中使用多用户登录表单,sql-server,vb.net,Sql Server,Vb.net,我的项目遇到了问题,这是一个数据库中涉及多个用户的项目 我不明白SqlDataReader是如何工作的。即使在我的代码中使用了两次, 它没有显示任何错误。不知何故,SqlDataReader只执行第一个If,而不执行第二个If。为什么数据读取器不执行第二个?目前,我正在使用Visual basic 2019和SQL Server 2018 这是我的密码: 导入System.Data.SqlClient 公共类借出登录 私有子BtnLogin_Click(发送方作为对象,e作为事件参数)处理Btn
SqlDataReader
是如何工作的。即使在我的代码中使用了两次,
它没有显示任何错误。不知何故,SqlDataReader
只执行第一个If,而不执行第二个If。为什么数据读取器不执行第二个?目前,我正在使用Visual basic 2019和SQL Server 2018
这是我的密码:
导入System.Data.SqlClient
公共类借出登录
私有子BtnLogin_Click(发送方作为对象,e作为事件参数)处理BtnLogin。单击
Dim conn作为新的SqlConnection
如果txtUsername.Text=”“或txtPassword.Text=”“,则
MessageBox.Show(“请填写所有字段。”,“登录错误”,MessageBoxButtons.OK,MessageBoxIcon.Error)
其他的
conn.ConnectionString=“数据源=NECRONOMICON\SQLEXPRESS01;初始目录=寄存器;集成安全性=True;”
尝试
Dim sql As String=“从[Register].[dbo].[RegisterList]中选择用户名和密码,其中用户名='”&TxtSerName.Text&“和密码='”&txtPassword.Text&“”
Dim cmd作为新的SqlCommand(sql,conn)
cmd.Connection=conn
康涅狄格州公开赛
Dim dr作为SqlDataReader=cmd.ExecuteReader
如果dr.Read=True,则
sql=“从[Register].[dbo].[RegisterList]中选择用户名和密码,其中用户名='Joshua'&“其中密码='Maria'”
我躲起来
MessageBox.Show(“we L C O M E!”)
借贷者_状态10.Show()
如果sql=“从[Register].[dbo].[RegisterList]中选择用户名和密码,其中用户名='Gabby'&“其中密码='Nanamin'”,则
我躲起来
MessageBox.Show(“we L C O M E!”)
Admin\u control\u interface.Show()
如果结束
其他的
MessageBox.Show(“用户名或密码不正确”,“登录失败”,MessageBoxButtons.OK,MessageBoxIcon.惊叹号)
如果结束
特例
MessageBox.Show(“未能连接到数据库。系统错误:&例如消息,“数据库错误”,MessageBoxButtons.OK,MessageBoxIcon.Error)
结束尝试
如果连接状态连接状态已关闭,则
康涅狄格州关闭
如果结束
如果结束
端接头
输入用户名(Gabby)和密码(Nanamin)后,必须显示
Admin\u control\u界面
表单,但Loaner\u status 10
表单会一直显示当您从数据库中选择时,您会在列中获取值,这些值将由您的数据读取器读取。
要读取一个值,您不必检查sql是否正确,只需添加另一列,指示用户是否具有管理员权限,如布尔值,但如varchar True/False“isAdmin”,并进行如下检查:
if dr.hasrows then
if dr("isAdmin").tostring = "True" then
'user is admin'''
else
'user is not admin'''
end if
else
msgbox("Access Denied")
end if
希望这就是你要找的
顺便说一句
会给你一个错误,因为GabbyWHERE之间没有空格
我想这样说:
...WHERE Username = 'Gabby' AND Password = 'Nanamin'"
@Devcon发布的答案是您需要的,应该被接受。我只是填写一些关于如何实现这一点的细节 请注意,所有数据库对象都由
Using…End Using
块包围。这可以确保即使出现错误,也会关闭和释放数据库对象
连接字符串直接传递给连接的构造函数,sql语句和连接直接传递给命令的构造函数
Sql语句是参数化的。永远不要连接字符串以生成sql语句。它将打开数据库以进行sql注入
首先,您需要向RegisterList表中添加一列,以指示用户是否是管理员。我们将其设置为一个Boolean
列,它是Sql Server中的bit
数据类型。您将能够添加True
或False
的值。你只会这样做一次。这通常不是你计划的一部分
Private Sub AddColumn()
Using cn As New SqlConnection("Data Source=NECRONOMICON\SQLEXPRESS01;Initial Catalog=Register;Integrated Security=True;")
Using cmd As New SqlCommand("Alter Table RegisterList Add IsAdministrator bit;", cn)
cn.Open()
cmd.ExecuteNonQuery()
End Using
End Using
End Sub
接下来,更新用户记录以反映其管理状态。这通常是使用原始Insert命令创建用户记录的一部分,而不是在更新中
Private Sub AddAdminStatus()
Using cn As New SqlConnection("Data Source=NECRONOMICON\SQLEXPRESS01;Initial Catalog=Register;Integrated Security=True;")
Using cmd As New SqlCommand("Update RegisterList Set IsAdministrator = @IsAdmin Where Username = @Name")
cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit)
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100)
cmd.Parameters("@IsAdmin").Value = False
cmd.Parameters("@Name").Value = "Joshua"
cmd.ExecuteNonQuery()
cmd.Parameters("@Name").Value = "Gabby"
cmd.Parameters("@IsAdmin").Value = True
cmd.ExecuteNonQuery()
End Using
End Using
End Sub
最后,我们可以验证输入。Select命令仅询问IsAdministrator列的值。如果此列中没有匹配记录或没有值,则将不返回任何内容
Private Sub BtnLogin\u Click(发送方作为对象,e作为事件参数)处理BtnLogin。单击
如果txtserName.Text=”“或lse txtPassword.Text=”“,则
MessageBox.Show(“请填写所有字段。”,“登录错误”,MessageBoxButtons.OK,MessageBoxIcon.Error)
返回
如果结束
作为对象的Dim RetVal
将conn用作新的SqlConnection(“数据源=NECRONOMICON\SQLEXPRESS01;初始目录=寄存器;集成安全性=True;”)
使用cmd作为新的SqlCommand(“从RegisterList中选择IsAdministrator,其中Username=@Username和Password=@Password;”,conn)
cmd.Parameters.Add(“@UserName”,SqlDbType.VarChar,100)。Value=txtUsername.Text
cmd.Parameters.Add(“@Password”,SqlDbType.VarChar,100)。Value=txtPassword.Text
康涅狄格州公开赛
RetVal=cmd.ExecuteScalar'返回单个值,即结果集的第一列或第一行
终端使用
终端使用
如果RetVal不算什么,那么
MessageBox.Show(“抱歉,您的登录无效或您的帐户未分配状态”)
ElseIf CBool(RetVal)然后
MessageBox.Show(“欢迎”)
Admin\u control\u interface.Show()
隐藏()
其他的
借贷者_状态10.Show()
隐藏()
如果结束
端接头
最后,密码不应以纯文本形式存储。这是你老师的错。在教你登录之前
Private Sub AddAdminStatus()
Using cn As New SqlConnection("Data Source=NECRONOMICON\SQLEXPRESS01;Initial Catalog=Register;Integrated Security=True;")
Using cmd As New SqlCommand("Update RegisterList Set IsAdministrator = @IsAdmin Where Username = @Name")
cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit)
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100)
cmd.Parameters("@IsAdmin").Value = False
cmd.Parameters("@Name").Value = "Joshua"
cmd.ExecuteNonQuery()
cmd.Parameters("@Name").Value = "Gabby"
cmd.Parameters("@IsAdmin").Value = True
cmd.ExecuteNonQuery()
End Using
End Using
End Sub