|
안녕하세요 아이디가 이쁜님아~ 에보니입니다.
음 나만 알고 잇으려고 했는데... 유명해 질려면 어쩔수 없지~ 캬캬캬 =ㅅ=;;
전부 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번과 같은 방법으로 필드를 얻자.... 이 기회에 서버 프로그램을 배워 보는것도 좋을 겁니다.
클라이언트는 클라이언트에 맞게 작고 엘레간테하게 서버가 할수 있는 일은 과감하게 서버에 맞기는
것이 편하고 좋은 방법입니다.
자 패패루님 함 달겨드세요... 패패루님은 메인입니다. =ㅅ=;;
|