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
[13659] 살짝 입맛만 보여준다면....
에보니.^ㅅ^ [mortalpain] 1149 읽음    2001-12-14 11:47
안녕하세요 아이디가 이쁜님아~ 에보니입니다.

음 나만 알고 잇으려고 했는데... 유명해 질려면 어쩔수 없지~ 캬캬캬 =ㅅ=;;

전부 ADO 아키텍쳐로 해결할 수 있는 문제들이에요.

그러나 여기는 넘 좁아서 살짝 맛만 보여 드릴께여~

제 강의를 기다리시든지 맛보기로 드린 힌트로 맨땅에 헤딩하세요~ 패패루님은 메인입니다. =ㅅ=;;

패패루 님이 쓰신 글 :
: 몇가지 질문을 같이 드리죠.
: 1. 하나의 커넥션으로 연결된 DB내의 모든 테이블 목록을 어떻게 가져오는가?

===> TADOConnection 의 OpenSchema 메소드를 사용하면 해결됩니다.

     나중에 제 강의에서 소개가 되는 부분중 가장 중요한 부분의 하나인데요.

     테이블 목록 뿐만 아니라 저장 프로시저들 뷰들 각종 키들 등등 디비 스키마에 대한 모든 것들을

     가져올수 있슴돠. 단 RDBMS 에만 해당되는 얘기인데.

     이넘과 TADOCommand, TStringList 를 결합하면 어플에서 sql 을 날리는 일은 아마 사라질겁니다.

     원래 sql 문은 어플에서 날리는게 아니랍니다. 케케

     그런데 프로시저나 테이블들만을 가져오는 특수한 메서드가 있습니다.

     TADOConnection 의 GetTableNames 메소드를 사용하면 해결됩니다

     프로시저는 GetProcedureNames 메소드를 사용하세요.

: 2. 그리고 각 테이블의 필드목록은 어떻게 가져오는가?
:    테이블의 필드 목록은
:    SELECT * FROM tablename WHERE false
:    실행해서 필드를 죽 스캔하면 될 것 같은데요.. 좀 더 쌈박한 방법은 없는지..

===> 1 에서 얻은 스트링리스트의 배열을 이용해서 얻은 테이블 목록으로 뤂을 돌릴 기반을 마련한 후

     필드를 얻기위한 임시 TADODataSet 의 인스턴스를 생성 CommandType 을 cmdTable 로 설정해놓고

     CommandText 값에 테이블 이름(스트링리스트의 값들)을 루프에 맞게 차례차례 쑤셔 넣은 후에

     하나씩 데이터셋 열어서 TADODataSet 의 TFields 속성으로 필드를 뽑아서 얻은 후에 데이터셋 닫

     고 루프 돌리고 이런식으로 돌리면 쌈빡해결. 이때 TADODataSet 의 자체 커넥션 말고

     TADOConnection을 이용할것. (ADO 의 연결풀링을 이용한 기법임 속도도 빠름다)

     이보다 더 쌈박한 해결책은 디비를 완벽 설계후 다큐멘테이션 명세서를 참조해서 typedef enum 자료

     형식으로 모듈에 추가 사용 <--- 추천 추가적인 디비 커넥이 발생하지 않기때문에 빠름니다.

     그러나 디비구조가 자주 바뀌는 욜라 짜증나는 플젝에선 비추천. 음 삽질 환영하는 분은 해도됨.

     으로

: 3. 특정 쿼리문(SELECT)을 실행했을 때 어떤 필드들을 얻게 되는지 아는 방법은?
:    예를 들어 SELECT table1.*, table2.* FROM table1, table2 WHERE table1.sn=table2.psn
:    이라는 쿼리문을 실행하면 결과로 어떤 필드들을 얻게 되는지.. 이 경우 table1의 모든
:    필드와 table2의 모든 필드가 되겠죠. 물론 WHERE에 and false같은거 하나 넣어두면
:    레코드는 0개가 추출될거고, 데이터셋의 모든 필드를 스캔하는 방법이 있긴하지만
:    쿼리문 자체를 사용자가 입력하게끔 하는 경우라면 사용하기가 여의치 않은 것 같습니다.
:    좀 위험하겠죠..
:    또한, TOP어쩌구를 써서 무조건 1개 레코드만 뽑아오게 할 수 있겠지만 이 역시 SQL서버의
:    종류에 따라 첫 1개 레코드를 뽑아오는 명령을 지원하기도 하고 안하기도 하고..
:    지원한다고 해도 서로 문법이 다르고..
:    뭔가 방법이 없을까요? 이거 하나 하려고 SQL문 파서를 만드는것도 바보짓이고..
:
: 3번 질문에 대해 약간 보충을 한다면,
: 이런 경우를 생각해보죠.
: 사용자가 SELECT * FROM table이라는 쿼리를 입력했습니다.
: 프로그램에서는 이 쿼리 결과로 얻어지는 필드명을 사용해야 합니다.
: 그런데, 그 테이블의 레코드가 100만개입니다.
: 게다가 원격으로 꽤 먼곳에 있는 DB입니다.
: 이 쿼리가 제대로 된 것인지 확인하고, 또 결과로 어떤 필드들이 날아오는지 채크하기 위해
: 마냥 실행한다면.. 아마 몇시간 기다려야겠죠.
: 그쪽 DB서버도 부하가 많이 걸릴건 당연하구요
: TADOQuery의 MaxRecord였나요? 하여간 비스무리한 프라퍼티 값을 1로 제한해도 소용 없는 것
: 같더라구요. 제가 해 봤을땐.
: 뭔가 속시원한 방법이 있다면 좀 알려주시면 고맙겠습니다.

===> 특정 조인문이나 인자가 필요한 복잡한 쿼리문의 경우 미리 뷰나 스토어드 프로시저로 만들어 놓고

     2번과 같은 방법으로 필드를 얻자.... 이 기회에 서버 프로그램을 배워 보는것도 좋을 겁니다.

     클라이언트는 클라이언트에 맞게 작고 엘레간테하게 서버가 할수 있는 일은 과감하게 서버에 맞기는

     것이 편하고 좋은 방법입니다.

자 패패루님 함 달겨드세요... 패패루님은 메인입니다. =ㅅ=;;

+ -

관련 글 리스트
13653 ADO에서 모든 테이블 목록을 가져오려면? 패패루 1088 2001/12/14
13659     살짝 입맛만 보여준다면.... 에보니.^ㅅ^ 1149 2001/12/14
13677         그런데, 약간의 문제가 있어보입니다. 패패루 775 2001/12/14
13668         Re: ^^ 고맙습니다. 패패루 739 2001/12/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.