【问题标题】:Code for UPDATE and DELETE in delphi uniquerydelphi uniquery 中的 UPDATE 和 DELETE 代码
【发布时间】:2016-05-09 13:26:41
【问题描述】:

我正在尝试更新和删除我的记录。 我正在使用 dbgrid 来显示数据库,并且我使用 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.

谢谢!

【问题讨论】:

  • 你写id:=i而不是id = :i等等。此外,这个问题缺乏非常关键的细节。您没有报告您观察到的错误。请不要那样做。如果人们习惯于忽略错误的内容,通常不会报告错误。不。阅读错误内容。
  • 'UniQuery1.Edit' 将当前记录置于编辑模式显然不是您所追求的。 'UniQuery1.SQLDelete' 设置从查询的结果集中删除记录时使用的 SQL,而不是 ExecSql。

标签: mysql sql delphi unidac uniquery


【解决方案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 一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多