我想更新和删除我的记录。我使用dbgrid来显示数据库,并使用uniquery进行查询。我成功地执行了insert查询,但没有使用update和delete。
这是我的代码:
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.谢谢!
发布于 2016-05-10 05:24:45
您对查询使用了错误的语法。
查询不使用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 ->,Query.Open。
或者它是否会更改数据(删除/插入/更新) ->所以Query.ExecSQL。
其余的都是在SQL.Text中完成的。
、Query.Edit等
是的,你可以做Query.Edit。
这使dataset处于编辑模式,并允许用户更改查询中的字段。然后,数据库层将将这些更改传输到底层数据库表。
但是,这只在查询简单的情况下才能工作。否则,它将悄然中断,不会更新您的表。
只有edit/insert/delete/post/cancel等与Tables一起使用。
https://stackoverflow.com/questions/37117011
复制相似问题