FirstLine
سه شنبه 14 بهمن 1382, 18:22 عصر
با سلام
   من یه برنامه دارم که از روی شبکه  یک بانک  اطلاعاتی SQL2000  را میخواند. حالا بعضی وقتها یادم میره کامپیوتری را که SQL روی آن است را روشن کنم و در نتیجه ... 
   چجوری توی برنامه تشخیص بدهم که SQL Server  در دسترس هست یا نه؟
با تشکر
Delphi-Clinic
سه شنبه 14 بهمن 1382, 21:55 عصر
با استفاده از کد زیر می تونی لیست SQL Server های موجود در شبکه رو بدست بیاری.
بعد اول برنامه چک کن که سرور مورد نظربرنامه تو لیست هست یا نه اگر بود که برنامه اجرا شه و اگه نبود ..........
بعدش رو دیگه خودت می دونی. :wink: 
// Put this constant in the start of your unit!
Const
  Socket_WM_Hook = WM_User + 100;
// These procedures must be put inside your TForm class
Procedure TCPSocket_WM_Hook(Var Msg: TMessage); Message Socket_WM_Hook;
Procedure GetIPAddresses(List: TStrings);
// This variable should be put inside your TForm class, but is not necessary!
ConnectionStatus : Integer;
Function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
  DWORD;
  lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
  lpdwOutBytesReturned: LPDWORD;
  lpOverLapped: POINTER;
  lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';
Procedure TForm1.TCPSocket_WM_Hook(Var Msg: TMessage);
Var
  InputSocket : TSocket;
  Selectevent : Word;
Begin
   InputSocket := Msg.wParam;
   IF InputSocket <> Invalid_Socket Then
   Begin
      Selectevent := WSAGetSelectEvent(Msg.lParam);
      Case Selectevent of
        FD_READ    : ;
        FD_CONNECT : ConnectionStatus := 1;
        FD_CLOSE   : ConnectionStatus := 2;
      End;
   End;
End;
Procedure TForm1.GetIPAddresses(List: TStrings);
Type
  sockaddr_gen = packed Record
                           AddressIn : sockaddr_in;
                           filler    : packed Array[0..7] of char;
                        End;
  INTERFACE_INFO = packed Record
                             iiFlags            : u_long; // Interface flags
                             iiAddress          : sockaddr_gen; // Interface address
                             iiBroadcastAddress : sockaddr_gen; // Broadcast address
                             iiNetmask          : sockaddr_gen; // Network mask
                          End;
Const
  SIO_GET_INTERFACE_LIST = $4004747F;
Var
  ErrorCode     : Integer;
  WSAData       : TWSAData;
  Sock          : TSocket;
  PtrA          : Pointer;
  Buffer        : Array[0..20] of INTERFACE_INFO;
  BytesReturned : U_Long;
  I             : Integer;
  NumInterfaces : Integer;
  pAddrInet     : SOCKADDR_IN;
  pAddrString   : pChar;
  S             : String;
Begin
   List.Clear;
   ErrorCode := WSAStartup($0101, WSAData);
   IF (ErrorCode = 0) Then
   Begin
      Sock := Socket(AF_INET, SOCK_STREAM, 0);         // Open a socket
      IF (Sock <> INVALID_SOCKET) Then
      Begin
         PtrA := @bytesReturned;
         IF (WSAIoCtl(Sock, SIO_GET_INTERFACE_LIST, NIL, 0, @Buffer, 1024, PtrA, NIL, NIL) <> SOCKET_ERROR) Then
         Begin
            NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
            For I := 0 to NumInterfaces - 1 do        // For every interface
            Begin
               S := '';
               pAddrInet := Buffer[I].iiAddress.addressIn;           // IP ADDRESS
               pAddrString := inet_ntoa(pAddrInet.sin_addr);
               IF (StrPas(pAddrString) <> '127.0.0.1') Then
               Begin
                  S := S + pAddrString + ',';
                  pAddrInet := Buffer[I].iiNetMask.addressIn;           // SUBNET MASK
                  pAddrString := inet_ntoa(pAddrInet.sin_addr);
                  S := S + pAddrString;
                  List.Add(S);
               End;
            End;
         End;
         CloseSocket(Sock);
      End;
      WSACleanup;
   End;
End;
Procedure TForm1.ListSQLSERVERs(SQLList: TStrings);
Function GetNumber(S: String; Nr: Byte) : Word;
Var
  T : Integer;
Begin
   While (Nr > 1) do
   Begin
      T := Pos('.', S);
      IF (T = 0) Then T := Length(S)+1;
      Delete(S, 1, T);
      Dec(Nr);
   End;
   T := Pos('.', S);
   IF (T = 0) Then T := Length(S)+1;
   Result := StrtointDef(Copy(S, 1, T-1), 0);
   Delete(S, 1, T);
End;
Function IPOk(CurrentIP, SrvIP, SrvMask: String) : Boolean;
Var
  T         : Integer;
  I, M, Num : Integer;
