#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 к следующей записи.