【问题标题】:Execute Scalar to Label. Subquery returned more than 1 value执行标量到标签。子查询返回超过 1 个值
【发布时间】:2015-04-11 01:07:52
【问题描述】:

所以我有一个显示用户用户名的标签。我已使用此值返回他们的 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

【问题讨论】:

  • Email 字段是否唯一?
  • @Mephy 是的,我已经检查了很多次了。
  • 第二次执行中是否存在User.Identity.Name?
  • @Angus chung 我不确定这意味着什么。这是在页面加载事件中
  • "我可以这样做两次",User.Identity.Name 还是一样的吗?

标签: asp.net vb.net label executescalar


【解决方案1】:

这应该会为您返回第一个结果。此外,对连接、命令和读取器等对象使用 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

【讨论】:

  • 嘿,是的,这确实返回了第一个结果,就像它开始时一样,但是当在 Project 表(我们需要 supid 的表)中输入超过两行时,同样会发生同样的情况。我不明白,因为页面上没有从 Project 表中提取数据的查询,只添加到它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2016-04-10
      相关资源
      最近更新 更多