2016-05-09 3 views
-1

Я пытаюсь обновить и удалить свою запись. Я использую dbgrid, чтобы показать базу данных, и я использую uniquery для выполнения запроса. Мне удалось выполнить запрос вставки, но не с обновлением и удалением.Код для ОБНОВЛЕНИЯ и УДАЛЕНИЯ в delphi 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. 

Спасибо!

+0

Вы пишете 'id: = i' вместо' id =: i' и так далее. Кроме того, в этом вопросе отсутствуют очень важные детали. Вы не сообщили, какую ошибку вы наблюдали. Пожалуйста, не делай этого. Обычно люди не сообщают об ошибках, если они привыкли игнорировать содержимое ошибок. Не. Прочитайте содержание ошибок. –

+0

«UniQuery1.Edit» помещает текущую запись в режим редактирования, очевидно, не то, что вам нужно. «UniQuery1.SQLDelete» устанавливает SQL, используемый при удалении записи из набора результатов запроса, а не ExecSql. – 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 so so Query.Open.
Или если он изменит данные (удалить/вставить/обновить) -> так Query.ExecSQL.
Все остальное сделано в SQL.Text.

Query.Edit и т.д.
Да, вы можете сделать Query.Edit.
Это ставит набор данных в режиме редактирования и позволяет пользователю изменять поля в запросе.Затем уровень базы данных передаст эти изменения в базовые таблицы базы данных.
Однако это работает только в том случае, если запрос прост. Если нет, он будет тихо разбиваться и не обновлять ваши таблицы.
Используйте только edit/insert/delete/post/cancel и т. Д. С Tables.

Смежные вопросы