由于没有怎么写数据库应用,有个简单问题要问专家:
   想连接服务器上的数据库,由于服务器的IP地址可能改变,或换别的服务器,为避免联接数据不成功,允许客户重新输入改变后的IP地址,同时用一个文本文件记录下用户重新填写的IP地址以备下次联接用,再联接数据库:代码如下(联接数据库的代码省略了,只贴出连接不成功后的代码):procedure TDataModule9.ADOConnection1ConnectComplete(
  Connection: TADOConnection; const Error: Error;
  var EventStatus: TEventStatus);
var
  ls_currdir:String;
  Str,ipaddr:TStringList;
  Reg:TRegistry;
begin
   if EventStatus=esErrorsOccured then //如果连接发生问题(一般是IP地址不正确或服务器没启动)
   begin
    // ShowMessage('错误:数据库连接失败。请启动数据库服务后再运行本系统!');
     ipaddr:=InputBox('手动输入IP地址','没有找到数据库服务器,请确定其IP地址:','192.168.1.1');
     ls_currdir:=GetCurrentDir;
     Str:=TStringList.Create;
     Str[0]:=ipaddr;
     showmessage(str[0]);
     Str.SaveToFile(ls_currdir+'\IpAddr.txt');
     FreeAndNil(Str);
     //以上代码不知何故没有执行
      Reg:=TRegistry.Create;
     Reg.RootKey:=LongWord($80000002);
     Reg.OpenKey('Software\ODBC\ODBC.INI\Czjdoc',true);
     Reg.WriteString('CommLinks','TCPIP{host='+ipaddr+'}');//重写连接参数
      Reg.CloseKey;
     Reg.Free;
     ADOConnection1.Open();
     if Not ADOConnection1.Connected then application.Terminate;
   end;
end;
  奇怪的是,在注册表中重写连接参数后数据库可正常连接,但 FreeAndNil(Str)这一句以上的代码却没有执行,导致不能记录用户填写的IP地址。
  是不是这些代码不应该写在ADOConnection1ConnectComplete中?
类似问题还有没有其他解决办法?

解决方案 »

  1.   

    应该可以执行到吧,    ShowMessage(ls_currdir+'\IpAddr.txt');  //看路径对不对?
        Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
        FreeAndNil(Str); 
      

  2.   

      if EventStatus=esErrorsOccured then //如果连接发生问题(一般是IP地址不正确或服务器没启动) 
      begin 
        ipaddr:=InputBox('手动输入IP地址','没有找到数据库服务器,请确定其IP地址:','192.168.1.1'); 
        ls_currdir:=GetCurrentDir; 
        Str:=TStringList.Create; 
        Str[0]:=ipaddr;     /////////////////這一句有問題。  //
        showmessage(str[0]); 
        Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
        FreeAndNil(Str); 
        //以上代码不知何故没有执行改為:Str[0]:=ipaddr;    == > Str.Append(ipAddr);
      

  3.   


    建立一個空的STR,你訪問索引號出錯了。
      

  4.   

    不好意思,笔误,应该是
    var 
      ls_currdir,ipaddr:String; 
      Str:TStringList; 
      Reg:TRegistry;代码编译没问题,注册表也改写了,就是 
        ls_currdir:=GetCurrentDir; 
        Str:=TStringList.Create; 
        Str[0]:=ipaddr; 
        ShowMessage(str[0]); //连这句都没执行
        Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
        FreeAndNil(Str); 
        这些代码不知何故没有执行,但改写注册表的代码却执行了。 
    由于EventStatus=esErrorsOccured 
    说明连接发生问题,客户端ODBC程序会触发一个数据库底层联接错误提示,感觉可能就是这个错误影响了这些代码的执行。
    怎样屏蔽数据库的低层错误信息?
      

  5.   

    不能使用str[0] := ipaddr;
    要使用str.add(ipaddr);
      

  6.   

        Str:=TStringList.Create; 
        Str[0]:=ipaddr; //这里有问题,Str刚刚创建,访问Str[0]肯定会出错,出错后跳出程序,所以没有执行后面的代码
      

  7.   

    最好用ini文件而不用文本txt的文件。
      

  8.   

    Str:=TStringList.Create; 
    try
      Str.add(ipaddr) 
      ShowMessage(str[0]); //连这句都没执行 
      Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
    finally
      FreeAndNil(Str); 
    end;
      

  9.   

    代码有问题,应该是都没有执行吧!而不会是执行前面的,至于后面的代码你认为执行了!我想是调试环境的错觉.strList := TstringList.create(nil);
    strList.items.add(str);类似的.
      

  10.   

    是好用iniStr:=TStringList.Create; 
    try 
      Str.add(ipaddr) 
      ShowMessage(str[0]); //连这句都没执行 
      Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
    finally 
      FreeAndNil(Str); 
    end; 
      

  11.   

    是好用iniStr:=TStringList.Create; 
    try 
      Str.add(ipaddr) 
      ShowMessage(str[0]); //连这句都没执行 
      Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
    finally 
      FreeAndNil(Str); 
    end; 
      

  12.   

    是好用iniStr:=TStringList.Create; 
    try 
      Str.add(ipaddr) 
      ShowMessage(str[0]); //连这句都没执行 
      Str.SaveToFile(ls_currdir+'\IpAddr.txt'); 
    finally 
      FreeAndNil(Str); 
    end; 
      

  13.   

    谢谢,str[0]:='adc'确实有问题,不好意思,虽然是星了,但基础还不如一条裤钗。
    结帐