请各位大哥帮帮小弟 看看 程序代码有什么问题
小弟主要是实现 对数据库(SQL)的恢复和连接(分单机和网络两种)
但现在有点问题是 在实现网络数据库的连接时候出现问题 单机的可以实现
编程步骤如下
1先启动winsock的动态链接库:利用API函数wsastartup(wversionrequested,wsadata)
2然后利用p:=gethostbyname(pchar('服务器主机名称')):测试该主机是否名对应的服务器是否存在和运行。如果返回值<>Nil 则说明服务器运行
3最后利用API汉说inet_ntoa(pinaddr(p^.h_addr_list^)^)返回主机名对应的IP地址
4通过数据库服务器的Ip地址连接数据库
5将数据库配置信息存放到*.ini配置文件中
整体代码如下
其中TFinifile主要是对INI文件的操作
TZQEdit只是对Edit增加了自动设置输入法
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
以下就是出现问题的代码
/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////procedure TFrm_Restore.BB_ConnectClick(Sender: TObject);
var
  wVersionRequested : WORD;
  wsaData : TWSAData;
  p: PHostEnt;
  p2 : pchar;
  servername:string;
begin
   if Trim(Edt_ServerName.Text) = '' then
   begin
        if RG_select.ItemIndex=0 then ShowMessage('服务器名不能为空!')
        else ShowMessage('计算机名不能为空!');
        Edt_ServerName.SetFocus;
        Exit;
   end;   Screen.Cursor := crHourGlass;
   if RG_select.ItemIndex=0 then   //网络
   begin
      {连接 WinSock}
      wVersionRequested := MAKEWORD(1, 1);
      WSAStartup(wVersionRequested, wsaData);
      {获得计算机名}
      p := GetHostByName(PChar(Trim(Edt_ServerName.Text)));
      if p = nil then
      begin
        Screen.Cursor := crDefault;
        ShowMessage('服务器连接失败!可能是所输入的服务器名有误,请重新输入。');
        {断开 WinSock}
        WSACleanup;
        Exit;
      end;      {获得本机的ip地址}
      p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
      try       servername:=p2;
       adoconnection1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Glasses_L;Data Source='+servername;
       adoconnection1.Connected:=true;
       // adoq_pro.Active:=true;
       except
       showmessage('服务器连接失败!请检查数据库连接!');
       exit;
       end;
      INI.Directory:=ExtractFilePath(Application.ExeName);
      InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
      InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
      InI.Writestrings('数据库连接', 'User ID', 'sa');
      InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
      InI.Writestrings('数据库连接', 'Data Source', p2);
      InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
      InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
      InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
      InI.Writestrings('数据库连接', 'Auto Translate', 'True');
      InI.Writestrings('数据库连接', 'Packet Size', '4096');
      InI.Writestrings('数据库连接', 'Workstation ID', idstack.Gstack.localaddress);
      {断开 WinSock}
      WSACleanup;
   end else
   begin             //单机系统
      INI.Directory:=ExtractFilePath(Application.ExeName);
      InI.Writestrings('数据库连接', 'Provider', 'SQLOLEDB.1');
      InI.Writestrings('数据库连接', 'Persist Security Info', 'False');
      InI.Writestrings('数据库连接', 'User ID', 'sa');
      InI.Writestrings('数据库连接', 'Initial Catalog', 'crm');
      InI.Writestrings('数据库连接', 'Data Source', '');
      InI.Writestrings('数据库连接', 'Locale Identifier', '2052');
      InI.Writestrings('数据库连接', 'Connect TimeOut', '15');
      InI.Writestrings('数据库连接', 'Use Procedure for Prepare', '1');
      InI.Writestrings('数据库连接', 'Auto Translate', 'True');
      InI.Writestrings('数据库连接', 'Packet Size', '4096');
      InI.Writestrings('数据库连接', 'Workstation ID', trim(Edt_ServerName.Text));
   end;
   Screen.Cursor := crDefault;
   
   ShowMessage('数据库连接成功!');
  // close;
end;
//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////