0

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

这工作正常。然后我使用标签中的 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
4

3 回答 3

0

如果您不确定该表中的同一电子邮件有多行,您可以将查询更改为以下,这将适用于您executescalar

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

于 2015-04-11T08:27:49.160 回答
0

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

于 2015-04-12T21:03:06.010 回答
0

这应该为您返回第一个结果。此外,为对象(例如连接、命令和读取器)使用 Using 块也是一个好主意。

    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
于 2015-04-11T02:35:37.593 回答