MySqlDataAdapter

215
15 мая 2018, 10:10

Имеется форма с компонентами DataGridView1, BindingSource1, DataTable

Необходимо сохранить в базу все изменения сделанные в DataGridView1 (т. е. необходимо переопределить в адаптере методы Update и Delete). Пытаюсь делать примерно так:

Dim dataset = DataTable  
Dim da As New MySqlDataAdapter()
Dim cn As New MySqlConnection(My.Settings.tickedoffConnectionString)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
                Using cmd As New MySqlCommand("SELECT `id`, `stay` FROM stay", cn)
                    cmd.CommandType = CommandType.Text
                    da.SelectCommand = cmd
                    da.Fill(dataset)
                    Dim bs = BindingSource1
                    bs.DataSource = dataset
                    DataGridView1.DataSource = bs
                    da.Update(dataset)
                End Using
               ' теперь необходимо переопределить апдейт и делит
                     Dim updateCommand As MySqlCommand = New MySqlCommand("UPDATE stay SET stay = @newValue WHERE `id` = @oldValue", cn)
                da.UpdateCommand = updateCommand
              Dim deleteCommand As MySqlCommand = New MySqlCommand("DELETE FROM stay WHERE `id` = @oldValue", cn)
                da.DeleteCommand = deleteCommand
                ' и при необходимости будет использоваться примерно так: da.Update(dataset)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Как сделать что бы вместо @newValue подставлялось новое значение с грида для соответствующей записи (т.е. с Id @oldValue)

P.S. Я знаю, что параметры можно добавлять

        updateCommand.Parameters.AddWithValue("@newValue", "new stay")
        updateCommand.Parameters.AddWithValue("@oldValue", "1")

но не знаю как их брать только для измененных полей т.е. хочется написать что-то вроде

Dim deleteCommand As MySqlCommand = New MySqlCommand("DELETE FROM stay WHERE `id` = @id", cn)

без явного указания значения идентификатора.

Answer 1

Смотрите Обновление источников данных с объектами DataAdapter.

Для вашей UpdateCommand:

"UPDATE stay SET stay = @newValue WHERE `id` = @oldValue"

нужно задать параметры:

var idParam = updateCommand.Parameters.Add("@oldValue", SqlDbType.Int); // укажите нужный тип
idParam.SourceColumn = "id";
idParam.SourceVersion = DataRowVersion.Original;
var stayParam = updateCommand.Parameters.Add("@newValue", SqlDbType.NChar, 10, "stay"); // укажите нужный тип и колонку-источник (можно сделать это как в примере выше)

DataAdapter сам будет брать значения из изменённных строк и подставлять вместо параметров, в соответствии с именами колонок-источников (SourceColumn).

var - это C#. В VB, вероятно, будет Dim.

READ ALSO
написать нейрон для X^2 [требует правки]

написать нейрон для X^2 [требует правки]

Надо написать прогу для решения функции y = x * x

250
Как вставить переменную в SQL-запрос

Как вставить переменную в SQL-запрос

Как вставить в этот запрос вместо tableName и name переменную?

280
Определить, какая кнопка нажата в GridView - UWP

Определить, какая кнопка нажата в GridView - UWP

Есть текстовый блок status и коллекция элементов, в каждом checkbox, button с , toggleswith (всё это в gridview через datatemplate, с привязкой к ObservableCollection во вью модели)Надо...

262