В данном посте будем учиться редактировать записи Update. Для этого нужно провести подготовительную работу на сервере, обновить класс методов сервера у клиента, и вызывать соответствующие методы со стороны клиента. Всего существует 3 способа –
Через TServerMethods. На мой взгляд менее удобный в смысле трудоемкости (особенно для select). Нет зависимости от COM. (Рассмотрим в других постах, так как надо будет менять набор компонентов)
Через провайдеры и прямую отправку SQL запросов. На мой взгляд более удобный – менее трудоемкий. Есть зависимость от COM. (Рассмотрим здесь)
Через провайдеры и методы ClientDataSet (Insert, Edit, Delete) (Рассмотрим здесь)
В данном посте рассмотрю только способы – через провайдеры как более простой и удобный на мой взгляд. Новый способ рассмотрю в других постах.
В принципе, кардинально ничего не меняется по сравнению с выборкой – просто меняем текст запроса и создаем пару дополнительных методов на сервере.
UPDATE через провайдеры и прямую отправку SQL запросов
Какие компоненты используем на сервере?
В методах сервера выставляем такие компоненты…
Какие методы нужно добавить на сервере?
В разделе public TServerMethods1 добавляем
1 2 3 |
procedure Sqlquery_SQL_Add(text:string); procedure Sqlquery_SQL_clear; procedure Sqlquery_ExecSQL; |
Далее пишем реализации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
procedure TServerMethods1.Sqlquery_SQL_Add(text: string); begin sqlquery1.SQL.Add(text); end; procedure TServerMethods1.Sqlquery_SQL_clear; begin sqlquery1.SQL.Clear; end; procedure TServerMethods1.Sqlquery_ExecSQL; begin sqlquery1.ExecSQL; end; |
Какие компоненты используем на клиенте?
(справа DBGrid1)
Создаем новую кнопку
И добавляем на неё такой код…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
procedure TForm1.Button3Click(Sender: TObject); var smc: TServerMethods1Client; CurrentRecordNO: integer; begin CurrentRecordNO := DBGrid.DataSource.DataSet.Fields.Fields[0].Value; smc := TServerMethods1Client.Create(Sqlconnection.DBXConnection); try smc.Sqlquery_SQL_clear; smc.Sqlquery_SQL_add( 'update mytable set myfield=''NewRecordUpdated'' where primary_key = ' + inttostr(CurrentRecordNo)); smc.Sqlquery_ExecSQL; smc.Sqlquery_SQL_clear; smc.Sqlquery_SQL_add('select * from mytable'); Clientdataset.Close; Clientdataset.Open; finally smc.Free; end; end; |
Тестируем… Все работает…
UPDATE через ClientDataSet1.Edit
Какие изменения произойдут?
В методах сервера, у компонента DataSetProvider1 пишем название таблицы с которой будем работать…
1 2 3 4 5 |
procedure TServerMethods1.DataSetProvider1GetTableName(Sender: TObject; DataSet: TDataSet; var TableName: string); begin TableName:='MyTable'; end; |
Иначе система будет ошибаться. Если меняем таблицу, с которой будем работать – здесь её тоже нужно поменять
Также нужно изменить обработчик события на кнопке таким образом
1 2 3 4 5 6 7 8 9 10 |
procedure TForm.ButtonClick(Sender: TObject); begin CurrentRecordNO := DBGrid.DataSource.DataSet.Fields.Fields[0].Value; Clientdataset.Edit; Clientdataset.FieldByName('Primary_key').AsInteger:=CurrentRecordNo; Clientdataset.FieldByName('myfield').AsString:='MyNewRecordUpdated'; Clientdataset.Post; Clientdataset.ApplyUpdates(-1); ClientDataset1.Refresh; end; |