Выполнить Scalar to Label. Подзапрос вернул более 1 значения

Итак, у меня есть метка, которая показывает имя пользователя. Я использовал это значение, чтобы вернуть их идентификатор, который затем прикрепил к метке. Я использовал скаляр выполнения для этого, потому что не знал, как еще получить одно значение на метке.

Это прекрасно работает. Затем я использую идентификатор с этикетки и помещаю его в другую таблицу. Я могу сделать это дважды, а затем страница вылетает со словами...

«Подзапрос вернул более 1 значения. Это не разрешено, если подзапрос следует за =,!=, ‹, ‹= , >, >= или когда подзапрос используется как выражение».

Однако я не понимаю. Я ничего не вытягиваю из второй таблицы на странице. Я не знаю, почему это могло повлиять на это. Я чувствую, что пробовал все. Удаление строки, которая отправляет идентификатор на метку, позволяет запускать страницу, но мне это нужно.

    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

person evanna    schedule 11.04.2015    source источник
comment
Является ли поле Email уникальным?   -  person Mephy    schedule 11.04.2015
comment
@Mephy Да, я столько раз проверял.   -  person evanna    schedule 11.04.2015
comment
Существует ли User.Identity.Name во втором исполнении?   -  person Angus Chung    schedule 11.04.2015
comment
@ Ангус Чанг, я не уверен, что это значит. Это в событии загрузки страницы   -  person evanna    schedule 11.04.2015
comment
Я могу сделать это дважды, User.Identity.Name остается прежним?   -  person Angus Chung    schedule 11.04.2015
comment
@evanna Попробуйте с SELECT TOP 1 ...., если это сработало, то я действительно подозреваю, что иногда ваш первоначальный запрос возвращает несколько строк   -  person har07    schedule 11.04.2015
comment
@AngusChung Ах, да. Я могу обновить страницу и сделать это снова, используя то же имя.   -  person evanna    schedule 11.04.2015
comment
@ har07 Я тоже пробовал TOP 1, и он все еще не работает. Так что я предполагаю, что что-то еще идет не так   -  person evanna    schedule 11.04.2015
comment
Не могли бы вы показать полный код? Мне это интересно.   -  person Angus Chung    schedule 11.04.2015


Ответы (3)


Это должно вернуть вам первый результат. Кроме того, рекомендуется использовать блоки 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
person Craig Johnson    schedule 11.04.2015
comment
Эй, да, это вернуло первый результат, как и в начале, но когда в таблицу Project (таблицу, для которой нам нужен супид) вводится более двух строк, происходит то же самое. Я не понимаю, потому что на странице нет запросов, которые вытягивают данные из таблицы Project, а только добавляют в нее. - person evanna; 11.04.2015

Если вы не уверены, что в этой таблице есть несколько строк для одного и того же адреса электронной почты, вы можете изменить запрос на следующий, который будет работать для вас с executescalar.

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

person Arindam Nayak    schedule 11.04.2015

Ужасно жаль! Но да, ты был прав! В фоновом режиме выполнялся еще один запрос, который, как я никогда не замечал, влиял на все это. Так жаль

person evanna    schedule 12.04.2015