请各位高手帮我看一下,我这样做行不行(多帐套,MIDAS)?(50分)

  • 主题发起人 主题发起人 huoxu0529
  • 开始时间 开始时间
H

huoxu0529

Unregistered / Unconfirmed
GUEST, unregistred user!
我时新手,在学习的路上碰到很多问题,有些问题在各位老鸟看来可能很简单,还请各位不要笑,毕竟人人都时从新手到老鸟的嘛。在三层结构中,我不知道怎么样才能实现这样的情况:在系统中,一个帐套对应一个数据库。有这样的情况,比如A用户首先打开了A帐套,但是随后登录的B用户需要打开B帐套,随后C用户需要打开C帐套,请问在这样的情况我这样在服务器上做可行吗?服务器端:首先我在用一个数据库比如“login”来保存所有的用户数据库,在应用服务器连接到数据库服务器的时候我在RDM中定义过程动态创建所有的连接(使用TADOConnection),然后从每个连接中根据TADOConnection.GetTableNames取得所有的表名,同时动态创建一个与表名相对应的(比如DSP+表名)TDatasetProvider(都是在RDM中)。在客户端:客户端登录时首先从应用服务器上取得所有可用的帐套,等用户选择帐套后,从应用服务器上取得该帐套的表名,动态创建TClientDataSet连接应用服务器上的TDatasetProvider。各位帮我看看这样可以吗?如果不行我应该怎样做呢?顺便问个问题,我应该怎样删除我提出的没人回答问题,谢谢各位!
 
怎么没人回答呢?我说的不够清楚吗?高手们都到哪里去了,帮帮我啊![:(][:(]
 
RDM中定义过程动态创建所有的连接(使用TADOConnection)
这样连接太多了吧
建议动态创建连接
 
to zealothasu:
谢谢你,你的意思是不是这样:在应用服务器上写过程,动态创建一个用户需要的数据库连接,然后客户端每次连接的时候都需要调用此过程,并且这个连接直到该用户关闭程序才被释放是吗?
 
其实连接的都是同样的表
只是数据库不一样而已
所以cds,dsp没有必要都动态创建
只是创建不同的实例就可以了
 
非常感谢你,zealothasu。不过我对你的意思还是不是很理解,不同的实例?我对这些不是很懂,不过,按照你的意思,那要怎样Create呢?能不能给一段代码给我看看,谢谢你了!
 
是不是这样?以下是我在RDM中的代码:
var
ADOConnect : TADOConnection;
DSP : TDataSetProvider;
//创建和数据库的连接
procedure TWZGL.CreateConnect(DataBaseName : OleVariant);
var
i : integer;
begin
ADOLogin.Close;
ADOLogin.SQL.Clear;
ADOLogin.SQL.Add('select * from Login');
ADOLogin.Open;
while Not ADOLogin.Eofdo
begin
for i := 1 to ADOLogin.RecordCountdo
begin
DataBaseName := ADOLogin.FieldByName('DatabaseName').AsString;
ADOConnect := TADOConnection.Create(Self);
ADOConnect.Name := 'ADO' + DataBaseName;
ADOConnect.LoginPrompt := false;
//DBConnect(ADOConnect, ServerName, DBName, UserName, Password)
//该过程根据指定TADOConnection连接数据库
//ADOConnect : TADOConnection
DBConnect(ADOConnect, ServerName, DBName, UserName, Password);
ADOLogin.Next;
end;
end;

end;
//创建TDatasetProvider提供给客户端
//ADOConnName为用前面过程创建的TADOConnection
procedure TWZGL.CreateDSP(ADOConnName : OleVariant);
var
TableNames : TStrings;
begin
TableNames := TStringList.Create;
ADOConnect.Name := ADOConnName;
//GetTableName(ADOConnect : TADOConnection)为公共模块中的一个函数
//取得指定TADOConnection所连接数据库的所有表名
TableNames := GetTableName(ADOConnect);
while Not TableNames.Eofdo
begin
for i := 1 to TableNames.Countdo
begin
DSP := TDataSetProvider.Create(Self);
//我不知道这句对不对,我在文本上打的
DSP.Name := 'DSP' + TableNames.String;
//创建一个数据集提供给TDataSetProvider
//DSP.DataSet :=
end;
end;
end;

请各位帮我看看这样可行吗?另外我想问一下,在应用服务器中我应该怎样调用RDM中的过程,我试了很多次,总是不行,在别的模块中根本就不能用我写的过程,连RDM中的一个控件都都不能用。
 
MainDataModule.ADOConnection1.ConnectionString := 'Provider=microsoft.jet.oledb.4.0;
Persist Security Info=False;
Data Source= ' + SourFilePath +';Jet OLEDB:Database Password="zcrjzyz"';
MainDataModule.ADOConnection1.Connected := True ;
 
听听课。
 
to zhang_yz6666:
谢谢你,你用的那个“MainDataModule”是“DataModule”还是“RemoteDataModule”啊?我是想在应用服务器的其他模块中调用“RemoteDataModule”的过程,每次我打了RemoteDataModuleName.ProcedureName(“参数列表”);这样的代码就报错,说没有定义“ProcedureName”,要怎么样才行呢?而且,在我打了RemoteDataModuleName.(注意有“点”)之后,根本就不能显示RemoteDataModule中的任何控件。
 
我觉得还是用一个数据库比较好!
 
多人接受答案了。
 
后退
顶部