Q&A

  • DB 연결 실패시 반환되는 예외처리 값을 알고 싶습니다.
<!--Codes-->

// RDS를 이용한 DB 연결 입니다.
try
    RDSRS := CreateOleObject('ADODB.RecordSet');
    RDSRS := RDSDataFactory.query(RDSConnection.connect, strQuery);

// 예외 상황 발생시 에러 메세지를 Text파일에 저장하고 예외 문장을 출력한다.
  except
    on e:exception do
    begin
      append(F);
      writeln(F, formatdatetime('hh:mm:ss', now) + e.Message);
      showMessage('DB Connect Fail ' + #13#13 + e.Message);
      closeFIle(F);
    end;
  end;

<!--CodeE-->


안녕 하세요. 맨날 구경만 하다가 처음으로 용기내서 질문 올려 봅니다.

저는 델파이 시작한지 이제 3주 정도 됐는데요, 도통 감이 안 오네요.


본론으로 넘어가서.. 지금 만드는 프로그램은 RDS를 이용해서

DB에 접속이 되는지 검사를 하는 프로그램입니다. 만약 접속이 안된다면

무엇이 문제인지까지 나오게 하려고 합니다.


그래서 DB 접속 실패시 예외 처리를 이용하여 정확한 원인을 집어 내고 싶습니다.

그냥 저 프로그램 돌리면 메세지창으로 '[ODBC]['는 접속 되지 않습니다]'

정도만 나옵니다.


하지만 제가 원하는건, 뭐가 문제 생겼을때 ID나 Password가 틀렸을 경우 그에 해당하는

반환값을 숫자로 받아서 그에 해당하는 메세지를 직접 출력하게 만들고 싶습니다.

예를 들자면, 주소가 틀려서 '30'이라는 숫자를 반환 받았을 경우

if DB_Return = 30 then
messagebox('ID나 Password가 틀렸습니다')

이런식으로 하고 싶습니다. 말이 길어 졌네요..

부디 답까지는 아니더라도 해결책을 좀 주셨으면 감사 하겠습니다.

접속하고자 하는 DB는 MS-SQL 2005입니다~







아차...그리고 하나 더..ㅜ.ㅜ

이거 하나만 더 알려 주시면 감사 하겠습니다.

특정 싸이트가 접속이 되는지 확인 하는 방법이 있는지..

web browser 컴포넌트를 이용하라고 하는데..

아무리 봐도 모르겠어요.. 좀 도와 주세요..ㅜ.ㅜ


그럼 다들 좋은 일만 있기를 바래요.. *^^*
2  COMMENTS
  • Profile
    구창민 2007.08.17 01:11
    e.Message 에 원하시는 에러내용이 나오지 않나봐요?

    만일 그렇다면, 작업하시는 DB 종류의 레퍼런스를 참조하셔서 일일이 기술하셔야 할듯한데..;

    두번째 질문은.. 아래 함수를 참고해 보세요..

    오래전에 작성해둔 함수인데 특정사이트가 접속가능한지 알아내는 함수입니다.

    WINSOCK 구동여부 먼저 확인하시구 하세요..

    그럼~ 즐거운 프로그래밍 하시길~

    function IsConnect(sConnectIp: string; iPort: LongInt) : string;
      procedure DoCloseSocket(var SocketId: TSocket);
      begin
        if SocketId <> INVALID_SOCKET then
          if WSAISBlocking then
            WSACancelBlockingCall;

        CloseSocket(SocketId);
        SocketId := INVALID_SOCKET;
      end;
    var
      Address: DWord;
      Phe: PHostEnt;
      ConnectIn: TSockAddrIn;
      ConnectSkt: Tsocket;
      DelayTime: Longint;
    begin
      Result := '';
      Screen.Cursor := crHourGlass;
      try
        Address := inet_addr(PChar(sConnectIp));
        if (Address = INADDR_NONE) then
        begin
          Phe := GetHostByName(PChar(sConnectIp));
          if Phe <> Nil then
            Address  := Longint(plongint(Phe^.h_addr_list^)^);
        end
        else
        begin
           Phe := GetHostByAddr(@Address, 4, PF_INET);
           if Phe = Nil then
             Address := INADDR_NONE;
        end;

        if Address = INADDR_NONE then
        begin
          Result := '서버를 알 수 없습니다.  IP가 정확한지 확인하세요.';
          Exit;
        end;

        with ConnectIn do
        begin
          FillChar(ConnectIn, SizeOf(ConnectIn), #0);
          sin_family          := PF_INET;
          sin_addr.s_addr     := Address;
          sin_port            := htons(iPort);
        end;

        Application.ProcessMessages;;
        ConnectSkt := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        if ConnectSkt = INVALID_SOCKET then
        begin
          Result := '네트워크 오류: 소켓핸들을 얻을 수 없습니다.';
          Exit;
        end;

        DelayTime := 1000;
        if SetSockOpt(ConnectSkt, SOL_SOCKET, SO_RCVTIMEO, @DelayTime, SizeOf(DelayTime)) <> 0 then
        begin
          Result := '네트워크 오류: 소켓의 옵션을 바꿀 수 없습니다.';
          DoCloseSocket(ConnectSkt);
          Exit;
        end;

        if Connect(ConnectSkt, ConnectIn, sizeof(ConnectIn)) <> 0 then
        begin
          Result := sConnectIp + ' 에 접속할 수 없습니다.';
          DoCloseSocket(ConnectSkt);
          Exit;
        end;

      Result := sConnectIp + ' 에 접속할 수 있습니다.';

      finally
        DoCloseSocket(ConnectSkt);
        Screen.Cursor := crDefault;
      end;
    end;




  • Profile
    황경수 2007.08.29 23:07
    e.message에서 나오는 거는 알아보기가 힘들어서, 제가 직접 메세지를 나타나게 하려고 하는데요.

    e.message의 모든 에러를 제가 알아 낼수가 없잖아요. 제가 테스트로 몇번 에러 나온거를 가지고

    직접 메세지를 출력할 수는 있지만, 그 외의 다른 제가 생각지 못했던 에러가 나오면,

    델파이에서 e.message의 내용(알아보기 어렵더라구요.)이 바로 찍히니깐,

    원하는 뜻대로 되지 않더라구요.


    차라리 에러 코드를 출력하고, 나올 수 있는 모든 에러 정보를 가지고 있다면 수월할텐데..ㅎ


    아무튼 감사합니다~ 소스 잘 활용 할께요~ㅎ