Обновление SQL Все строки НЕТ оператора WHERE VB.net - PullRequest
1 голос
/ 24 июня 2019

Мне нужно обновить все строки в нескольких столбцах одновременно.В основном полная таблица данных.Формат таблицы данных предварительно создан.Я новичок в ADO и только пару недель с ним.Вот проблема, я могу обновить каждую строку индивидуально, но не могу обновить все.Куда бы я ни посмотрел, от MS до форумов, они продолжают ссылаться на «ГДЕ».Как один основной столбец, ссылающийся на другие.Это НЕ то, что мне нужно.Все, что мне нужно, это обновить таблицу в базе данных, когда приложение закрыто или аварийно завершено, и загружено, когда приложение открыто.

Я пробовал почти все, начиная с реальных команд SQL и SQL.Но столбец продолжает обновляться как полный с одним значением, так как у меня нет ссылки WHERE, и при сохранении я ссылаюсь на индекс в строке ... Если я пытаюсь использовать для оператора, как я использую для нагрузки, он выдает ошибку, очевидно, потому что это простовыводит полные данные с помощью «ExecuteNonQuery».Я думаю, что мне нужно загрузить адаптер с данными, а затем загрузить его с базой данных, но я также получаю ошибки с ним ....

VB.net Load From Database

    Dim connectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim sql As String = "Select * FROM Table1"
    Dim connection As New SqlConnection(connectionString)
    Dim dataadapter As New SqlDataAdapter(sql, connection)
    Dim ds As New DataSet()
    connection.Open()
    dataadapter.Fill(ds, "Data") ' Data tags data

    'Count Rows In data Table
    Dim commandRowCount As New SqlCommand("Select COUNT(*) FROM " + "dbo.Table1", connection)
    Dim countStart As Long = System.Convert.ToInt32(commandRowCount.ExecuteScalar())
    TextBox1.Text = countStart


    For x = 0 To countStart - 1
        If x = 0 Then
            DataG.Rows.Add(1)
        ElseIf x < countStart - 1 Then
            DataG.Rows.Add(x)
        End If
        DataG.Rows(x).Cells("Column1").Value = ds.Tables("Data").Rows(x).Item("Column1")
        DataG.Rows(x).Cells("Column2").Value = ds.Tables("Data").Rows(x).Item("Column2")
        DataG.Rows(x).Cells("Column3").Value = ds.Tables("Data").Rows(x).Item("Column3")
    Next

    connection.Close()
End Sub

Сохранить данные - ВЫПУСК:

