Q&A

  • Insert 속도가 이렇게 느린이유가 뭡니까?(DB:Access)
Delphi 5와 Access를 묶어 작업하고 있습니다

먼저 Main 창에서 New 창을 띄워 새로운 레코드를 Insert하는 단순한 구성입니다

그런데 문제는 New 창에서 Insert한 후 Main 창을 Refresh하여도 일정시간이 지나야

Insert된 Data를 가져온다는 것입니다



Insert하는 시점에서 Main 창을 Refresh하여 Insert된 것을 반영하지 않으면

안돼는데 3~5초가 지나야 제대로 된 Data를 가져옵니다



제가 뭣인가 설정을 빼먹었나요?



아래 1) 은 ADO를 이용한 ADOQuery를 이용한 Source의 일부이며

아래 2) 는 BDE를 이용한 Query를 이용한 Source의 일부입니다



고수님들의 한수 지도바랍니다



아래 1) ADOQuery를 이용

MyQuery.Append;

MyQuery.FieldValues['Cust_No'] := Edit_CustNo.Text;

MyQuery.FieldValues['Bill_To'] := Edit_BillTo.Text;

MyQuery.FieldValues['Loc_Addr'] := Edit_LocAddr.Text;

MyQuery.FieldValues['Biz_Mode'] := StrToIntDef(Edit_BizMode.Text,0);

MyQuery.FieldValues['AR_Term'] := StrToIntDef(Edit_ARTerm.Text,0);

if(UpperCase(CBox_Contact.Text) = 'TRUE') then

MyQuery.FieldValues['Contact'] := true

else

MyQuery.FieldValues['Contact'] := false;



MyQuery.FieldValues['Shi'] := Edit_SHI.Text;

MyQuery.FieldValues['Our_Comment'] := Edit_Comment.Text;

MyQuery.Post;





아래 2)Query 이용



MyQuery.close;

MyQuery.sql.clear;

qryString := 'INSERT INTO TCom_Customer';

qryString := qryString + ' (Cust_No, Bill_To, Loc_Addr, Biz_Mode,';

qryString := qryString + ' AR_Term, Contact, Shi, Our_Comment)';

qryString := qryString + ' VALUES

