DBF파일을 ADO 또는 BDE로 선택적으로 연결하는 간결한 소스로 정리할 수 있을까요?
조건
<!--CodeS-->
1. DBF파일을 사용하여야 합니다.
2. BDE설치를 싫어하기에 기본적으로 ADO를 사용하였으나 속도나 너무 나쁩니다.
3. 그래서 선택적으로 사용자에게 속도를 내기 위해 BDE설치를 원유합니다.
4. DBE설치한 사람은 TDataSource와 TDatabase, TQuery를 사용하도록하고,
설치 안한 사람은 TADOConnection와 TADOQuery를 타도록하였습니다
5. 그런데, 소스를 간결하게 만들고 싶습니다. 일단은 아래 처럼 했지만,
with문이나 다른 방법으로 소스를 간결하게 만들고 싶습니다
* 윈도우 비스타일경우는 DB연결(BDE접속)을 위해 프로그램 실행시 관리자권한으로 실행
* 속도 차이는 첨부한 데모는 간단하나 실제 구현한건 너무 차이가 납니다 http://cafe.naver.com/gisapplication/118
<!--CodeE-->
소스(첨부파일중에서...)
<!--CodeS-->
//------------------------------------------------------------------------------//
//bde설치여부
function BDEInstalled: Boolean;
begin
Result := (dbiInit(nil) = 0)
end;
//------------------------------------------------------------------------------//
procedure TForm5.FormShow(Sender: TObject);
const
CSConnStr = 'Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files;Initial Catalog=%s;MaxBufferSize=4096';
begin
//DB폴더
DataBaseDirectory := ExtractFilePath(Forms.Application.Name) + 'DB';
if DirectoryExists(DataBaseDirectory) then begin
//DB연결
if BDEInstalled then begin
//bde사용
Database1.Params.Append('PATH=' + DataBaseDirectory);
Database1.Params.Append('DEFAULT DRIVER=PARADOX');
Database1.Params.Append('ENABLE BCD=FALSE');
end
else begin
//ADO사용
ADOConnection1.ConnectionString := format (CSConnStr, [DataBaseDirectory]);
ADOConnection1.Open;;
end;
end;
end;
procedure TForm5.Btn_SearchClick(Sender: TObject);
var
SelectStr, WhereStr, Field_Name, sDataValues : string;
BdeUse: boolean;
QueryEof: boolean;
begin
if FileExists(DataBaseDirectory + '\ZIPCODE.dbf') then begin
//공통사용 셋팅
Memo1.Clear;
BdeUse := BDEInstalled;//bde설치여부
SelectStr := 'Select * from ZIPCODE ';
WhereStr := ' where ( ( SEQ >= 100 ) and ( SEQ <= 1000 ) )';
Field_Name := 'ZIPCODE';
//Query
if BdeUse then begin
if Query_BDE.Active then Query_BDE.Close;
Query_BDE.SQL.Clear;
Query_BDE.SQL.Add(SelectStr + WhereStr);
Query_BDE.Open;
QueryEof := Query_BDE.Eof;
end
else begin
if ADOQuery1.Active then ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SelectStr + WhereStr);
ADOQuery1.Open;
QueryEof := ADOQuery1.Eof;
end;
//데이터 읽기
while Not QueryEof do begin //Query1.Eof 대신 boolean 변수사용
if BdeUse then begin
sDataValues := Query_BDE.FieldByName(Field_Name).AsString;
Query_BDE.Next;
QueryEof := Query_BDE.Eof;
end
else begin
sDataValues := ADOQuery1.FieldByName(Field_Name).AsString;
ADOQuery1.Next;
QueryEof := ADOQuery1.Eof;
end;
Memo1.Lines.Add(sDataValues);
end;
//닫기
if BdeUse then Query_BDE.Close
else ADOQuery1.Close;
end;
<!--CodeE-->
초기에 작성해야할 소스는 많아지지만 훨씬 간결하게 만들 수 있습니다.