首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delphi uniquery中的更新和删除代码

delphi uniquery中的更新和删除代码
EN

Stack Overflow用户
提问于 2016-05-09 13:26:41
回答 1查看 11K关注 0票数 0

我想更新和删除我的记录。我使用dbgrid来显示数据库,并使用uniquery进行查询。我成功地执行了insert查询,但没有使用update和delete。

这是我的代码:

代码语言:javascript
复制
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.

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 05:24:45

您对查询使用了错误的语法。

查询不使用Delphi语法,:=在这种上下文中也没有意义。

将查询更改为:

代码语言:javascript
复制
UniQuery1.SQL.Add('UPDATE barang SET id= :i, name= :nam, stock = :st where id= :i');

:是一个前缀,它告诉TQuery这些都是命名的参数。

而且,对set id = :i where id = :i来说,这是没有意义的,这是没有意义的。

因此,您可以将查询简化为:

代码语言:javascript
复制
UniQuery1.SQL.Add('UPDATE barang SET name= :nam, stock = :st where id= :i');

此外,您不必插入/编辑查询。

这些方法不像你想的那样。

插入和编辑已经由SQL语句完成。

不要使用SQL.Add。它速度慢,容易出错,因为如果您的SQL中已经有文本,那么添加的文本将与已经存在的SQL发生冲突。

永远不要再使用SQL.Add

更改第一个方法如下:

代码语言:javascript
复制
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;

这种方法没有任何意义。

代码语言:javascript
复制
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语句即可。

最后,最后一个方法应该如下所示:

代码语言:javascript
复制
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一起使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37117011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档