(:pCustNo, :pBillTo, :pLocAddr, :pBizMode,';

qryString := qryString + ' :pARTerm, :pContact, :pShi, :pComment)';

MyQuery.sql.Add(qryString);

MyQuery.ParamByName('pCustNo').AsString := Edit_CustNo.Text;

MyQuery.ParamByName('pBillTo').AsString := Edit_BillTo.Text;

MyQuery.ParamByName('pLocAddr').AsString := Edit_LocAddr.Text;

MyQuery.ParamByName('pBizMode').AsInteger := StrToIntDef

(Edit_BizMode.Text,0);

MyQuery.ParamByName('pARTerm').AsInteger := StrToIntDef(Edit_ARTerm.Text,0);



if(UpperCase(CBox_Contact.Text) = 'TRUE') then

MyQuery.ParamByName('pContact').AsBoolean := true

else

MyQuery.ParamByName('pContact').AsBoolean := false;

MyQuery.ParamByName('pSHI').AsString := Edit_SHI.Text;

MyQuery.ParamByName('pComment').AsString := Edit_Comment.Text;



try

MyQuery.ExecSQL;

except

on E: Exception do

if not (E is ENoResultSet) then begin

raise;

MyQuery.close;

MyQuery.Free;

exit;

end

end;

MyQuery.close;



3  COMMENTS
  • Profile
    hobakpa 2001.01.30 21:00
    jbpark wrote:

    > Delphi 5와 Access를 묶어 작업하고 있습니다

    > 먼저 Main 창에서 New 창을 띄워 새로운 레코드를 Insert하는 단순한 구성입니다

    > 그런데 문제는 New 창에서 Insert한 후 Main 창을 Refresh하여도 일정시간이 지나야

    > Insert된 Data를 가져온다는 것입니다

    >

    > Insert하는 시점에서 Main 창을 Refresh하여 Insert된 것을 반영하지 않으면

    > 안돼는데 3~5초가 지나야 제대로 된 Data를 가져옵니다

    >

    > 제가 뭣인가 설정을 빼먹었나요?

    >

    > 아래 1) 은 ADO를 이용한 ADOQuery를 이용한 Source의 일부이며

    > 아래 2) 는 BDE를 이용한 Query를 이용한 Source의 일부입니다

    >

    > 고수님들의 한수 지도바랍니다

    >

    > 아래 1) ADOQuery를 이용

    > MyQuery.Append;

    > MyQuery.FieldValues['Cust_No'] := Edit_CustNo.Text;

    > MyQuery.FieldValues['Bill_To'] := Edit_BillTo.Text;

    > MyQuery.FieldValues['Loc_Addr'] := Edit_LocAddr.Text;

    > MyQuery.FieldValues['Biz_Mode'] := StrToIntDef(Edit_BizMode.Text,0);

    > MyQuery.FieldValues['AR_Term'] := StrToIntDef(Edit_ARTerm.Text,0);

    > if(UpperCase(CBox_Contact.Text) = 'TRUE') then

    > MyQuery.FieldValues['Contact'] := true

    > else

    > MyQuery.FieldValues['Contact'] := false;

    >

    > MyQuery.FieldValues['Shi'] := Edit_SHI.Text;

    > MyQuery.FieldValues['Our_Comment'] := Edit_Comment.Text;

    > MyQuery.Post;

    >

    >

    > 아래 2)Query 이용

    >

    > MyQuery.close;

    > MyQuery.sql.clear;

    > qryString := 'INSERT INTO TCom_Customer';

    > qryString := qryString + ' (Cust_No, Bill_To, Loc_Addr, Biz_Mode,';

    > qryString := qryString + ' AR_Term, Contact, Shi, Our_Comment)';

    > qryString := qryString + ' VALUES

    > (:pCustNo, :pBillTo, :pLocAddr, :pBizMode,';

    > qryString := qryString + ' :pARTerm, :pContact, :pShi, :pComment)';

    > MyQuery.sql.Add(qryString);

    > MyQuery.ParamByName('pCustNo').AsString := Edit_CustNo.Text;

    > MyQuery.ParamByName('pBillTo').AsString := Edit_BillTo.Text;

    > MyQuery.ParamByName('pLocAddr').AsString := Edit_LocAddr.Text;

    > MyQuery.ParamByName('pBizMode').AsInteger := StrToIntDef

    > (Edit_BizMode.Text,0);

    > MyQuery.ParamByName('pARTerm').AsInteger := StrToIntDef(Edit_ARTerm.Text,0);

    >

    > if(UpperCase(CBox_Contact.Text) = 'TRUE') then

    > MyQuery.ParamByName('pContact').AsBoolean := true

    > else

    > MyQuery.ParamByName('pContact').AsBoolean := false;

    > MyQuery.ParamByName('pSHI').AsString := Edit_SHI.Text;

    > MyQuery.ParamByName('pComment').AsString := Edit_Comment.Text;

    >

    > try

    > MyQuery.ExecSQL;

    > except

    > on E: Exception do

    > if not (E is ENoResultSet) then begin

    > raise;

    > MyQuery.close;

    > MyQuery.Free;

    > exit;

    > end

    > end;

    > MyQuery.close;

    전 초보인데 도움이 되셨으면 합니다.



    query1.DisableControls;

    {요부분에 refresh할 것들을 써주시면 되지 않을듯 합니다.}

    query1.EnableControls;





    --레코드를 서버에서 한번 읽어서 뿌려준다면 예를 들어 레코드 20000건이라면 20000번

    읽어서 그리드에 뿌려주는 일을 20000번 합니다. DisableControls;이란놈은 사용자 눈엔 보이지 않게 하면서 20000번을 내부적으로 읽어서 query1.EnableControls;요렇게 하면 한번에 보이죠. 제가 우편번호로 테스트 해
  • Profile
    jbpark 2001.01.31 09:50
    hobakpa wrote:

    > jbpark wrote:

    > > Delphi 5와 Access를 묶어 작업하고 있습니다

    > > 먼저 Main 창에서 New 창을 띄워 새로운 레코드를 Insert하는 단순한 구성입니다

    > > 그런데 문제는 New 창에서 Insert한 후 Main 창을 Refresh하여도 일정시간이 지나야

    > > Insert된 Data를 가져온다는 것입니다

    > >

    > > Insert하는 시점에서 Main 창을 Refresh하여 Insert된 것을 반영하지 않으면

    > > 안돼는데 3~5초가 지나야 제대로 된 Data를 가져옵니다

    > >

    > > 제가 뭣인가 설정을 빼먹었나요?

    > >

    > > 아래 1) 은 ADO를 이용한 ADOQuery를 이용한 Source의 일부이며

    > > 아래 2) 는 BDE를 이용한 Query를 이용한 Source의 일부입니다

    > >

    > > 고수님들의 한수 지도바랍니다

    > >

    > > 아래 1) ADOQuery를 이용

    > > MyQuery.Append;

    > > MyQuery.FieldValues['Cust_No'] := Edit_CustNo.Text;

    > > MyQuery.FieldValues['Bill_To'] := Edit_BillTo.Text;

    > > MyQuery.FieldValues['Loc_Addr'] := Edit_LocAddr.Text;

    > > MyQuery.FieldValues['Biz_Mode'] := StrToIntDef(Edit_BizMode.Text,0);

    > > MyQuery.FieldValues['AR_Term'] := StrToIntDef(Edit_ARTerm.Text,0);

    > > if(UpperCase(CBox_Contact.Text) = 'TRUE') then

    > > MyQuery.FieldValues['Contact'] := true

    > > else

    > > MyQuery.FieldValues['Contact'] := false;

    > >

    > > MyQuery.FieldValues['Shi'] := Edit_SHI.Text;

    > > MyQuery.FieldValues['Our_Comment'] := Edit_Comment.Text;

    > > MyQuery.Post;

    > >

    > >

    > > 아래 2)Query 이용

    > >

    > > MyQuery.close;

    > > MyQuery.sql.clear;

    > > qryString := 'INSERT INTO TCom_Customer';

    > > qryString := qryString + ' (Cust_No, Bill_To, Loc_Addr, Biz_Mode,';

    > > qryString := qryString + ' AR_Term, Contact, Shi, Our_Comment)';

    > > qryString := qryString + ' VALUES

    > > (:pCustNo, :pBillTo, :pLocAddr, :pBizMode,';

    > > qryString := qryString + ' :pARTerm, :pContact, :pShi, :pComment)';

    > > MyQuery.sql.Add(qryString);

    > > MyQuery.ParamByName('pCustNo').AsString := Edit_CustNo.Text;

    > > MyQuery.ParamByName('pBillTo').AsString := Edit_BillTo.Text;

    > > MyQuery.ParamByName('pLocAddr').AsString := Edit_LocAddr.Text;

    > > MyQuery.ParamByName('pBizMode').AsInteger := StrToIntDef

    > > (Edit_BizMode.Text,0);

    > > MyQuery.ParamByName('pARTerm').AsInteger := StrToIntDef(Edit_ARTerm.Text,0);

    > >

    > > if(UpperCase(CBox_Contact.Text) = 'TRUE') then

    > > MyQuery.ParamByName('pContact').AsBoolean := true

    > > else

    > > MyQuery.ParamByName('pContact').AsBoolean := false;

    > > MyQuery.ParamByName('pSHI').AsString := Edit_SHI.Text;

    > > MyQuery.ParamByName('pComment').AsString := Edit_Comment.Text;

    > >

    > > try

    > > MyQuery.ExecSQL;

    > > except

    > > on E: Exception do

    > > if not (E is ENoResultSet) then begin

    > > raise;

    > > MyQuery.close;

    > > MyQuery.Free;

    > > exit;

    > > end

    > > end;

    > > MyQuery.close;

    > 전 초보인데 도움이 되셨으면 합니다.

    >

    > query1.DisableControls;

    > {요부분에 refresh할 것들을 써주시면 되지 않을듯 합니다.}

    > query1.EnableControls;

    >

    >

    > --레코드를 서버에서 한번 읽어서 뿌려준다면 예를 들어 레코드 20000건이라면 20000번

    > 읽어서 그리드에 뿌려주는 일을 20000번 합니다. DisableControls;이란놈은 사용자 눈엔 보이지 않게 하면서 20000번을 내부적으로 읽어서 query1.EnableControls;요렇게 하면 한번에 보이죠. 제가 우편번호로 테스트 해
  • Profile
    성더기 2001.01.31 22:05
    database 컴포넌트를 사용하시고 트랜잭셔처리를 해서 Commit를 사용하면

    어떨지 싶습니다.