执行标量到标签。子查询返回的值超过1

时间:2015-04-11 01:07:52

标签: asp.net vb.net label executescalar

所以我有一个标签显示用户的用户名。我已使用此值返回其ID,然后我将其附加到标签上。我使用execute scalar来执行此操作,因为我不确定如何在标签上获取单个值。

这很好用。然后我使用标签中的ID并将其放在另一个表中。我可以做两次,然后页面崩溃说......

“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。”

但是我不明白。我不从页面上的第二个表格中提取任何内容。我不知道为什么它会影响它。我觉得我已经尝试了一切。取出将ID发布到标签的行可以让页面运行,但我需要它。

    Label2.Text = User.Identity.Name
    Dim connetionString As String
    Dim cnn As SqlConnection
    Dim cmd As SqlCommand
    Dim sql As String
    connetionString = "Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\FYPMS_DB.mdf;Integrated Security=True"
    sql = "SELECT SupID FROM Supervisor WHERE (Email = @Email)"
    cnn = New SqlConnection(connetionString)
    Try
        cnn.Open()
        cmd = New SqlCommand(sql, cnn)
        cmd.Parameters.Add(New SqlParameter("@Email", User.Identity.Name))
        Dim supid1 As Int32 = Convert.ToInt32(cmd.ExecuteScalar())
        cmd.Dispose()
        cnn.Close()

        Label1.Text = supid1.ToString

    Catch ex As Exception
        MsgBox("Can not open connection ! ")
    End Try

End Sub

3 个答案:

答案 0 :(得分:0)

这应该为您返回第一个结果。此外,对于诸如连接,命令和读取器之类的对象使用块也是一个好主意。

    Using cn = New SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\FYPMS_DB.mdf;Integrated Security=True")
        cn.Open()
        Using cmd = New SqlCommand("SELECT SupID FROM Supervisor WHERE Email = @Email", cn)
            cmd.Parameters.AddWithValue("@Email", User.Identity.Name)
            Using dr = cmd.ExecuteReader
                If dr.Read Then
                    Label1.Text = CInt(dr("SupID"))
                End If
            End Using
        End Using
    End Using

答案 1 :(得分:0)

如果您不确定该表中的同一封电子邮件有多行,则可以将查询更改为以下内容,这对您executescalar有效。

SELECT TOP 1 SupID FROM Supervisor WHERE (Email = @Email)

答案 2 :(得分:0)

非常抱歉!但是,你是对的!在后台还有另一个查询,我从未注意到它影响了所有这些。很抱歉