之所以说是经常犯,那是因为,总是把程序拿到客户那里,运行后,才想起来:又忘记把数据库连接断掉了。数据库为:SQL Server 2000,程序设计基本结构为:ADOConnection, Tadoquery, datasource, DBGrideh,,,,程序中,用到了一些数据感知控件,比如:DBGridEh,为了在设计时期,把表格设计得漂亮些,少不了把ADOConnection 连接到数据库上,把SQL语句写到Tadoquery里,然后打开数据集,去设计表格,因为,SQL 安装在本地机器上,所以,编译后,程序在我的机器上,运行没有任何问题(实际上,ADOConnection 在设计时期就连上了数据库)。。可是,拿到客户那里去,客户的数据库,和程序并不是在同一台机器上,所以会报“数据库连接失败(不存在或拒绝访问),类似的错误”,报完这个错误后,程序还是能正常运行(因为,在程序里,TDataModule 的 onCreate 事件里,我会从配置文件里,读取连接信息,重新连接数据库)。。各位有没有好一点的解决方法呢??因为每次在编译程序时,如果要手动把ADOConnection的连接去掉,然后再编译,有点麻烦啊另外,还有一个原因,就是:程序开发并没有一个很严谨的版本管理,也没有严格的测试之类的流程,客户说,帮我把那个表格调整一下吧,然后,我回去,调整表格后,确信没有影响到其它地方,编译后,在本机测试,OK了,就直接给客户了。所以,就经常出现了上面所问的问题。。

解决方案 »

  1.   

    一般我的做法是设计好后再断开,并设置Tadoquery的connection为ADOconnection,adoconnection的连接字串是在初始化时动态从ini文件取的.
      

  2.   

    写一个连接数据库的函数就行了
    把ADOConnection放在DataMoudle里
      

  3.   

    指向 ODBC 数据源  是最简单的....
      

  4.   

    在datamodule oncreate 的时候
    try 
    adoconnection.connected:=false;
    except
    end;
    之后再读取INI。要在所有位置使用ADOCONNECTION之前
      

  5.   

    呵呵,我的做法,与楼上的各位基本相同。。问题出现在:总是在设计时期,把ADOConnection连接好了,编译时,常常忘记断开,生成的可执行文件,总是会自动连接。下面的代码,是DataModule 的 OnCreate 里的代码。并且,DataModule的启动顺序,也是放在第一个了。。  ADO_STR := 'Provider=SQLOLEDB.1;Password='+ trim(DBpassword)+
                  ';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;
      

  6.   

    你可以在程序中配置连接字符串 程序运行的时候 让用户放去配置那个连接字符串 配置好后 把连接字符串保存在INI文件中,下次运行的时候读取 
      

  7.   

    可能各位还不太明白我的意思。。把连接数据库的配置信息放在INI,或是注册表里,这些都没什么问题。。问题是:程序在设计时期,把ADOConnection 连接到了数据库,并且有些Tadoquery的Acitve 是True..
    也就是在设计时期,Form上就可以看到了数据集的内容了。。这样编译后,程序运行时,ADOConnection 主动根据设计时期的Connection string 连接字符串去连接。。肯定会报错啊。。有点类似这种情况:
    把我电脑里的源代码(数据库控件已连接),考到同事机器里,打开源代码时(注意,只是打开)就会报数据库连接失败。。
      

  8.   

    你在DataModule 的 OnCreate 里的代码自己创建一个ADOConnection。
    这样你就能随意控制它了。不要在DataModule 上面放TADOConnection控件。
      

  9.   

      if con_Main.Connected then 
        con_Main.Close; 
    这个逻辑上已经连接了再关闭没意义啊。
      

  10.   


    确实,这句话没意义,即使换成:con_Main.Connected := false 也没有意义。。
      

  11.   

    如果是拖的VCL进去的,你应当在adoconnection的的beforeconnect事件里面写这句,然后再重新写连接字符串
      

  12.   

    有多少个ADOConnection?
    如果是满天飞就不好办了,可以考虑在窗口装载控件的时候写代码,在装载时装ACTIVE设为FALSE!
      

  13.   


    试过了,在它的 beforeconnect里面写代码:
    比如:adoconnect1.connectstring := '.........';
    adoconnect1.connect := true;这样会报错的,
    想想也是,这是在它连接之前的操作,在连接之前,再改变连接字符串,肯定会出问题。