Q&A

  • BDE 와 SQL Server연결
안녕하세요! 급하게 질문 드립니다.
BDE를 이용하여 SQL Server에 연결 되어지는 프로그램을 만들었습니다.
SQL Server는 따로 있고 제컴에 SQL클라이언트 를 깔아서 SQLServer클라이언트네트위크유틸리티에서
네트위크 라이브러리 및 서버별칭을 에 세팅후 연결해 왔습니다.
그런데 SQL Server라이센스 때문에 SQLServer클라이언트를 못깔것 같아요...

그래서 질문 드립니다.
SQLServer클라이언트를 설치 하지 않고 바로 BDE에서 SQL Server로 연결 하려면 어떻게 하면되나요?
SQLServer클라이언트네트위크유틸리티 설정 없이 실행 했을때 Cannot load an IDAPI service library.라는 에러가 나네요.!
2  COMMENTS
  • Profile
    이영주 2006.06.09 15:53
    클라이언트에 BDE 깔아주고 레지스트리만 조금 건드려서 사용했던 기억이...
    아래는 그때 만들었던 셋업프로그램의 일부입니다.
    <!--CodeS-->
    unit UMain;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls;

    type
      TCopyForm = class(TForm)
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        Memo1: TMemo;
        RadioGroup1: TRadioGroup;
        RadioGroup2: TRadioGroup;
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure RadioGroup1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      CopyForm: TCopyForm;
      OSPath:string;

    implementation
    uses IdGlobal,Registry;
    {$R *.dfm}

    procedure TCopyForm.BitBtn1Click(Sender: TObject);
    var
      ProgramPath:string;

    function CheckDestPath():string;
    const
      destPath:array [0..3]of string=('C:\Program Files\','Common Files\','Borland Shared\','BDE\');
    var
      cnt:byte;
    begin
      memo1.lines.Add('패스를 체크합니다...');
      result:='';
      for cnt:=0 to 3 do begin
        result:=result+destPath[cnt];
        if not DirectoryExists(result) then
          if not CreateDir(result) then
            raise Exception.Create('Cannot create '+result);
      end;
      memo1.lines.Add('  Check good...');
    end;

    procedure CheckReg(dest_path:string);
    var
      Reg: TRegistry;
    begin
      memo1.lines.Add('레지스트리를 체크합니다...');
      Reg:=TRegistry.Create;
      with reg do begin
        try
          RootKey:=HKEY_LOCAL_MACHINE;
          if OpenKey('\Software\Borland\Database Engine', True) then begin
            WriteString('CONFIGFILE01',Dest_Path+'IDAPI32.CFG');
            WriteString('DLLPath',Dest_Path);
            WriteString('RESOURCE','0009');
            WriteString('UseCount','1');
            CloseKey;
          end;
          if OpenKey('\Software\ODBC\ODBC.INI\Alias', True) then begin // SQL Server 의 Alias Name
            WriteString('Description','Alias'); // SQL Server 의 Alias Name
            WriteString('Driver',OSPath+'SQLSRV32.dll');
            WriteString('Language','한국어');
            WriteString('LastUser','UserName');//SQL Server 에 등록된 유저네임
            WriteString('Regional','Yes');
            WriteString('Server','111.111.111.111'); //SQL Server 의 IP Address
            CloseKey;
          end;
          if OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True) then begin
            WriteString('Alias','SQL Server'); // SQL Server 의 Alias Name
            CloseKey;
          end;
          if OpenKey('\Software\ODBC\ODBC.INI\ODBC File DSN', True) then begin
            WriteString('DefaultDSNDir','C:\Program Files\Common Files\ODBC\Data Sources');
            CloseKey;
          end;
        finally
          free;
          inherited;
        end;
      end;
      memo1.lines.Add('  Check good...');
    end;

    procedure CopyFile(srcFilePath,destPath:string);
    var
      Result:integer;
      SearchRec:TSearchRec;
      NewFile: TFileStream;
      OldFile: TFileStream;
      NewFileName: string;
    begin
      Result:=FindFirst(srcFilePath+'*.*',faAnyFile-faDirectory,SearchRec);
      memo1.lines.Add('파일복사를 시작합니다...');
      while Result=0 do begin
        OldFile:=TFileStream.Create(srcFilePath+SearchRec.name, fmOpenRead or fmShareDenyWrite);
        NewFileName:=DestPath+SearchRec.name;
        try
          NewFile := TFileStream.Create(NewFileName, fmCreate or fmShareDenyRead);
          try
            NewFile.CopyFrom(OldFile, OldFile.Size);
            memo1.lines.Add(NewFileName+format(',  %d Bytes Copied',[searchrec.Size]));
            Application.ProcessMessages;
          finally
            FreeAndNil(NewFile);
          end;
        finally
          FreeAndNil(OldFile);
        end;
        Result:=FindNext(SearchRec);
      end;
      FindClose(SearchRec);
      memo1.lines.Add('파일 복사가 끝났습니다.');
    end;

    begin
      bitBtn1.Enabled:=false;
      bitBtn2.Enabled:=false;
      CheckReg(CheckDestPath());
      copyFile(ExtractFilePath(Application.ExeName)+'BDE\',CheckDestPath());
      copyFile(ExtractFilePath(Application.ExeName)+'DLL\',OSPath);
      ProgramPath:='c:\한원\'+RadioGroup2.Items.Strings[RadioGroup2.Itemindex];
      if not DirectoryExists('c:\한원') then
        if not CreateDir('c:\한원') then
          raise Exception.Create('Cannot create '+'c:\한원');
      if not DirectoryExists(ProgramPath) then
        if not CreateDir(ProgramPath) then
          raise Exception.Create('Cannot create '+ProgramPath);
      copyFile(ExtractFilePath(Application.ExeName)+RadioGroup2.Items.Strings[RadioGroup2.Itemindex]+'\',ProgramPath+'\');
      memo1.lines.Add('모든 셋업이 끝났습니다. *.~');
      memo1.lines.Add('프로그램종료후 반드시');
      memo1.lines.Add('ODBC 관리도구에서 클라이언트구성>네트워크라이브러리를');
      memo1.lines.Add('TCP/IP 로 변경해 주십시오.');

      bitBtn1.Enabled:=true;
      bitBtn2.Enabled:=true;
    end;

    procedure TCopyForm.BitBtn2Click(Sender: TObject);
    begin
      close;
    end;

    procedure TCopyForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;

    procedure TCopyForm.FormDestroy(Sender: TObject);
    begin
      CopyForm:=nil;
    end;

    procedure TCopyForm.FormCreate(Sender: TObject);
    begin
      //클라이언트의 OS 체크
      if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin
        OSPath:='C:\windows\System\';
        RadioGroup1.ItemIndex:=0;
      end
      else begin
        RadioGroup1.ItemIndex:=1;
        OSPath:='C:\winNT\System32\';
      end;
      memo1.Lines.Clear;
      memo1.Lines.Add('시작 버튼을 눌러주십시오.');
    end;

    procedure TCopyForm.RadioGroup1Click(Sender: TObject);
    begin
      case RadioGroup1.ItemIndex of
        0,2 : OSPath:='C:\windows\System\';
        1 : OSPath:='C:\winNT\System32\';
      end
    end;

    end.
    <!--CodeE-->
  • Profile
    이봉구 2006.06.09 17:49
    답변 감사 드립니다.
    하지만 저에게는 너무 어렵군요...
    쉽게 처리 할수 있는 방법이 없나요?
    부탁 드립니다.