В данном посте будем учиться удалять записи Delete. Для этого нужно провести подготовительную работу на сервере, обновить класс методов сервера у клиента, и вызывать соответствующие методы со стороны клиента. Всего существует 3 способа –
Через TServerMethods. На мой взгляд менее удобный в смысле трудоемкости (особенно для select). Нет зависимости от COM. (Рассмотрим в других постах, так как надо будет менять набор компонентов)
Через провайдеры и прямую отправку SQL запросов. На мой взгляд более удобный – менее трудоемкий. Есть зависимость от COM. (Рассмотрим здесь)
Через провайдеры и методы ClientDataSet – (Insert, Edit, Delete) Самый легкий способ.(Рассмотрим здесь)
В данном посте рассмотрю только способы – через провайдеры как более простой и удобный на мой взгляд. Новый способ рассмотрю в других постах.
DELETE через провайдеры и прямую отправку 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; |
Какие компоненты используем на клиенте?
(справа DBGrid)
Создаем новую кнопку
И добавляем на неё такой код…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TForm.ButtonClick(Sender: TObject); var smc: TServerMethods1Client; currentRecordNO: integer; begin currentRecordNO := DBGrid.DataSource.DataSet.Fields.Fields[0].Value; smc:=TServerMethods1Client.Create(Sqlconnection1.DBXConnection); try smc.Sqlquery_SQL_clear; smc.Sqlquery_SQL_add('delete from mytable 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; |
Тестируем… Все работает…
Важный момент
Пара комментариев по поводу кода. Поскольку в инструкции нам нужен текущий номер записи, то нужно его прочитать из dbgrid. Именно из dbgrid – это важно. Потому что в ключевом поле СУБД записи автоинкрементны. И если, скажем, мы удаляем 18-ю запись, то 19-я запись 18-й не становится. Она остается 19-й. В результате, у нас получается ряд …16,17,19…. поэтому читать важно именно из Dbgrid.
Если читать запись таким образом..
Clientdataset1.RecNO
то мы поставим указатель мыши в нашем клиентском приложении на 19 запись, а на самом деле она окажется 18-й, потому что, похоже метод RecNO считает записи по порядку, а нам нужно так как отображено в базе (СУБД), а это не всегда будет совпадать.
Delete через ClientDataSet.Delete
Какие изменения в данном случае?
В методах сервера, у компонента DataSetProvider1 пишем название таблицы с которой будем работать…
1 2 3 4 5 6 |
procedure TServerMethods1.DataSetProvider1GetTableName(Sender: TObject; DataSet: TDataSet; var TableName: string); begin TableName:='MyTable'; end; |
Иначе система будет ошибаться. Если меняем таблицу, с которой будем работать – здесь её тоже нужно поменять.
Меняем обработчик на кнопке Delete…
1 2 3 4 5 6 7 8 |
procedure TForm.ButtonClick(Sender: TObject); var smc:TServerMethods1Client; begin Clientdataset.Delete; Clientdataset.ApplyUpdates(-1); Clientdataset.Refresh; end; |