我的程序使用ADO连接数据库,在设计的时候Adoconnection连接到本地的数据库,但是编译好之后,会读取注册表信息,然后根据注册表里面的数据,动态的创建ConnectionString然后去连接数据库。
但是,我如果是在adoconnection还连接着数据库的时候,将程序编译好,这样拿到客户那里的话,程序开始运行的时候adoconnection就会去试图连接我写程序的时候的那个数据库 ,然后报一个错,找不到数据库,然后再去读取注册表信息,构建ConnectionString连接客户的数据库。
可是我如果编译的时候把Adoconnection和数据库断开的话,编译好的程序拿到客户那里的时候,就会直接读取注册表信息,然后根据注册表信息构建ConnectionString,然后连接数据库,不会尝试去连接一个不存在的数据库。
我现在有什么办法可以不管编译的时候我的Adoconnection是什么状态,程序换个地方还是直接去读注册表信息,然后连接客户的数据库呢

解决方案 »

  1.   

    改变ConnectionString之前先断开连接。
      

  2.   

    你注册表只要存放用户名,服务器名,口令。最后连接起来送给acoconnection 的ConnectionString属性就行了。 
      

  3.   

    我正是这样做的
    注册表存放服务器名,数据库名,用户名,口令
    问题是假如我编译的时候没有将adoconnection的connected属性设置为false的话,那么程序运行的时候首先会调用我设计的时候的connectionstring去连接数据库,连接不成功然后才会去读注册表,这个是我不希望的。
      

  4.   

    我的意思你放在外部 .Dat/.Txt/.INI 中也一样,操作也方便
      

  5.   

    将这个文件放在固定目录下就可以,FormCreate时读出链接字符串,再赋给ADOConnection 
      

  6.   

    "编译的时候我的Adoconnection是什么状态" 如果你把ADOConnection的Connected设置为True,则程序在初始化窗体的时候就会连接数据库,你还是把默认值设置为False吧。
      

  7.   

    可能是我没有说清楚把,只有INeedCa(缺钙)理解了我的意思,将AdocConnection的Connected属性设置为False然活再编译就可以解决问题,但是,我在写程序的时候,只有一访问数据库,AdoConnection的Connected属性就会变为True,假如我编译的时候忘记改回去了,程序拿到客户那里就会出问题了。所以,可以怎么样避免呢
      

  8.   

    在Application.Run之前设置ADOConnection吧,不过最好是给客户前将程序改一改,编写程序不可以养成随便的习惯呀。
      

  9.   

    这个方法不行,程序是创建AdoConnection的时候就连接数据库了。
    但是我假如在我的数据模版的oncreate事件中写,也不可以。Adoconnection还是要连接数据库。
      

  10.   

    可能是我没有说清楚把,只有INeedCa(缺钙)理解了我的意思,将AdocConnection的Connected属性设置为False然活再编译就可以解决问题,但是,我在写程序的时候,只有一访问数据库,AdoConnection的Connected属性就会变为True,假如我编译的时候忘记改回去了,程序拿到客户那里就会出问题了。所以,可以怎么样避免呢
    --------
    尽量在代码里设置你的ADOConnection的连接(在你的逻辑中真正要连接数据库的时候),不要设计期就设定连接。
      

  11.   

    你在程序里面将adoconnect的connectstr设为空,(不要设置属性)
    联接用程序代码实现就可以了.
      

  12.   

    在ADOConnection的BeforeConnect事件中动态设定ConnectionString
      

  13.   

    function TMainDataModule.GetConnectionString(const strKey,ConString:String): String;
    var
      m_reg:TRegistry;
    begin
      //获得数据库连接串
      //ConString='' 从注册表中获得连接串,如果不存在则生成
      //ConString<>'' 编辑存在的连接串,然后更新注册表
      m_reg:=TRegistry.Create;
      m_reg.RootKey:=HKEY_LOCAL_MACHINE;
      m_reg.OpenKey(app.RegKey,true);
      if ConString='' then    //从注册表中读取
      begin
        Result:=m_reg.ReadString(strKey);
        if Result='' then
        begin
          Result:=PromptDataSource(Application.Handle,ConString);
          Result:=ConStringEncrypt(Result);
          if Result<>'' then
            m_reg.WriteString(strKey,Result);
        end;
      end
      else    //编辑存在的连接串
      begin
        Result:=PromptDataSource(Application.Handle,ConString);
        Result:=ConStringEncrypt(Result);
        m_reg.WriteString(strKey,Result);
      end;
      m_reg.Free;
      Result:=ConStringDecrypt(Result);
    end;ConStringDecrypt
    ConStringEncrypt
    是字符串加密解密函数,要想加密的话自己写,否则不用加密了。