【问题标题】:boolean web service method always returns true even when it should not布尔 Web 服务方法总是返回 true,即使它不应该返回
【发布时间】:2013-12-28 18:18:08
【问题描述】:

我在 Visual Studio 中创建了一个 vb windows forms webservice。我遇到了一个问题,即布尔变量总是返回 true,即使它不应该返回。我是 VB 新手,所以这可能只是一个简单的编码错误,但我无法弄清楚。

基本上我有一个登录表单,用户输入用户名,从表单我将用户名传递给服务中名为 checkuser 的函数,以查看用户是否存在于数据库中。如果用户存在它应该去另一个函数加载现有数据,如果不它应该调用 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

表单代码中的检查变量似乎总是返回 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 列是主键,但我不明白为什么当用户根本不存在于数据库中时它说不能插入重复键,我检查了数据库并且用户名不存在,我的代码完全错误吗?

感谢您的帮助

【问题讨论】:

  • ASMX 是一项遗留技术,不应用于新开发。 WCF 或 ASP.NET Web API 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:微软已经在 MSDN 上停用了ASMX Forum
  • 我有一个布尔值,它在服务和域级别返回 False,但是当它冒泡到控制器时,它从 False 变为 True?! VB.net 世界。

标签: vb.net web-services asmx


【解决方案1】:

不确定是否是原因,但您从数据库返回的用户名与输入值的比较区分大小写。比较字符串时,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2012-11-16
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多