Q&A

  • 동적 생성한 테이블 삭제시 Table is Busy에러
또 한가지 질문을 올립니다.

제가 임시 테이블이 필요하여 소스 내에서 동적으로 테이블을 생성하였습니다.

생성한 테이블을 사용후 삭제 하여고 하니 Table is Busy에러가 발생 합니다.

도대체 이유가 무얼까요?

아래는 사용 예 입니다.

// 테이블 동적 생성
tbl := TTable.Create(Application);
with tbl do
        begin
        Exclusive                 := False;
        Active                         := False;
        DatabaseName         := DBName;
        TableName                 := TblName;
        TableType                 := TblType;
        FieldDefs.Clear;
        FieldDefs.Add('INMONTH',         ftString, 10,        False);
        FieldDefs.Add('BCODE',                 ftString, 20,        False);
        FieldDefs.Add('SCODE',                 ftString, 20,         False);
        FieldDefs.Add('INPRICE',         ftInteger, 0,        False);
        FieldDefs.Add('OUTPRICE',        ftInteger, 0,        False);
        IndexDefs.Clear;
        IndexDefs.Add('', 'INMONTH;BCODE;SCODE', [ixPrimary, ixUnique]);
        CreateTable;
        Free;
        end;
// 생성 테이블 열고 데이터 추가
with Form1.Query1 do
        begin
        Close;
        Form1.DataSource1.DataSet         := Form1.Query1;
        DataBaseName        := Trim(gcTempDir);
        SQL.Clear;
        sSql := ' Select * From TEST1.DB where INMONTH = '2002-05-22';
        SQL.Add(sSql);
        ExecSQL;
        Open;
        First;
        SQL.Clear;
        sSql := ' Select * From TEST1.DB ';
        SQL.Add(sSql);
        ExecSQL;
        Form1.DataSource1.DataSet := Nil;
        Active        := False;
        end;
// 사용한 테이블 삭제
with Form1.Query1 do
        begin
        SQL.Clear;
        Close;
        Form1.DataSource1.DataSet        := Nil;
        SQL.Clear;
        SQL.Add('drop table ''TEST1.DB''');
        ExecSQL;
        end;
end;
6  COMMENTS
  • Profile
    한주영 2002.05.22 20:13
    Select SQL은 ExecSQL을 부를 수 없습니다.


  • Profile
    이성근 2002.05.22 20:58
    ExecSQL을 부를수 없다면 어떠한 방법으로 해야 하나요?
    현재 까지 ExecSQL를 사용하여 아무 이상없이 데이터의 Selection은 수행
    했거든요?

    답변 주신 애용은 좀 이해가 가지를 않네요.
    어떻게 써야하는지 설명좀 부탁 드릴께요

  • Profile
    김지엽 2002.05.22 19:43
    Table is Busy 라는건 Table이 다른 유져 (같은 유져라고 해도 본질적으로 똑같으니 같은 에러가 날 것임) 에 의해 Tansaction중이라 Tablespace를 없앨 수가 없다.. 이런 뜻이겠지요.

    CashedUpdate인가.. 그 방식을 사용하시나요? 전 그 방식을 잘 모르긴 하는데.. 그냥 제가 아는 바 대로의, 통상적인 Transcation을 사용할 때의 기준으로 보자면요. 테이블 인서트 엎데이트가 끝난 시점에서, Commit을 때려주시구 삭제 해 보세요. 그리고 같은 프로그램이라고 하더라도, 여기 저기서 열려있거나 multisession을 쓰심 안되구요.


  • Profile
    이성근 2002.05.22 20:52
    말씀하신 부분이 이런거 아닌가요?
    with Form1.Query1 do
    begin
    for i := 1 to 10 do
            begin
            Append;
            Edit;
            Fieldbyname('INMONTH').asString                := Trim(FormatDateTime('YYYY-MM-DD', Now));
            Fieldbyname('BCODE').asString                := 'Test';
            Fieldbyname('SCODE').asString                := Trim(IntToStr(i));
            Fieldbyname('INPRICE').asInteger        := i*i;
            Fieldbyname('OUTPRICE').asInteger        := i+i;
            Post;
            cachedupdates        := true;
            applyupdates;
            commitupdates;
            cachedupdates := false;
            end;
    RequestLive        := False;
    end;
    위와 같이 10개의 레코드 생성후 저장을 확실히 했는데도 마찬가지 이거든요?
    저장후 하는 방법은 별도움이 않되는것 같아요.

  • Profile
    김지엽 2002.05.22 22:28
    쩌읍. 실은 델파이로 쿼리 작업해 본지가 하두 오래되어서, 잘 기억들이 안나는데.. 위엣 분 말씀을 참고해서..

    TQUERY.execSQL 대신에
    TQUERY.open 해보시구..
    끝난 담에, DROP 하기 전에
    TQUERY.close 해보세여..

    글구 cashedUpdate 보담은 TDatabase를 사용해서, 정확한 TRANSACTION 모드를 사용하는게 훨씬 사용이 쉽지 않나 하구요.

  • Profile
    이성근 2002.05.23 22:43
    하찮은 초보자에게 많은 신경 써주셔서 감사 드립니다.
    말씀하신것 처럼 execSQL를 사용하지않고 하니 이상없이 실행 됩니다.
    다시 한번 감사드립니다.
    델파이 유저들 화이팅 ^^/: