Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用MS SQL Server在VB.net中使用多用户登录表单_Sql Server_Vb.net - Fatal编程技术网

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