2016-05-09 8 views
-1

私のレコードを更新して削除しようとしています。 私はデータベースを表示するためにdbgridを使用しています。私はクエリを実行するためにユニークを使用しています。 私は挿入クエリを実行することができましたが、更新と削除は行いませんでした。デルファイユニークの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. 

ありがとう:

は、ここに私のコードです!

+0

あなたは 'id =:i'の代わりに' id:= i'と書いています。また、質問には非常に重要な詳細が欠けています。あなたはあなたが観察したエラーを報告しませんでした。お願い、それはやめて。通常、人々はエラーの内容を無視する習慣がある場合、エラーを報告しません。しないでください。エラーの内容を読んでください。 –

+0

'UniQuery1.Edit'は現在のレコードを編集モードにします。 'UniQuery1.SQLDelete'は、Execsql以外のクエリの結果セットからレコードを削除するときに使用されるSQLを設定します。 – FredS

答えて

2

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

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

関連する問題