Begin
   Result := True;
   For T := 1 to 4 do
   Begin
      I   := GetNumber(SrvIP, T);
      M   := GetNumber(SrvMask, T);
      Num := GetNumber(CurrentIP, T);
      IF (Num < (I and M)) or (Num > ((I and M)+(255-M))) Then Result := False;
   End;
End;
Function IsSQLSERVER(IP: String; var SQLName: String) : Boolean;
Var
  Sock              : TSocket;
  SockAddr          : SockAddr_In;
  IP_Address_Array  : Array[0..32] of Char; // Don't need more than 15 though... ;)
  Error             : Integer;
  Timer             : TDateTime;
  HostEnt           : PHostEnt;
Begin
   Result := False;
   Sock := Socket(PF_INET, SOCK_STREAM, 0);         // Open a socket
   IF (Sock <> INVALID_SOCKET) Then
   Begin
      Strpcopy(IP_Address_Array, IP);
      // ms-SQL-s
      // 1433
      SockAddr.Sin_Addr.S_addr := Inet_Addr(IP_Address_Array);
      SockAddr.Sin_Port    := HtoNS(1433); // Service: 'ms-SQL-s' ???
      SockAddr.Sin_Zero[0] := Char(0);
      SockAddr.Sin_Family  := AF_INET;
   End;
   // Set the socket into asynchronous mode, so it will trigger the wMsg
   //   event in the hWnd window when the connection has been made
   WSAAsyncSelect(Sock, self.Handle, Socket_WM_Hook, FD_READ or FD_CONNECT or FD_CLOSE);
   Error := Connect(Sock, TSockaddr(SockAddr), Sizeof(SockAddr));
   IF (Error = SOCKET_ERROR) Then
   Begin
      IF (WSAGetLastError = WSAEWOULDBLOCK) Then Error := 0;
   End
    Else Error := 0;
   IF (Error = 0) Then
   Begin
      ConnectionStatus := 0;
      // Set your own timeout value. I've had success with as low as 0.01 (10ms) ...
      // 0.1 = 100ms   0.2 = 200ms ...
      Timer := Now;
      While (ConnectionStatus = 0) and (Timer+(0.01/86400) > Now) do Application.ProcessMessages;
      Result := (ConnectionStatus = 1);
      IF (Result) Then
      Begin
         HostEnt := GetHostByAddr(@SockAddr.sin_addr.S_addr, 4, PF_INET);
         IF (Assigned(HostEnt)) Then
         Begin
            SQLName := HostEnt.h_name;
         End
          Else SQLName := IP;
      End;
   End;
   CloseSocket(Sock);
End;
Var
  I, T    : Integer;
  BaseIP  : String;
  CurIP   : String;
  S       : String;
  IP      : String;
  Mask    : String;
  Error   : Integer;
  WSAData : TWSAData;
  SQLName : String;
  IPAddresses : TStringList;
Begin
   IPAddresses := TStringList.Create;
//   IPAddresses.Add('139.117.69.80,255.255.255.0');
   GetIPAddresses(IPAddresses);
   Error := WSAStartup($0101, WSAData);
   IF (Error = 0) Then
   Begin
      For I := 0 to IPAddresses.Count-1 do
      Begin
         S := IPAddresses.Strings[I];
         IP := Copy(S, 1, Pos(',', S)-1);
         Mask := Copy(S, Pos(',', S)+1, Length(S));
         // Create base IP address (first 3 numbers)...
         BaseIP := '';
         For T := 1 to 3 do BaseIP := BaseIP + IntToStr(GetNumber(IP, T))+'.';
         For T := 1 to 254 do // 0 & 255 is not valid IP addresses...
         Begin
            CurIP := BaseIP+IntToStr(T);
            IF (IPOk(CurIP, IP, Mask)) Then
            Begin
               IF (IsSQLSERVER(CurIP, SQLName)) Then
               Begin
                  SQLList.Add(SQLName);
               End;
            End;
            Application.ProcessMessages;
         End;
      End;
      WSACleanup;
   End;
   IPAddresses.Free;
End;
hr110
چهارشنبه 15 بهمن 1382, 09:59 صبح
با سلام
یک راه هم داره اینه ببینی که سرویس مربوطه در حال اجرا است یا خیر.
موفق باشید
Mohammad S
شنبه 23 خرداد 1383, 02:51 صبح
بعد اول برنامه چک کن که سرور مورد نظربرنامه تو لیست هست یا نه اگر بود که برنامه اجرا شه و اگه نبود .......... 
آیا راهی هست که با کد نویسی بتوان SQL Server را فعال کرد؟ (Start) :?:
Delphi-Clinic
شنبه 23 خرداد 1383, 11:53 صبح
الان دقیقا نمی تونم بهت بگم. اما فکر کنم با دسترسی Admin بشه سرویس رو از راه دور یعنی بصورت  remote فعال کرد.
با RemObjects یه بار همچین چیزی نوشته بودم.
Mohammad S
شنبه 23 خرداد 1383, 12:57 عصر
الان دقیقا نمی تونم بهت بگم
چه زمانی می توانید به من خبر دهید؟ اگر ممکن است همراه با کد کامل :oops: 
با تشکر  :flower:  8)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.