DataAdapter.Update, запускающий DeleteCommand
У меня есть этот код:
Private Sub bbSaveloc_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbSaveloc.ItemClick
gvLocations.CloseEditor()
gvLocations.UpdateCurrentRow()
'standorte speichern
fb.Connect()
fb.ReadyForData()
fb.Command.Parameters.AddWithValue("@company_id", company_id)
'evtl. vorhandene location_id-s holen
fb.Command.CommandText = "select location_id from locations where company_id=@company_id order by location_id"
Try
fb.Datareader = fb.Command.ExecuteReader
Catch ex As FirebirdSql.Data.FirebirdClient.FbException
XtraMessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
fb.Close()
Exit Sub
End Try
Dim index As Integer = 0
If fb.Datareader.HasRows Then
While fb.Datareader.Read
fb.Dataset.Tables(0).Rows(index).Item(0) = fb.Datareader.Item(0)
index = index + 1
End While
End If
'insert
fb.Command.Parameters.Add("@location_id", FirebirdSql.Data.FirebirdClient.FbDbType.Integer, 0, "LOCATION_ID")
fb.Command.Parameters.Add("@name", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 50, "NAME")
fb.Command.Parameters.Add("@postal_code", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 10, "POSTAL_CODE")
fb.Command.Parameters.Add("@road_nr", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 100, "ROAD_NR")
fb.Command.CommandText = "insert into locations values ((SELECT NEXT VALUE FOR GEN_LOCATION_ID FROM RDB$DATABASE), @company_id, @name, @postal_code, " & _
"@road_nr)"
fb.Dataadapter.InsertCommand = fb.Command
If Not savefirst Then
'update
fb.Command.CommandText = "update locations set name=@name, postal_code=@postal_code, road_nr=@road_nr where location_id=@location_id and company_id=@company_id"
fb.Dataadapter.UpdateCommand = fb.Command
'delete
fb.Command.CommandText = "delete from locations where company_id=@company_id"
fb.Dataadapter.DeleteCommand = fb.Command
End If
fb.Dataadapter.Update(fb.Dataset.Tables(0))
savefirst = False
End Sub
У меня есть следующая проблема с этим:
Я вставляю строку в сетку, затем сохраняю ее -> хорошо. Затем я изменяю некоторые значения этой строки в виде сетки, затем сохраняю ее -> строка будет удалена и не будет обновлена как исключенная.
Я проверил RowState
этой строки, это модифицировано. Поэтому я не понимаю, почему он удаляет строку.
Если я не инициализирую DeleteCommand
обновление работает как исключено.
РЕДАКТИРОВАТЬ:
Я сейчас переписал код:
'standort datasource initialisieren
fb_loc.Connect()
fb_loc.ReadyForData()
'select
fb_loc.Command.Parameters.AddWithValue("@company_id", company_id)
fb_loc.Command.CommandText = "select * from locations where company_id=@company_id"
fb_loc.Dataadapter.SelectCommand = fb_loc.Command
Try
fb_loc.Dataadapter.Fill(fb_loc.Dataset, "locations")
Catch ex As FirebirdSql.Data.FirebirdClient.FbException
XtraMessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
fb_loc.Close()
Exit Sub
End Try
gcLocations.DataSource = fb_loc.Dataset.Tables(0)
'insert
Dim insert_command As New FbCommand("insert into locations values ((SELECT NEXT VALUE FOR GEN_LOCATION_ID FROM RDB$DATABASE), @company_id, @name, @postal_code, " & _
"@road_nr)", fb_loc.Connection)
insert_command.Parameters.AddWithValue("@company_id", company_id)
insert_command.Parameters.Add("@location_id", FirebirdSql.Data.FirebirdClient.FbDbType.Integer, 0, "LOCATION_ID")
insert_command.Parameters.Add("@name", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 50, "NAME")
insert_command.Parameters.Add("@postal_code", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 10, "POSTAL_CODE")
insert_command.Parameters.Add("@road_nr", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 100, "ROAD_NR")
fb_loc.Dataadapter.InsertCommand = insert_command
'update
Dim update_command As New FbCommand("update locations set name=@name, postal_code=@postal_code, road_nr=@road_nr where location_id=@location_id and company_id=@company_id", _
fb_loc.Connection)
update_command.Parameters.AddWithValue("@company_id", company_id)
update_command.Parameters.Add("@location_id", FirebirdSql.Data.FirebirdClient.FbDbType.Integer, 0, "LOCATION_ID")
update_command.Parameters.Add("@name", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 50, "NAME")
update_command.Parameters.Add("@postal_code", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 10, "POSTAL_CODE")
update_command.Parameters.Add("@road_nr", FirebirdSql.Data.FirebirdClient.FbDbType.VarChar, 100, "ROAD_NR")
fb_loc.Dataadapter.UpdateCommand = update_command
'delete
Dim delete_command As New FbCommand("delete from locations where company_id=@company_id", fb_loc.Connection)
delete_command.Parameters.AddWithValue("@company_id", company_id)
fb_loc.Dataadapter.DeleteCommand = delete_command
fb_loc.Close()
Тогда метод сохранения:
Private Sub bbSaveloc_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbSaveloc.ItemClick
gvLocations.CloseEditor()
gvLocations.UpdateCurrentRow()
fb_loc.Dataadapter.Update(fb_loc.Dataset.Tables(0))
End Sub
Вставка работает, но обновление не работает. Я получаю исключение dbconcurrency.
Я полагаю, я должен получить сгенерированные значения автоинкремента для location_id
вернуться к набору данных. Поскольку обновление не может быть выполнено из-за отсутствия location_id
ценности. Но как мне вернуть эти значения в таблицу данных?
1 ответ
Вы используете одну команду для обновления и команду удаления:
'update
fb.Command.CommandText = "update locations set name=@name, postal_code=@postal_code, road_nr=@road_nr where location_id=@location_id and company_id=@company_id"
fb.Dataadapter.UpdateCommand = fb.Command
'delete
fb.Command.CommandText = "delete from locations where company_id=@company_id"
fb.Dataadapter.DeleteCommand = fb.Command
Таким образом, последнее назначение "выигрывает", действие удаления.
Вместо этого вам нужно создавать разные команды для каждого действия.