Я просто хочу узнать разницу этих двух в VB. net? Использование адаптера данных и использование команды oledb? - PullRequest
0 голосов
/ 01 марта 2020
Private Sub Contestant_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim command As String
        Dim dsSET As New DataSet
        Dim connect As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")


        command = "SELECT * from Contestant "

        Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(command, connect)

        comSTR = "SELECT * from Contestant "

        dsSET.Clear()
        da.Fill(dsSET, "contest")





        dgvContestant.DataSource = dsSET
        dgvContestant.DataMember = "contest"


    End Sub

Я не понимаю приведенный выше код, но он по-прежнему выбирает данные из базы данных и загружает их в datagridview.

Ниже приведен другой код, но с этой ошибкой: «Текст команды не был установлен для объект команды. '

  Private Sub Contestant_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim dsSET As New DataSet
        Dim connect As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
        Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand


        With cmd
            .Connection = connect
            .CommandText = "SELECT * from Contestant "
             Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(command, connect)
            .Connection.Open()
            .ExecuteNonQuery()


            da.Fill(dsSET, "contest")
            dgvContestant.DataSource = "contest"
            .Connection.Close()
        End With




    End Sub

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Команда - это просто представление оператора sql и связанного с ним соединения. Это может быть выполнено несколькими способами, возвращая читателя с .ExecuteReader, для операторов вставки, обновления и удаления с .ExecuteNonQuery и для извлечения одного значения с .ExecuteScalar. Он также может использоваться DataAdapter.

DataAdapter может не только. Заполнять DataTable или DataSet, но также .Update

Комментарии и пояснения в строке.

Private Sub Contestant_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Declares a variable as String
    Dim command As String
    'Creates a DataSet object. Note the New keyword
    Dim dsSET As New DataSet
    'Creates a Connecion object and sets the .ConnectionString property by passing it to the Constructor of the object
    Dim connect As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
    'Assigns a value to the previously declared String
    command = "SELECT * from Contestant "
    'Creates a DataAdapter object and provides an Sql Select statement that the adapter can use to create its SelectCommand property
    'and sets the .Connection property by passing a Connection object.
    'Note: the connection is NOT an open connection
    Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(command, connect)
    'Undeclared and unnecessary variable
    'comSTR = "SELECT * from Contestant "
    'Unnecessary code - You just created, it is already empty
    'dsSET.Clear()
    'Calls the DatAdapter .Fill method passing the DataSet to fill and the name of the DataTable being filled.
    'The .Fill method opens and closes the connection if it finds it closed. If the connection is already open
    'the .Fill method leaves it open.
    da.Fill(dsSET, "contest")
    'The DataSet is set as DataSourd
    dgvContestant.DataSource = dsSET
    'Since a DataSet can contain more than one table; the .DataMember of the DataSet 
    'is set to the name of the DataTable to display.
    dgvContestant.DataMember = "contest"
End Sub

Private Sub Contestant_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dsSET As New DataSet
    Dim connect As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
    Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand
    With cmd
        .Connection = connect
        .CommandText = "SELECT * from Contestant "
        'Here command is not declared
        'Visual Studion assumes you mean Interaction.Command() which is NOT at all want you want
        Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(command, connect)
        .Connection.Open()
        'A DataAdapter does not have a .ExecuteNonQuery method
        '.ExecuteNonQuuery belongs to .Command and is used for sql Statements that
        'begin with Insert, Update or Delect.
        .ExecuteNonQuery()
        da.Fill(dsSET, "contest")
        'The .DataSoure of a DataGridView cannot be set to a String
        dgvContestant.DataSource = "contest"
        .Connection.Close()
    End With
End Sub

'I don't think you need a DataAdapter or a DataSet

Private Sub FillDataGridView()
    Dim dt As New DataTable
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
            cmd As New OleDbCommand("SELECT * from Contestant ", cn)
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    'Update the User Interface after the connection is closed.
    dgvContestant.DataSource = dt
End Sub
1 голос
/ 01 марта 2020

Во втором фрагменте кода вы устанавливаете CommandText из cmd, но не устанавливаете CommandText из command. Это command то, что вы затем передаете в адаптер данных. Почему у вас два командных объекта на первом месте? Если cmd - это объект команды, для которого вы установили CommandText, то, безусловно, это должен быть объект команды, который вы передаете в адаптер данных.

Объект подключения создает соединение между вашим приложением и базой данных. SQL может быть выполнено через это соединение, и данные передаются взад и вперед.

Объект команды содержит код SQL и, необязательно, параметры для этого SQL. Команда всегда связана с соединением, по которому она выполняется. Если команда содержит оператор SELECT, вы можете вызвать ExecuteScalar, чтобы получить одно значение, или ExecuteReader, чтобы получить ноль, одну или несколько записей, содержащих один или несколько столбцов. Если команда не содержит оператора SELECT, вы можете вызвать ExecuteNonQuery.

Адаптер данных - это, как правило, группа из четырех командных объектов для выполнения операций CRUD. Когда вы вызываете Fill, SelectCommand выполняется для извлечения данных в DataTable. При вызове Update InsertCommand, UpdateCommand и DeleteCommand выполняются в соответствии с требованиями для сохранения изменений из DataTable в базу данных.

При создании адаптера данных вы можете либо предоставьте готовый объект команды для SelectCommand, либо позвольте адаптеру создать его самостоятельно. Если вы сделаете последнее, вы можете передать код SQL и существующее соединение, или вы можете передать код SQL и строку соединения, в этом случае адаптер также создаст объект соединения. Адаптер данных не будет создавать свои собственные InsertCommand, UpdateCommand и DeleteCommand, поэтому вам придется создавать их самостоятельно или, в определенных обстоятельствах, вы можете использовать построитель команд, чтобы сделать это за вас.

Вам может быть полезно взглянуть на мой ADO. NET примеры здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...