Dim connetionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim con As New SqlClient.SqlConnection(connetionString)
    con.Open()
    Dim cmd As New SqlClient.SqlCommand("Update Table1 SET Column1 = @Column1", con)
    Dim adapter As SqlDataAdapter = New SqlDataAdapter()


    cmd.Parameters.Add(New SqlClient.SqlParameter("@Column1", DataG.Item("Column1", rowIndex:=0).Value))


    cmd.ExecuteNonQuery()
    con.Close()'''

Я бы предположил, что этот пример MS должен работать для того, что мне нужно, но он продолжает выдавать Error Column1, НЕ предоставленный по какой-либо причине.Однако значение в ячейке присутствует и пустых строк нет.Поэтому я очень запутался, почему он считает, что ценности не существует.Однако, если я ссылаюсь на первый столбец как «DataG.Rows (1) .Cells (« Column1 »). Значение», это работает .... это означает, что мне нужно где-то определить Table, но я понятия не имею, где

 Dim connectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
    Dim connection As New SqlConnection(connectionString)
    Dim adapter As SqlDataAdapter = New SqlDataAdapter()
    connection.Open()
    Dim command As SqlCommand = New SqlCommand("Select * FROM Table1 ", connection)
    command.Parameters.Add("@Column1", SqlDbType.NVarChar, 50, "Column1")
    adapter.SelectCommand = command
    command.ExecuteNonQuery()
    command = New SqlCommand("INSERT INTO Table1 (Column1) " & "VALUES (@Column1)", connection)
    command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    command.ExecuteNonQuery()
    adapter.InsertCommand = command
    command = New SqlCommand("UPDATE Table1 Set Column1 = @Column1", connection)
    command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    command.ExecuteNonQuery()
    Dim parameter As SqlParameter = command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    parameter.SourceVersion = DataRowVersion.Original
    adapter.UpdateCommand = command
    command.ExecuteNonQuery()
    command = New SqlCommand("DELETE FROM Table1 WHERE Column1 = @Column1", connection)
    parameter = command.Parameters.Add("@Column1", SqlDbType.NChar, 50, "Column1")
    parameter.SourceVersion = DataRowVersion.Original
    adapter.DeleteCommand = command
    command.ExecuteNonQuery()

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

1 Ответ

0 голосов
/ 25 июня 2019

Блоки Using...End Using гарантируют, что объекты вашей базы данных будут закрыты и удалены даже в случае ошибки.

У ADO есть 3 класса, которые я использую.

  • DataTable - представление в памяти результата оператора Select.Здесь я использовал метод Load, чтобы заполнить его данными.

  • SQLConnection - строка подключения передается в конструктор.

  • SQLCommand - TheОператор Sql и соединение передаются в конструктор
    .В коллекцию параметров добавляются: .Add (имя_параметра, тип данных, размер), а затем .Value для установки значения параметра
    .

Откройте соединение впоследний возможный момент.Он будет закрыт как можно скорее с End Using

Я не уверен, что должен делать последний блок вашего кода.

Private Sub OPCode1()
    Dim dt As New DataTable
    Using connection As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True")
        Using cmd As New SqlCommand("Select * FROM Table1", connection)
            connection.Open()
            dt.Load(cmd.ExecuteReader)
        End Using 'Close and dispose command
    End Using 'Close and dispose connection
    'I am assuming that DataG is the name of a DataGridView on you form
    DataG.DataSource = dt
End Sub

Private Sub OPCode2()
    Using con As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True")
        Using cmd As New SqlCommand("Update Table1 SET Column1 = @Column1", con)
            'The item property references a cell in the grid Item(columnIndex As Integer, rowIndex As Integer)
            'So this sets the value to the first column (index 0) of the first row (index 0)
            'Since the size of the field is 50, it wouldn't make any sense for it to be NChar.
            cmd.Parameters.Add("@Column1", SqlDbType.NVarChar, 50).Value = DataG.Item(0, 0).Value
            con.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub

РЕДАКТИРОВАТЬ Вы хотите внести изменения в DataGridView и сделать эти изменения в базе данных.Да?Не нужно ничего предварительно собирать, пока таблица существует в базе данных.

DataGridView заполняется из DataTable, который загружается из базы данных.Если для свойства grids .DataSource установлено значение DataTable, оно связывается.Изменения, внесенные в данные в пользовательском интерфейсе, отражаются в DataTable.Вы можете добавить обновление или удалить, если вы включили Первичный ключ в оператор Select.

Когда вы будете готовы обновить базу данных, вы нажмете кнопку Обновить.DataTable отслеживает любые изменения в сетке.DataAdapter отправит эти изменения в базу данных методом Update.Мы должны воссоздать команду Select, чтобы адаптер мог создавать операторы Insert, Update и Delete, связанные с Select.(см. SqlCommandBuilder).Open соединение, позвоните Update() и, наконец, наберите .AcceptChanges() на DataTable.Этот последний шаг позволяет вам вносить дополнительные изменения и обновлять снова, не повторяя первые обновления.

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

Private dt As New DataTable

Private Sub UpdateDataAdapter_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Using cn As New SqlConnection(My.Settings.BuildersConnectio)
        Using cmd As New SqlCommand("Select * From Products", cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using
    DataGridView1.DataSource = dt
End Sub

Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
    Using cn As New SqlConnection(My.Settings.BuildersConnectio)
        Dim adapter As New SqlDataAdapter()
        adapter.SelectCommand = New SqlCommand("Select * From Products", cn)
        Dim builder As SqlCommandBuilder = New SqlCommandBuilder(adapter)
        cn.Open()
        adapter.Update(dt)
        dt.AcceptChanges()
    End Using
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...