我正在尝试更新和删除我的记录。我使用dbgridas来显示数据库,并使用uniquery来执行查询。我设法进行了插入查询,但没有进行更新和删除。
这是我的代码:
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.
谢谢!
您的查询使用了错误的语法
查询不使用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语句完成的工作
查询只关心语句是否为select->if so Query.Open
或者它是否会更改数据(删除/插入/更新)->so Query.ExecSQL
其余全部在SQL.Text
中完成。
Query.Edit等
是的,您可以执行查询。编辑。
这将数据集置于编辑模式,并允许用户更改查询中的字段。然后,数据库层将这些更改传输到底层数据库表
但是,只有当查询很简单时,这才有效。否则,它将静默地中断并不会更新您的表
只能将edit/insert/delete/post/cancel
等与Tables
一起使用。