各位大侠,问题是这样的:
我有数据库A,B;库结构是一样的,在服务器端建了一个数据连接,连接到其中的a 或b。我如何实现在客户端根据用户的选择,动态的在A ,B数据库之间切换。 因为数据库可能还会增加c,d...;客户端程序不能固定指定连接A ,B数据库。
在何处写代码,用什么样的方式能实现这种功能呢?
多谢了!!
我有数据库A,B;库结构是一样的,在服务器端建了一个数据连接,连接到其中的a 或b。我如何实现在客户端根据用户的选择,动态的在A ,B数据库之间切换。 因为数据库可能还会增加c,d...;客户端程序不能固定指定连接A ,B数据库。
在何处写代码,用什么样的方式能实现这种功能呢?
多谢了!!
我看了李维的分布式多层应用,好像很复杂,
非得如此处理吗,有没有其他方法?
在D的IDE中你只要在数据模块上按F12会出现可视化的窗口然后加入一个函数并定义相关的参数就可以了;D会帮你写好所有声明当然你还要实现他;;
最好还是去看一下书,,,
这里不好说清楚;
你在应用层建一个Remote DataModal. 在那里输出函数。
打开应用层工程文件 在Delphi的菜单View--type Libery 中选中接口点右键(加函数,设参数),后面的操作不难了,看看就会明白的。
谢谢各位,不过好像此路不通,连接服务器后,不让修改连接串;不连接服务端,又说非法操作。服务端代码:
procedure TTzglSData.TzglConectData(const sConectStr: WideString);
begin
ADOConnectionData.ConnectionString:= sConectStr;
end;客户端代码
procedure TfrmGcmc.OKBtnClick(Sender: TObject);
var
myString:WideString;
begin
// 根据选择的项目名称,确定所要连接的数据库 FrmData.DComConData.Connected:=false; //开、关都不通 MyString:='Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=tzgl';
MyString:=MyString+trim(FrmData.cdsGcmc.FieldByName('工程编号').AsString);
MyString:=MyString+';Data Source=ZJX;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ZJX;Use Encryption for Data=False;Tag with column collation when possible=False'; FrmData.DComConData.AppServer.TzglConectData(MyString);
FrmData.DComConData.Connected:=True;
end;
错在何处
FrmData.DComConData.Connected:=True; //开时,出错信息为
对象打开时,操作不被允许服务端变量类型为:sConectStr Bstr 〔in〕
连接字符串本身就是自动产生的,我只不过想改动其连接的数据库部分。也就是Initial Catalog=?
止止
可以不用写函数的,clientdataset有datarequest方法,他的参数可以向后台传递参数,后台的datasetprovider有ondatarequest事件可以接受那个参数,然后根据参数临时构造adoconnection的connectionstring,
当clientdataset较多时,会很麻烦。不如一次指定简单。
2.先关闭连接,再更改连接字符串
关掉连接再调服务端函数,这样肯定是要出错的procedure TTzglSData.TzglConectData(const sConectStr: WideString);
begin
ADOConnectionData.close;
ADOConnectionData.ConnectionString:= sConectStr;
end;
但是在更改了连接串后,客户端的数据库并没有切换到新库,显示依然是原来的数据。
如何是好???
FrmData.DComConData.Connected:=True;顺序错了吧,应该先连接,再调用接口方法。 FrmData.DComConData.Connected:=True; FrmData.DComConData.AppServer.TzglConectData(MyString);
ClientDataSet1.Close;
ClientDataSet1.Open;
procedure TTzglSData.TzglConectData(const sConectStr: WideString);
begin
ADOConnectionData.close;
ADOConnectionData.ConnectionString:= sConectStr;
ADOConnectionData.Open;
end;
用cds重新要一回数据即可