大家好:
小弟是新来的,以前的人都走了,就剩我自己在这里做软件维护,在这期间遇到了好多的困难,但都被我一一排除,就剩下这个问题了,下面这个函数就是客户端登陆时候连接数据库的函数,问题是:如果说有客户端 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;
小弟是新来的,以前的人都走了,就剩我自己在这里做软件维护,在这期间遇到了好多的困难,但都被我一一排除,就剩下这个问题了,下面这个函数就是客户端登陆时候连接数据库的函数,问题是:如果说有客户端 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;
解决方案 »
- delphi怎样从linux服务器下载文件
- 请问如何用一个定义一个TStringlist类型或者其他数组函数获取XML中class下的各元素的值????又如何调用呢?急急急啊!!!
- 初学者,连接数据库的问题
- 如何获取其它应用程序中某个文本框中的内容?
- 小问题,分还可以;
- 兄弟们!请问做一个财务软件要花多少时间?
- 在Dll中如何操作数据库?我在Dll中建了个DM,放上ADOConnection和ADOCommand,然后...内详
- 一个研究生(我)的毕业设计——50RMB/MONTH
- 大家能去大富翁吗?
- 使用DELPHI的报表控件输出EXCEL97一样格式的表格
- 请教用WORD做帮助文件
- 一个非常奇怪的问题。。。。。!
就不再配置了,也就是說就不再用frmMain.Database1.Close;樓主可以再做一個工具,就是配置中間層的,我的意思是
萬一中間層啟動錯誤,可以用那個工具來再配置一下
不过建议楼主改用ado,因为ado里面有连接字符串,每个客户端在请求不同数据库的数据时,动态产生连接字符串就可以了,很简单的!
open一次不就行了么?
Database1.Close;
Database1.Params.Clear;
然后重新连接,但是如果有一放正在连接数据库,说明 Database 是 Open 的,这时候又进来一个客户端,就给 Close 掉了,所以会造成冲突,有没有好方法,请与我联系,希望大家都互相帮助,不要藏着掖着的,不值当吧
你就是个垃圾,也配回我的贴子,去死吧!作你妈的假帐!看你那积分,臭狗屎!
如果是就给客户端一个异常,说正在使用,反之则close,open