Доступ к данным из sqldatereader в функции

#asp.net

#asp.net

Вопрос:

Я хочу вывести некоторые данные пользователю на основе его имени пользователя. Эти данные хранятся в таблице, которая связана с таблицей aspnet_Users . Я пытаюсь написать sqldatareader как часть функции, поэтому мне не нужно переписывать код, когда его можно вызвать с нескольких страниц. Я знаю, что это, вероятно, очень просто, но, похоже, я не могу получить доступ к данным извне функции. Функция, которую я имею до сих пор, заключается в следующем:

 Public Shared Function AgencyDetails() As SqlDataReader
    Dim details As String = "SELECT * FROM tbl_Relationships WHERE ContactSub = @Username"
    Dim connString As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString

    Using dbConnection As New SqlConnection(connString)
        dbConnection.Open()
        Dim cmdAgency As New SqlCommand(details, dbConnection)
        cmdAgency.Parameters.AddWithValue("@Username", membership.getuser)
        Return cmdAgency.ExecuteReader()


    End Using
End Function
  

Как я могу вызвать эту функцию и получить доступ к информации на моей странице? Что-то вроде следующего?

 lblAgencyDetails.text = AgencyDetails(0)
  

Спасибо

Ответ №1:

То, что у вас есть сейчас, это не сработает, потому что вы вложили соединение в using оператор, к тому времени, когда вы вернете Reader соединение, оно будет закрыто и удалено, поэтому читатель ничего не сможет прочитать.

Что вы должны сделать в этой функции, так это загрузить информацию в a DataTable и вернуть datatable.

Пример:

 Public Shared Function AgencyDetails() As DataTable
    Dim details As String = "SELECT * FROM tbl_Relationships WHERE ContactSub = @Username"
    Dim connString As String = ConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString

    Using dbConnection As New SqlConnection(connString)
        dbConnection.Open()
        Dim cmdAgency As New SqlCommand(details, dbConnection)
        cmdAgency.Parameters.AddWithValue("@Username", membership.getuser)
        Dim dt as new DataTable()
        dt.Load(cmdAgency.ExecuteReader())
        return dt

    End Using
End Function
  

Вы можете получить доступ к строкам в таблице данных, выполнив:

 For Each row as DataRow in dt.Rows
   Console.WriteLine(row("ColumnName"))
Next
  

Комментарии:

1. Как мне вывести результаты из этого на мою страницу aspx?

2. @ajguk проверьте мое обновление. Предполагается, что «ColumnName» — это имя одного из столбцов, возвращаемых вашим оператором select. Кстати, вам следует избегать этого select * ; это ужасная практика.

3. Привет, я знаю, просто пока я заставляю его работать, я бы обычно извлекал только те столбцы, которые мне нужны! Быстрее, чем вводить их все сначала …!

4. Извините, я помещаю цикл For в функцию или в свой код в моем событии?

5. если я это сделаю, я получу сообщение об ошибке, что ‘dt’ не объявлен. Я вижу, что я пытаюсь сделать, но я не могу получить доступ к этой таблице данных!

Ответ №2:

Чтобы иметь возможность извлекать данные из объекта DataReader, вы должны вызвать метод Read():

  While reader.Read()
        Console.WriteLine(String.Format("{0}, {1}", _
            reader(0), reader(1)))
    End While
  

Этот метод перемещает SqlDataReader к следующей записи.