2015-06-10 1 views
1

Я работаю над программой vb в Visual Studio, которая начинается с формы входа. Я сохранил имена пользователей и пароли для 22 человек в базе данных Access. Мой план состоял в том, что, как только пользователь вводит свое имя пользователя и пароль в соответствующие текстовые поля, они нажимают кнопку «Вход» и инициируют код, необходимый для проверки текста в текстовом поле с информацией в базе данных.Visual Studio Professional 2012 говорит, что dataset не является участником моей формы

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

Проблема возникает в самом коде в форме входа. Я вошел следующий код в «Login» обработчик кнопки события:

Private Sub btnLoginSubmit_Click(sender As Object, e As EventArgs) Handles btnLoginSubmit.Click 
    Dim row As TutorAccountDataSet.TutorsRow 'Declares the row variable 
    Dim strUsername(21) As String 'Declares the username array 
    Dim strPassword(21) As String 'Declares the password array 
    Dim intLoginCounter As Integer = 0 'Declares the variable for counting the loop cycles 

    For Each row In Me.TutorAccountDataSet.Tutors.Rows 'Loop goes through each row in the dataset and loads the username column into the array 
     strUsername(intLoginCounter) = row.Username 
     intLoginCounter += 1 
    Next 
End Sub 

В 7-й строке (где я начинаю цикл), Visual Studio дает мне следующее сообщение об ошибке:

TutorAccountDataSet' is not a member of 'Tutor_Training.frmLogin'.

я сделал сделайте некоторые исследования, но я не был точно уверен, что к этому относятся предложения, предоставленные людям с похожими (но очень разными) проблемами. Я подумал, что мне может понадобиться вызвать метод Fill для этого, но это также приводит к той же ошибке, когда оно включено в код.

Кто-нибудь знает, почему эта ошибка возникает и как ее исправить?

+0

Добро пожаловать в переполнение стека! Я редактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Имеет смысл, что это не член формы. Я думаю, это член проекта. Что произойдет, если вы попробуете «Tutor_Training.TutorAccountDataSet.Tutors.Rows'? Или, может быть, просто обратитесь к нему без какого-либо родительского объекта.Я очень ржавый. –

+0

Спасибо @Doug. Когда я попробовал это, ошибка изменилась на «Ссылка на не общего пользователя требует объектной ссылки». –

ответ

0

Прежде всего, поскольку вы заявили, что вам нужно только содержимое одной таблицы, я бы рекомендовал извлечь DataTable вместо DataSet из базы данных.

Я бы также предложил создать и заполнить этот DataTable программно, вместо использования VS-мастера. Поступая таким образом, вы получаете полный контроль над тем, где и когда ваш DataTable будет создан и удален снова.

Ниже вы найдете сильно прокомментированный метод, который вы можете добавить в свою программу. Откорректируйте соединительную строку в соответствии с вашим соединением (см. connectionstrings.com для справки) и вызовите метод для создания вашего DataTable, который можно использовать как объект для итерации, и наоборот.

Imports System.Data 
Imports System.Data.OleDb 

Private Function GetDataTableFromAccess(query As String) As DataTable 
    ' local variables 
    Dim Con As OleDbConnection 
    Dim DAdapter As OleDbDataAdapter 
    Dim Command As OleDbCommand 
    Dim ResultTable As DataTable 

    ' initialize the connection 
    Con = New OleDbConnection() 
    Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\_sandbox\Northwind.mdb" 

    ' initialize the command 
    Command = New System.Data.OleDb.OleDbCommand() 
    Command.Connection = Con 
    Command.CommandText = query 

    ' initialize the DataAdapter (only the Select command, as we're only reading data at this time) 
    DAdapter = New System.Data.OleDb.OleDbDataAdapter() 
    DAdapter.SelectCommand = Command 

    ' initialize the DataTable 
    ResultTable = New DataTable() 

    ' get data from the dataBase and then get rid of the DataAdapter as it has done it's duty) 
    DAdapter.Fill(ResultTable) 
    DAdapter.Dispose() 

    ' return the populated DataTable to the calling code 
    Return ResultTable 
End Function 

После этого метод был добавлен в ваш код, вы могли бы получить какой-либо результат запроса из базы данных, добавив всего одну строку кода в основной программе:

' adjust the query to your needs 
Dim UsrTbl As DataTable = GetDataTableFromAccess("SELECT * FROM UserTable") 

О, и обратите внимание, что указанное решение предназначено для файла .mdb-Database. Если вы используете формат .accdb-Database, вам, возможно, придется установить специальные драйверы на каждом компьютере, для которого ваша программа предназначена для работы от, потому что драйверы .accdb-Database не являются частью Windows 7, насколько это возможно как я знаю (см., например, connectionstrings.com). Имея это в виду, я бы рекомендовал использовать формат .mdb-Database для ваших целей.

+1

Спасибо за совет. Я попытался создать набор данных программно, и это сработало очень хорошо. Я сохранил ячейки для набора данных в модуле и создал экземпляр набора данных в своем коде для кнопки входа. Затем я смог сделать то, что мне нужно, чтобы проверить ввод. –

+0

Благодарим за отзыв. Если бы мой ответ был полезен для вас, я был бы признателен, если бы вы приняли его в качестве решения вашего вопроса, чтобы дальнейшие читатели могли получить от него выгоду. – M463