我想动态的指定ADOConnction的ConnctionString,于是我把一些连接信息保存在注册表中,在ADOConnction的BeforeConnct事件中ConnctionString赋值
procedure TbrSoapDataModule.adocMainBeforeConnect(Sender: TObject);
var
  Reg: TRegistry;
  Server,UserName,Pwd,Database,s:string;
begin
Reg := TRegistry.Create;
  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\BrainSoft\brWebService', True) then
   begin
     Server:=Reg.ReadString('Server');
     UserName:=Reg.ReadString('UserName');
     Pwd:=Reg.ReadString('Pwd');
     Database:=Reg.ReadString('Database');
     Reg.CloseKey;
     s:='Provider=SQLOLEDB.1;Password='+Pwd+';Persist Security Info=True;User ID='+UserName+';Initial Catalog='+Database+';Data Source='+Server;
adocMain.ConnectionString:=s;
    end;
  finally
    Reg.Free;
  end;
end;
这一段代码,在普通的应用程序中,一点问题也没有,运行很正常。但我在做ISAPI/NSAPI Dynamic link Library 类型的Web Service时使用了上边的代码,发现adocMain.ConnectionString并没有被正确赋值。为了验证从注册表读出的变量是否有问题,我把这些变量赋成固定值:
procedure TbrSoapDataModule.adocMainBeforeConnect(Sender: TObject);
var
  Reg: TRegistry;
  Server,UserName,Pwd,Database,s:string;
begin
Reg := TRegistry.Create;
  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\Software\BrainSoft\brWebService', True) then
   begin
     Server:='127.0.0.1';//Reg.ReadString('Server');
     UserName:='sa';//Reg.ReadString('UserName');
     Pwd:='sa';//Reg.ReadString('Pwd');
     Database:='wygl';//Reg.ReadString('Database');
     Reg.CloseKey;
     s:='Provider=SQLOLEDB.1;Password='+Pwd+';Persist Security Info=True;User ID='+UserName+';Initial Catalog='+Database+';Data Source='+Server;
adocMain.ConnectionString:=s;
    end;
  finally
    Reg.Free;
  end;
end;
结果发现这样,仍然不行,于是,去掉访问注册表的内容
procedure TbrSoapDataModule.adocMainBeforeConnect(Sender: TObject);
var
//  Reg: TRegistry;
  Server,UserName,Pwd,Database,s:string;
begin
//Reg := TRegistry.Create;
//  try
 //   Reg.RootKey:=HKEY_LOCAL_MACHINE;
//    if Reg.OpenKey('\Software\BrainSoft\brWebService', True) then
//   begin
     Server:='127.0.0.1';//Reg.ReadString('Server');
     UserName:='sa';//Reg.ReadString('UserName');
     Pwd:='sa';//Reg.ReadString('Pwd');
     Database:='wygl';//Reg.ReadString('Database');
 //    Reg.CloseKey;
     s:='Provider=SQLOLEDB.1;Password='+Pwd+';Persist Security Info=True;User ID='+UserName+';Initial Catalog='+Database+';Data Source='+Server;
adocMain.ConnectionString:=s;
//    end;
 // finally
//    Reg.Free;
//  end;
end;
或者直接
adocMain.ConnectionString:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Northwind;Data Source=127.0.0.1';
这样可以了,请各位帮忙分析一下原因,问题出在哪里?

解决方案 »

  1.   

    是不是你访问注册表的时候出错?程序直接读finally后的代码了?
    你单步执行了吗?
      

  2.   

    我觉得是你打开注册表的时候发生异常,导致直接跳到finally部分,所以字符串赋值的代码并没有执行。
    你可以这样验证一下:
    try
      //...
    except
      ShowMessage('打开注册表时发生错误!');
    end;还有,我觉得你关闭注册表的代码应该放在finally部分。或者用两个try/finally嵌套块,分别用来关闭注册表和释放TRegistry对象
      

  3.   

    肯定是在对注册表操作时发生了异常,导致直接跳到finally执行代码。在dll中,建议你直接用API对注册表操作。—————————————————————————————————
    MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
                 毁誉由人,望天上云卷云舒,聚散任风。';
    I.Maxim := MaximStr;
    I.Explain := '可用分不够可以给我发短消息';
    I.Desire := '加不加分随你';
    —————————————————————————————————
      

  4.   

    我的一个程序也是如此!只要在服务程序中不管是用TRegistry 或 API .???
      

  5.   

    TInifile也不能用,有没有人知道为什么