我在visual studio中创建了一个vb windows窗体webservice。我遇到一个问题,即布尔变量总是返回true,即使它不应该返回true。我是VB的新手,所以它可能只是一个简单的编码错误,但我无法理解它。
基本上我有一个登录表单,用户输入用户名,从我将用户名传递给名为checkuser的服务中的函数,以查看用户是否存在于DB中。如果用户存在,它应该转到另一个函数来加载现有数据,如果不是,它应该调用createuser函数。
如果用户确实存在,变量应返回true,否则返回false。但是,在测试程序时,即使我输入了一个不存在的新用户名,变量似乎总是返回true。
这是表单代码(登录表单),它抓取用户名并将其传递给checkUser函数
Private Sub signInBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles signInBtn.Click
If signInNick.Text = "" Then
MessageBox.Show("Please enter a user name")
signInNick.Focus()
Else
signinName = signInNick.Text
Dim check As Boolean
check = service.checkUser(signinName)
MessageBox.Show(check)
If check = False Then
main.Visible = True
Me.Hide()
main.tbxUserName.Text = signinName
MessageBox.Show("User has been created")
Else
main.Visible = True
Me.Hide()
main.tbxUserName.Text = signinName
MessageBox.Show("Thankyou for Signing In " + signinName)
End If
End If
End Sub
以下是服务中checkUser的代码
'Function to check if a user already exists in the database
<WebMethod()> _
Public Function checkUser(ByVal signinName As String) As Boolean
Dim userToCheck As String
Dim conn As New SqlConnection("Data Source=MARTIN-LAPTOP\SQLEXPRESS;Initial Catalog=musicPlaylist;Integrated Security=True")
Dim sql As String = "SELECT userNick FROM Users WHERE userNick = ('" & signinName & "')"
conn.Open()
Dim objcmd As New SqlCommand(sql, conn)
userToCheck = objcmd.ExecuteScalar()
If userToCheck = signinName Then
getExistingUserPLData(signinName)
Return True
Else
createUser(signinName)
Return False
End If
End Function
表单代码中的check变量似乎总是返回true,这会导致服务函数跳转到getExistingUserPLData,如果用户是新用户,则不会创建用户。
奇怪的是,如果我通过http://localhost:50445/Service1.asmx
的Web服务网页执行此操作,请键入全新的用户名并调用checkUser,如果用户不存在,则返回false;如果用户确实存在,则返回true它不起作用,只有通过表单客户端才能返回true。
更新:其中一个答案中提供的代码
If String.Equals(userToCheck, signinName, StringComparison.OrdinalIgnoreCase) Then
似乎有点工作,因为如果在登录框中输入新的用户名,程序就会跳到createUser函数,但它在createUser函数中给我一个错误
主键约束的声音,不能插入重复键
这是createUser的代码
<WebMethod()> _
Public Function createUser(ByVal signinName As String) As String
Dim conn As New SqlConnection("Data Source=MARTIN-LAPTOP\SQLEXPRESS;Initial Catalog=musicPlaylist;Integrated Security=True")
Dim sql As String = "INSERT INTO Users (userNick) VALUES ('" & signinName & "')"
conn.Open()
Dim cmd As New SqlCommand(sql, conn)
Dim newUserName As String = cmd.ExecuteScalar()
conn.Close()
Return newUserName
End Function
它会在Dim newUserName As String = cmd.ExecuteScalar()
列userNick是主键,但是我不明白为什么它说当用户在数据库中根本不存在时不能重复密钥,我已经检查了数据库和用户名不存在,是我的代码完全错误?
感谢您的帮助
答案 0 :(得分:0)
不确定是否是原因,但是您从DB返回的用户名与输入值的比较区分大小写。比较字符串时,我喜欢使用99%的时间。
If String.Equals(userToCheck, signinName, StringComparison.OrdinalIgnoreCase) Then
'True
Else
'False
End If
此外,“signinName = signInNick.Text”行是可疑的,因为您的代码未指明此处发生的情况。据推测它是一个类范围的变量,但它可能是一个未正确实现的属性。
作为一方,“if signInNick.Text =”“Then”这一行将更好地编码为:
If String.IsNullOrWhitespace(signInNick.Text) Then