我正在尝试为vb.net中的sql数据库创建一个登录表单。执行程序时,出现此错误:
数据类型文本和与运算符
不兼容的文本
我的代码:
Dim connection As New SqlConnection("Server= DESKTOP-56RQL1O\SQLEXPRESS; Database = student;user=tulsi;password=tulsi123;Integrated Security=true")
Dim command As New SqlCommand("select * from student_table where Username = @username and Password = @password", connection)
command.Parameters.Add("@username", SqlDbType.Text).Value = UsernameTextBox.Text
command.Parameters.Add("@password", SqlDbType.Text).Value = PasswordTextBox.Text
Dim adapter As New SqlDataAdapter(command)
Dim table As New DataTable()
adapter.Fill(table)
If table.Rows.Count() <= 0 Then
MessageBox.Show("Username Or Password Are Invalid")
Else
MessageBox.Show("Login Successfully")
Me.Hide()
user_profile.Show()
End If
此代码行上发生错误:
adapter.Fill(table)
答案 0 :(得分:0)
听起来您的Username
和Password
列属于text
类型,无法比较。
已经淘汰了SQL Server中的text
类型,而推荐使用nvarchar
。将列更改为nvarchar(x)
(其中x
是您计划支持的最大长度),您的比较就可以了。
答案 1 :(得分:0)
在数据库中,您已将用户名或密码声明为text
,这是不合适的,并且在这种情况下也会引起问题,因为您无法将值与text
进行比较。
更合适的声明是密码nvarchar(256)
。如果用户名将存储电子邮件地址或自动生成的用户名,则我将输入varchar(256)
,否则将输入nvarchar(256)
。
您不想在此处使用text
的另一个原因是,您无法在它们上创建索引。并且您需要在用户名上建立索引,以便快速验证登录尝试。
最后一件事,考虑在表中将密码声明为nvarchar(512) collate Latin1_General_BIN
,然后在命令中将其与Password = @password collate Latin1_General_BIN
进行比较。这样,无论数据库设置如何(默认情况下不区分大小写),都可以确保区分大小写和区分重音的密码进行比较。