我的程序使用ADO连接数据库,在设计的时候Adoconnection连接到本地的数据库,但是编译好之后,会读取注册表信息,然后根据注册表里面的数据,动态的创建ConnectionString然后去连接数据库。
但是,我如果是在adoconnection还连接着数据库的时候,将程序编译好,这样拿到客户那里的话,程序开始运行的时候adoconnection就会去试图连接我写程序的时候的那个数据库 ,然后报一个错,找不到数据库,然后再去读取注册表信息,构建ConnectionString连接客户的数据库。
可是我如果编译的时候把Adoconnection和数据库断开的话,编译好的程序拿到客户那里的时候,就会直接读取注册表信息,然后根据注册表信息构建ConnectionString,然后连接数据库,不会尝试去连接一个不存在的数据库。
我现在有什么办法可以不管编译的时候我的Adoconnection是什么状态,程序换个地方还是直接去读注册表信息,然后连接客户的数据库呢
但是,我如果是在adoconnection还连接着数据库的时候,将程序编译好,这样拿到客户那里的话,程序开始运行的时候adoconnection就会去试图连接我写程序的时候的那个数据库 ,然后报一个错,找不到数据库,然后再去读取注册表信息,构建ConnectionString连接客户的数据库。
可是我如果编译的时候把Adoconnection和数据库断开的话,编译好的程序拿到客户那里的时候,就会直接读取注册表信息,然后根据注册表信息构建ConnectionString,然后连接数据库,不会尝试去连接一个不存在的数据库。
我现在有什么办法可以不管编译的时候我的Adoconnection是什么状态,程序换个地方还是直接去读注册表信息,然后连接客户的数据库呢
注册表存放服务器名,数据库名,用户名,口令
问题是假如我编译的时候没有将adoconnection的connected属性设置为false的话,那么程序运行的时候首先会调用我设计的时候的connectionstring去连接数据库,连接不成功然后才会去读注册表,这个是我不希望的。
但是我假如在我的数据模版的oncreate事件中写,也不可以。Adoconnection还是要连接数据库。
--------
尽量在代码里设置你的ADOConnection的连接(在你的逻辑中真正要连接数据库的时候),不要设计期就设定连接。
联接用程序代码实现就可以了.
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
是字符串加密解密函数,要想加密的话自己写,否则不用加密了。