Код для ОБНОВЛЕНИЯ и УДАЛЕНИЯ в Delphi Uniquery
Я пытаюсь обновить и удалить свою запись. Я использую dbgrid, чтобы показать базу данных, и я использую уникальные для выполнения запроса. Мне удалось сделать запрос вставки, но не с обновлением и удалением.
Вот мой код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Data.DB,
DBAccess, Uni, UniProvider, MySQLUniProvider, MemDS, Vcl.StdCtrls, DAScript,
UniScript;
type
TForm1 = class(TForm)
UniConnection1: TUniConnection;
MySQLUniProvider1: TMySQLUniProvider;
UniDataSource1: TUniDataSource;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Label4: TLabel;
DBGrid1: TDBGrid;
UniQuery1: TUniQuery;
UniScript1: TUniScript;
procedure Button1Click(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.Terminate();
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
UniQuery1.Edit;
UniQuery1.SQL.Add('UPDATE barang SET id:=i, name:=nam, stock:=st where id=:i');
UniQuery1.ParamByName('i').AsString := Edit1.Text;
UniQuery1.ParamByName('nam').AsString := Edit2.Text;
UniQuery1.ParamByName('st').AsString := Edit3.Text;
UniQuery1.ExecSQL;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
UniQuery1.Insert;
UniQuery1.FieldByName('ID').AsString := Edit1.Text;
UniQuery1.FieldByName('Name').AsString := Edit2.Text;
UniQuery1.FieldByName('Stock').AsString := Edit3.Text;
UniQuery1.Post;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
UniQuery1.Edit;
UniQuery1.SQLdelete('DELETE FROM barang where id=:i');
UniQuery1.ParamByName('i').AsString:=edit1.Text;
UniQuery1.ExecSQL;
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
edit1.Text := DBGrid1.Fields[0].asstring;
edit2.text := DBGrid1.Fields[1].asstring;
edit3.Text := DBGrid1.Fields[2].asstring;
end;
end.
Спасибо!
1 ответ
Вы используете неправильный синтаксис для вашего запроса.
Запрос не использует синтаксис Delphi и :=
не имеет смысла в этом контексте.
Измените запрос на:
UniQuery1.SQL.Add('UPDATE barang SET id= :i, name= :nam, stock = :st where id= :i');
:
это префикс, который говорит TQuery
что это именованные параметры.
Кроме того, мало смысла set id = :i where id = :i
это неоперация.
Таким образом, вы можете упростить запрос:
UniQuery1.SQL.Add('UPDATE barang SET name= :nam, stock = :st where id= :i');
Кроме того, вам не нужно вставлять / редактировать запросы.
Эти методы не делают то, что вы думаете, они делают.
Вставка и редактирование уже выполняются вашими операторами SQL.
Не использовать SQL.Add
, Это медленно и подвержено ошибкам, потому что, если в вашем SQL уже есть текст, добавленный текст будет конфликтовать с уже существующим SQL.
Никогда не используйте SQL.Add
еще когда-либо.
Измените первый метод следующим образом:
procedure TForm1.Button4Click(Sender: TObject);
begin
UniQuery1.SQL.Text:= 'UPDATE barang SET name= :nam, stock = :st where id=:i';
UniQuery1.ParamByName('i').AsString := Edit1.Text;
UniQuery1.ParamByName('nam').AsString := Edit2.Text;
UniQuery1.ParamByName('st').AsString := Edit3.Text;
UniQuery1.ExecSQL;
end;
Этот метод не имеет никакого смысла.
procedure TForm1.Button5Click(Sender: TObject);
begin
UniQuery1.Insert; //insert what? A query is not a table.
UniQuery1.FieldByName('ID').AsString := Edit1.Text;
UniQuery1.FieldByName('Name').AsString := Edit2.Text;
UniQuery1.FieldByName('Stock').AsString := Edit3.Text;
UniQuery1.Post; //makes no sense here.
end;
Просто замените это на INSERT INTO....
SQL заявление.
Наконец, последний метод должен выглядеть так:
procedure TForm1.Button6Click(Sender: TObject);
begin
UniQuery1.SQL.Text:= 'DELETE FROM barang where id=:i';
UniQuery1.ParamByName('i').AsString:=edit1.Text;
UniQuery1.ExecSQL;
end;
Конечно, вы выяснили, что нет метода под названием SQLdelete?
Вы должны переосмыслить концепцию.
Это оператор SQL, который делает работу.
Запрос только заботится, если оператор является выбором -> если это так Query.Open
,
Или если это изменит данные (удалить / вставить / обновить) -> так Query.ExecSQL
,
Все остальное делается в SQL.Text
,
Query.Edit и т. Д.
Да, вы можете сделать Query.Edit.
Это переводит набор данных в режим редактирования и позволяет пользователю изменять поля в запросе. Уровень базы данных затем передает эти изменения в базовые таблицы базы данных.
Однако это работает, только если запрос прост. Если нет, то он молча сломается и не обновит ваши таблицы.
Использовать только edit/insert/delete/post/cancel
и т.д. с Tables
,