之所以说是经常犯,那是因为,总是把程序拿到客户那里,运行后,才想起来:又忘记把数据库连接断掉了。数据库为:SQL Server 2000,程序设计基本结构为:ADOConnection, Tadoquery, datasource, DBGrideh,,,,程序中,用到了一些数据感知控件,比如:DBGridEh,为了在设计时期,把表格设计得漂亮些,少不了把ADOConnection 连接到数据库上,把SQL语句写到Tadoquery里,然后打开数据集,去设计表格,因为,SQL 安装在本地机器上,所以,编译后,程序在我的机器上,运行没有任何问题(实际上,ADOConnection 在设计时期就连上了数据库)。。可是,拿到客户那里去,客户的数据库,和程序并不是在同一台机器上,所以会报“数据库连接失败(不存在或拒绝访问),类似的错误”,报完这个错误后,程序还是能正常运行(因为,在程序里,TDataModule 的 onCreate 事件里,我会从配置文件里,读取连接信息,重新连接数据库)。。各位有没有好一点的解决方法呢??因为每次在编译程序时,如果要手动把ADOConnection的连接去掉,然后再编译,有点麻烦啊另外,还有一个原因,就是:程序开发并没有一个很严谨的版本管理,也没有严格的测试之类的流程,客户说,帮我把那个表格调整一下吧,然后,我回去,调整表格后,确信没有影响到其它地方,编译后,在本机测试,OK了,就直接给客户了。所以,就经常出现了上面所问的问题。。
把ADOConnection放在DataMoudle里
try
adoconnection.connected:=false;
except
end;
之后再读取INI。要在所有位置使用ADOCONNECTION之前
';Persist Security Info=True;User ID=' + trim(DBusername)+
';Initial Catalog='+ Trim(DBname) + ';Data Source='+ trim(servername)+
';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID='
+ trim(servername); if con_Main.Connected then
con_Main.Close;
try
con_Main.ConnectionString := ADO_STR;
con_Main.Connected := True;
except
begin //如果不能根据注册表中的信息连接到数据库,则显示连接界面
Frm_DBCfg := TFrm_DBCfg.Create(nil);
try
Frm_DBCfg.ShowModal;
finally
Frm_DBCfg.Free;
end;
end;
end;
也就是在设计时期,Form上就可以看到了数据集的内容了。。这样编译后,程序运行时,ADOConnection 主动根据设计时期的Connection string 连接字符串去连接。。肯定会报错啊。。有点类似这种情况:
把我电脑里的源代码(数据库控件已连接),考到同事机器里,打开源代码时(注意,只是打开)就会报数据库连接失败。。
这样你就能随意控制它了。不要在DataModule 上面放TADOConnection控件。
con_Main.Close;
这个逻辑上已经连接了再关闭没意义啊。
确实,这句话没意义,即使换成:con_Main.Connected := false 也没有意义。。
如果是满天飞就不好办了,可以考虑在窗口装载控件的时候写代码,在装载时装ACTIVE设为FALSE!
试过了,在它的 beforeconnect里面写代码:
比如:adoconnect1.connectstring := '.........';
adoconnect1.connect := true;这样会报错的,
想想也是,这是在它连接之前的操作,在连接之前,再改变连接字符串,肯定会出问题。