大家好:
    小弟是新来的,以前的人都走了,就剩我自己在这里做软件维护,在这期间遇到了好多的困难,但都被我一一排除,就剩下这个问题了,下面这个函数就是客户端登陆时候连接数据库的函数,问题是:如果说有客户端 A 已经连接了,(Database1 已经 Open),有一个客户端 B 来登陆,    frmMain.Database1.Close;这句代码会关掉,所以那个客户端 A 在一瞬间有可能会报错,我试了几次,还是不行,请教各位,问题解决,马上送分:function TForm1.SetDataBaseParam(const DataBaseName: WideString): OleVariant;
var
    GszServerName, GszUserName, GszPassword, szPath, szState :string;
    Reg: TRegistry;
begin
    frmMain.Database1.Close;
    frmMain.Database1.Params.Clear;
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    szPath := '\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DB';
    if Reg.KeyExists(szPath) then
    begin
        if Reg.OpenKey(szPath,True) then
        begin
            GszServerName :=Reg.ReadString('Server_Name');
            GszUserName :=Reg.ReadString('SQL_userName');
            GszPassword :=Reg.ReadString('SQL_PASSWORD');
            if DataBaseName='' then
            begin
                frmMain.Database1.Params.Add('SERVER NAME='+GszServerName);
                frmMain.Database1.Params.Add('DATABASE NAME=JCGL_SYS');
                frmMain.Database1.Params.Add('USER NAME='+GszUserName);
                frmMain.Database1.Params.Add('PASSWORD='+GszPassword);
            end
            else
                begin
                    frmMain.Database1.Params.Add('SERVER NAME='+GszServerName);
                    frmMain.Database1.Params.Add('DATABASE NAME='+DataBaseName);
                    frmMain.Database1.Params.Add('USER NAME='+GszUserName);
                    frmMain.Database1.Params.Add('PASSWORD='+GszPassword);
                end;
        end;
        Reg.CloseKey;
        Reg.Free;        // 控制图标显示
        try
            frmMain.Database1.Open;
            szState := '已连接到服务器';
            frmMain.ImageStart.Visible := True;
            frmMain.ImageEnd.Visible := False;
        except
             szState := '中间层配置错误或服务器未开启。';
             frmMain.ImageStart.Visible := False;
             frmMain.ImageEnd.Visible := True;
        end;
    end    else
        szState := '中间层配置错误或服务器未开启。';    frmMain.Panel2.Caption := '     ' + szState;    if frmMain.ImageStart.Visible then
        frmMain.TrayIcon1.IconList := frmMain.ImageList2
    else
        frmMain.TrayIcon1.IconList := frmMain.ImageList3;
    frmMain.TrayIcon1.Hint := '管理系统中间层' + '『' + szState + '』';
end;

解决方案 »

  1.   

    能否在打開的時候作一個判斷,如果那個中間層已經打開了
    就不再配置了,也就是說就不再用frmMain.Database1.Close;樓主可以再做一個工具,就是配置中間層的,我的意思是
    萬一中間層啟動錯誤,可以用那個工具來再配置一下
      

  2.   

    其实说了这么多,问题关键点就在一个,Database1 的 close 与 Open 问题,如果能够控制就该好了,不过我每个客户端启动都要连接数据库,从数据库读取数据进来,这个问题也是困扰了我好久的问题,希望能够得到解决,在线等各位
      

  3.   

    可能不太明白你的意思,但如果你是要在程序启动时连接数据库读数据,可以动态创建一个database啊,连接完毕后释放,没必要都用同一个database
      

  4.   

    我的意思是:用 Database 连接数据库,有可能是不同的数据库,在客户端的登陆界面可以选择,不同的客户端可以进入不同的数据库,只要登陆进去,说明进入了一个数据库,Database 就已经 open 了,并且一直连接着的。现在的问题是:不同的客户端都要用到 Database 连接数据库,所以要 Database1.Close; Database1.Params.Clear;进行连接数据库,最后 Database1.Open; 这样一来,如果有一方正在登陆(Database1 是 Open 的),另一方正好登陆,就又会执行代码:Database1.Close;如果没有选择进入哪个数据库,说明永远 没有执行 Database1.Open ,就得退出软件,重新连接,有没有解决的办法,希望大家能够给我指点
      

  5.   

    这种情况可能要动态创建DataBase了!
    不过建议楼主改用ado,因为ado里面有连接字符串,每个客户端在请求不同数据库的数据时,动态产生连接字符串就可以了,很简单的!
      

  6.   

    改为 ADO 应该是一种很好的方法,不过我又得重头改了,下午我有事情出去,大家帮我顶啊,明天回来时候,继续在线等,各位的回贴一定不会白费的,我这人就好交朋友
      

  7.   

    请教一下,以前的那个程序的中间层里面有个 Database,是放在 Server 端的中间层,但是如果要是动态创建的话,是不是应该写到客户端里面了
      

  8.   

    如果是这样,用一个database明显就不够了。
      

  9.   

    那应该怎么弄才还,是要动态的创建 Database,是在客户端还是在服务器端,给我一些建议吧,小弟等了好几天了
      

  10.   

    为什么每次都要close再open.
    open一次不就行了么?
      

  11.   

    我的三层是用ado连的,很方便。
      

  12.   

    其实我说了这么多,可能没说明白,就是多帐套的问题,中间层就一个,客户端有好多,每个客户端都是通过 Database 来连接数据库的,所以每次取不同的帐套时,都要
    Database1.Close;
    Database1.Params.Clear;
    然后重新连接,但是如果有一放正在连接数据库,说明 Database 是 Open 的,这时候又进来一个客户端,就给 Close 掉了,所以会造成冲突,有没有好方法,请与我联系,希望大家都互相帮助,不要藏着掖着的,不值当吧
      

  13.   

    Erice(白雪公猪) 
        你就是个垃圾,也配回我的贴子,去死吧!作你妈的假帐!看你那积分,臭狗屎!
      

  14.   

    zhangjing1979666(好小子):你嘴巴放干净点!!你这种人,能完成工作吗?建议你去心理医生哪里去看看,小心你老妈到“号子”了去看你!!
      

  15.   

    题外话:这样的设计表明....同时中间层只能服务于于一个客户端,你可以设置一个FInUse变量,标识TDatabase是否正在使用
    如果是就给客户端一个异常,说正在使用,反之则close,open
      

  16.   

    Erice(白雪公猪) ,我告诉你,我已经完成了!让你吃憋了!真不好意思!你可以去死了!你就是个臭狗屎啊,还恶人先告状,去死吧你,臭三八,还说什么做假账,你妈是不是做假账啊,还是你爸,在你的思想里面就只有假账吧,臭猪狗!你活着也是浪费粮食