아래와 같이 하면
"Query1 : Cannot perform this operation on a closed dataset" 이라고
나옵니다.
어떻게 해야되는지요..좀 가르쳐 주십시요.
참고로 Query1.UpdateObject := UpdateSQL1;
Query1.CachedUpdate := true;
글구 UpdateSQL1쪽에
insert into tb_ms_log1
(logno,p_date_time) values (:K1,:K2)
를 insert property쪽에 등록해놨습니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Query1: TQuery;
UpdateSQL1: TUpdateSQL;
Database1: TDatabase;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
logno: Integer;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Select MAX(logno)');
Query1.SQL.Add('from tb_ms_log1');
Query1.Open;
logno := StrToInt(Query1.Fields[0].AsString);
inc(logno);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.Open;
Query1.SQL.Clear;
Query1.Insert; //Query1.Append;
Query1.FieldByName('K1').AsString := IntToStr(logno);
Query1.FieldByName('K2').AsString := 'ttt';
Query1.ExecSQL; //Query1.Post;
Query1.ApplyUpdates;
end;
우선 질문하나 할까요?
왜 TUpdateSQL을 쓰세요? 아래와 같은 상황에선 TUpdateSQL을 쓸 필요가 없는것 같은데요.
한건의 데이터를 입력하는데..
그리고, 필드 타입 설명이 없어서 추측인데요.
p_date_time은 날짜형 같은데.. 입력이 'ttt'가 들어갈수 있나요?
위와 같은 의문을 망각하고 일단 아래 상황에서 동작이 되도록 했습니다.
일단 Table에서 logno는 integer형으로 했고요. Primary key..
p_date_time는 임의로 aa로 고치고 varchar(10)을 줬습니다.
UpdateSQL1의 Insert쪽에
insert into tb_ms_log1(logno,aa) values (:logno,:aa)
라고 줬습니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from tb_ms_log1');
Query1.Open;
Query1.Insert; //Query1.Append;
Query1.fieldbyname('logno').AsString := IntToStr(logno);
Query1.fieldbyname('aa').AsString := 'ttt';
Query1.ApplyUpdates;
end;
이렇게 해서 일단은 입력이 되도록 했습니다.
MS-SQL 7.0 에서 실행했습니다.
한건의 데이터를 입력한다면 TUpdateSQL을 쓸 필요없이 그냥 TQuery에서 Insert/Update/Delete를 날리는게 더 좋을것 같은데요.
보통 TUpdateSQL은 마스터/디테일에서 디테일의 복수개의 데이터를 한번에 입력/수정/삭제등을 하기위해 쓰는 것으로 알고 있습니다.
주로 Grid에서 바로 입력/수정/삭제가 이루어 지겠죠.
님이 아래의 소스는 그냥 테스트용으로 만드신것 같기는 한데..
그리고, TDatabase 콤포넌트를 사용해서 Transaction을 걸어 주는게 좋겠습니다.
All or Nothing을 만들어야 하니까요.
저동 아래와 같은 상황에서 TUpdateSQL을 사용하지 않아서, 자세히는 모르니 다른 분에게 또 도움을 받으시길 바랍니다.
위대한 단군혼이 살아있는 나라.... 대한민국.
김종건 wrote:
> 아래와 같이 하면
> "Query1 : Cannot perform this operation on a closed dataset" 이라고
> 나옵니다.
>
> 어떻게 해야되는지요..좀 가르쳐 주십시요.
>
> 참고로 Query1.UpdateObject := UpdateSQL1;
> Query1.CachedUpdate := true;
> 글구 UpdateSQL1쪽에
> insert into tb_ms_log1
> (logno,p_date_time) values (:K1,:K2)
> 를 insert property쪽에 등록해놨습니다.
>
>
>
>
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> Db, DBTables, StdCtrls;
>
> type
> TForm1 = class(TForm)
> Button1: TButton;
> Query1: TQuery;
> UpdateSQL1: TUpdateSQL;
> Database1: TDatabase;
> procedure FormCreate(Sender: TObject);
> procedure Button1Click(Sender: TObject);
> private
> { Private declarations }
> public
> logno: Integer;
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> Query1.Close;
> Query1.SQL.Clear;
> Query1.SQL.Add('Select MAX(logno)');
> Query1.SQL.Add('from tb_ms_log1');
> Query1.Open;
> logno := StrToInt(Query1.Fields[0].AsString);
> inc(logno);
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> Query1.Close;
> Query1.Open;
> Query1.SQL.Clear;
> Query1.Insert; //Query1.Append;
> Query1.FieldByName('K1').AsString := IntToStr(logno);
> Query1.FieldByName('K2').AsString := 'ttt';
> Query1.ExecSQL; //Query1.Post;
> Query1.ApplyUpdates;
> end;
>
>