0

I'm trying to update and delete my record. I'm using dbgrid as to show the database and i use uniquery to do the query. I managed to do the insert query but not with the update and delete.

Here is my code :

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.

Thanks!

4

1 に答える 1

3

クエリに間違った構文を使用しています。
クエリは 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
または、データを変更する場合 (削除/挿入/更新) -> そうQuery.ExecSQL.
残りはすべて で行われますSQL.Text

Query.Edit など
はい、Query.Edit を実行できます。
これにより、データセットが編集モードになり、ユーザーがクエリのフィールドを変更できるようになります。データベース レイヤーは、これらの変更を基になるデータベース テーブルに送信します。
ただし、これはクエリが単純な場合にのみ機能します。そうしないと、静かに壊れてテーブルが更新されません。etc
のみを使用してください。edit/insert/delete/post/cancelTables

于 2016-05-10T05:24:45.700 に答える