Q&A

  • UpdateSQL과 Cachedupdate사용시 error...
아래와 같이 하면

"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;





1  COMMENTS
  • Profile
    까마귀 2001.03.09 00:51
    안녕하세요. 까마귀입니다.



    우선 질문하나 할까요?

    왜 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;

    >

    >