Имеется форма с компонентами 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)
без явного указания значения идентификатора.
Смотрите Обновление источников данных с объектами 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.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости