C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[12974] 그렇군요... ㅡㅡ;
나그네 [] 1004 읽음    2001-11-22 16:32
제가 생각하기에는...
TADOTable이나 TADOQuery를 동적으로 생성해서 이용을 하는데.
이 객체들이 가지고있는 RecordSet 객체 있지 않습니까?

테이블객체나 쿼리 객체를 이용해서 필터나 쿼리를 수행하면 그 결과 값이
레코드셋 객체에 들어가자나요.
근데 이 레코드셋객체에 레코드수가 0이면

이 동적으로 생성한 객체를 없애거나
폼을 닫는데서
EOleException이 발생하구요..
뭐 BOF나 EOF가 어쩌구 저쩌구 하면서 에러가 나오거든요...

제말 이해 가시나요?

ㅡㅡ;
제가 ADO객체를 잘못 사용하고 있는건지... ㅡㅡ;

암튼 답변 너무너무 감사합니다..

강요찬 님이 쓰신 글 :
: 네. 그랬군요.
:
: 나그네님께서 쓰신 내용대로 테스트를 또 해봤습니다.
: C:\\temp\\test.mdb 엑세스 엠디비 파일을 만들어 그 안에 table1,table2,table3 등 3개의 테이블을 만들었구요.
: table2 만 빈채로 놔두고, table1,table3 에는 한 개의 레코드를 만들어 넣었습니다.
:
: TADOTable *ADOTable1;  // 전역변수선언
:
: void __fastcall TFTest::FormShow(TObject *Sender)
: {
:   ADOTable1 = new TADOTable(this);
:   DataSource1->DataSet=ADOTable1;
:
:   AnsiString cstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.mdb;Persist Security Info=False";
:   ADOTable1->ConnectionString=cstr;
:   ADOTable1->TableName="table1";
:   ADOTable1->Open();
: }
:
: void __fastcall TFTest::BitBtn1Click(TObject *Sender)
: {
:   AnsiString table[]={"table2","table3","table1"};
:   static int n=0;
:
:   ADOTable1->Close();
:   ADOTable1->TableName=table[n%3];
:   ADOTable1->Open();
:   n++
: }
:
: BitBtn1을 연속해서 눌러 보았습니다만... 전혀 에러메시지가 나타나지 않았습니다.
: 역시, DBGrid->DataSource1->ADOTable1 로 연결해서, 연결된 테이블이 바뀜에 따라 그리드 타이틀이 바뀌는 것까지 확인했습니다.
:
: 일단 ADOTable->Open() 및 ADOTable->Close() 자체에 문제가 있는 것은 아닌 듯 싶습니다.
:
: 혹시
:
:    myTable = new TTable(this);
:
: 첫번째 질문글에 있던 윗문장 그대로 소스코드를 작성하진 않았는지요?
:
:   myTable = new TADOTable(this);
:
: 이렇게 사용해야할 것을 말이죠...
:
: ..............?    
:
:
: =================================================================
:
: 나그네 님이 쓰신 글 :
: : 제가 설명이 좀 부족했던것 같습니다.
: : 저는 DB를 Access의 mdb를 사용하였습니다.
: : 그리고 이를 이용하기위해 ADO를 이용하였는데.
: : TADOConnection 과 TADOTable를 사용하였습니다.
: : 두개의 클래스에 대한 객체는 컴포넌트를 이용하지 않고
: : 메인 폼에서 두개의 클래스에 대해 객체를 생성을 하고.
: : 이를 버튼 이벤트시 사용을 했습니다,
: : 메인 폼이 닫힐떄 두개의 객체를 소멸 시켰습니다.
: :
: : 사실 Table->Connection 은 TADOTable->Connection입니다.
: : 나머지 ADOTable->TableName 부분이나 ADOTable->Open() 및 ADOTable->Close()는 저번에
: : 제가 질문을 드렸던 부분과 동일합니다..
: :
: : 저의 설명이 부족하여... 죄송합니다..
: : 다시한번 제가 도움을 받을 수 있다면,,, 감사합니다
: :
: :
: :
: : 강요찬 님이 쓰신 글 :
: : : 나그네님의 글을 읽고 말 그대로라면 참 재밌는 현상일 것 같아 시험을 해 보았습니다.
: : : 그런데.. 제가 실험한 결과로는 Table1->Close(); 라인에 그 어떤 오류도 나타나지 않더군요.
: : : 물론 모든 데이터파일은 모두 비어 있는 파일을 사용했습니다.("a.dbf","b.dbf","c.dbf")
: : :
: : : DBGrid->DataSource1->Table1 로 연결해서, 연결된 테이블이 바뀜에 따라 그리드 타이틀이 바뀌는 것까지 확인했습니다.
: : :
: : : 오류가 있다면, 어떤 다른 곳에 오류가 있는 듯 싶습니다.
: : :
: : : 아래 코드와 같이 <BitBtn1> 버튼을 계속 눌러 보았습니다.
: : :
: : : void __fastcall TFSQLTest::BitBtn1Click(TObject *Sender)
: : : {
: : :   AnsiString table[]={"a.dbf","b.dbf","c.dbf"};
: : :   static int n=0;
: : :
: : :   Table1->Close();
: : :   Table1->TableName=table[n%3];
: : :   Table1->Open();
: : :   n++;
: : : }
: : :
: : :
: : : 그런데..
: : : 나그네님의 글 중
: : :
: : :         myTable->Connection = myConnection1;
: : :
: : : 이 라인은 무엇을 뜻하는지 모르겠습니다.
: : : TTable 옵젝트 클래스에 Connection 이라는 Property 는 못 보았는데요...?
: : :
: : :
: : : =======================================================================
: : :
: : : 나그네 님이 쓰신 글 :
: : : : 저는 TTable을 쓸때면 이렇게 씁니다.
: : : : 전역에 TTable객체를 선언하구,
: : : : 폼의 Create()에서 그 객체를 생성합니다.
: : : : void __fastcall TForm1::FormCreate(TObject *Sender)
: : : : {
: : : :   myTable = new TTable(this);
: : : :   myTable->Connection = myConnection1;
: : : : }
: : : :
: : : : 그리고 이 테이블 객체를 사용할때는 이렇게 사용을 합니다.
: : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : {
: : : :   myTable->Close();
: : : :   myTable->TableName = tblMyTable;
: : : :   myTable->Open();
: : : :   ..............
: : : :   ..............
: : : : }
: : : :
: : : :
: : : : 이렇게 해서 사용을 하면 대부분 문제없이 잘 돌아 갑니다.
: : : : 그런데... 위에서 버튼을 여러번 누를경우 테이블을 먼저 닫아주는 부분에서
: : : : 에러가 가끔 나긴하거든요.
: : : :
: : : : 에러가 나는 이유를대충 보니깐.. Close()하려는 테이블에 내용이 전혀 없을경우 에러가 나더라구요.
: : : :
: : : : 예를 들어보면
: : : :
: : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : {
: : : :   switch(nCase){
: : : :      case 1:
: : : :          myTable->Close();
: : : :          myTable->TableName = tblMyTable1;
: : : :          myTable->Open();
: : : :          return;
: : : :     case 2:
: : : :          myTable->Close();
: : : :          myTable->TableName = tblMyTable2;
: : : :          myTable->Open();
: : : :          return;
: : : :    
: : : :     case 3:
: : : :          myTable->Close();
: : : :          myTable->TableName = tblMyTable3;
: : : :          myTable->Open();
: : : :          return;
: : : :   
: : : :     default:
: : : :          return;
: : : :   } 
: : : : }
: : : :
: : : : 이런 경우에 case가 1에서 2로 바뀔때 tblMyTable1의 내용이 있다면
: : : : myTable->Close()도 잘 하고 myTable->Open()도 잘하는데..
: : : : case 2: 에서 만약 tblMyTable2의 레토드 갯수가 하나도 없을 경우....
: : : : 다시 case 3으로 넘어 간다면..
: : : : tblMyTable->Close()에서 에러가 나옵니다..
: : : :
: : : :
: : : : 사실,, 모든 테이블은 그 내용이 들어있는건 기본 가정입니다.
: : : : 하지만..이런 에러를 잡지 않은채 코딩을 한다는게 좀 걸려서요..
: : : :
: : : :
: : : : 제가 지금 겪는 이런 에러에 대해 잘 대처할 수 있는 방법을 없을까요??
: : : :
: : : : 도움을 바랍니다.....
: : : :

+ -

관련 글 리스트
12863 TTable 질문인데요. 나그네 802 2001/11/20
12930     Re:TTable 질문인데요. 강요찬 881 2001/11/21
12948         강요찬님의 성의있는 답변에 감사드리면서..... 나그네 910 2001/11/22
12967             Re:강요찬님의 성의있는 답변에 감사드리면서..... 강요찬 1048 2001/11/22
12974                 그렇군요... ㅡㅡ; 나그네 1004 2001/11/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.