各位大侠,问题是这样的:
    我有数据库A,B;库结构是一样的,在服务器端建了一个数据连接,连接到其中的a 或b。我如何实现在客户端根据用户的选择,动态的在A ,B数据库之间切换。    因为数据库可能还会增加c,d...;客户端程序不能固定指定连接A ,B数据库。
在何处写代码,用什么样的方式能实现这种功能呢? 
 多谢了!!

解决方案 »

  1.   

    让 lxpbuaa(桂枝香在故国晚秋)写一个发给你。哈哈
      

  2.   

    哈哈,idilent(准备去刷碗) 你说的真不错,不亏是高手。
      

  3.   

    其实我不懂的是如何在远程数据模块的接口中添加FUNCTION函数和客户端如何调用!!
    我看了李维的分布式多层应用,好像很复杂,
    非得如此处理吗,有没有其他方法?
      

  4.   

    晕,,,师兄建意你静下心来看书,,,如果李维的那本书就复杂了,,,那你还是先看书再想着写三层吧,,,不然多半是一堆;;中间层实际上是用DCOM的调用,,你只要在中间的COM结口中加入一个函数并实现它就可以,,前面就可以调用了,,,
    在D的IDE中你只要在数据模块上按F12会出现可视化的窗口然后加入一个函数并定义相关的参数就可以了;D会帮你写好所有声明当然你还要实现他;;
    最好还是去看一下书,,,
    这里不好说清楚;
      

  5.   

    只要你用过一次就知道不难的。
    你在应用层建一个Remote DataModal. 在那里输出函数。
    打开应用层工程文件 在Delphi的菜单View--type Libery 中选中接口点右键(加函数,设参数),后面的操作不难了,看看就会明白的。
      

  6.   

    各位老大:
       谢谢各位,不过好像此路不通,连接服务器后,不让修改连接串;不连接服务端,又说非法操作。服务端代码:
    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;
    错在何处
      

  7.   

    // 根据选择的项目名称,确定所要连接的数据库  FrmData.DComConData.Connected:=false; //关时,出错信息为Project prjTzglClinet.exe raised exception class EvariantInvalidOpError with message 'invalid variant operation'.Process stopped.  Use Step or Run to continue
      FrmData.DComConData.Connected:=True; //开时,出错信息为
    对象打开时,操作不被允许服务端变量类型为:sConectStr Bstr 〔in〕
      

  8.   

    你的连接字符串是不是谢太多的内容了,你可以让adoconnection在设计期通过connctionstr属性自动产生一次连接,他好像没有你这么多内容把?你为什么把connctionstr写在前台,在后台构造不行吗?可以不用写函数的,clientdataset有datarequest方法,他的参数可以向后台传递参数,后台的datasetprovider有ondatarequest事件可以接受那个参数,然后根据参数临时构造adoconnection的connectionstring,在对adoconnection的connectionstring负值前,connected要先为false;
      

  9.   

    Tiejun_Chenfang() 
    连接字符串本身就是自动产生的,我只不过想改动其连接的数据库部分。也就是Initial Catalog=?
    止止
    可以不用写函数的,clientdataset有datarequest方法,他的参数可以向后台传递参数,后台的datasetprovider有ondatarequest事件可以接受那个参数,然后根据参数临时构造adoconnection的connectionstring,
    当clientdataset较多时,会很麻烦。不如一次指定简单。
      

  10.   

    1.根据客户端的选择生产连接字符串,用ShowMessage(Connectionstr)看看连接字符串是否正确.
    2.先关闭连接,再更改连接字符串
      

  11.   

    FrmData.DComConData.Connected:=false; //关时,
    关掉连接再调服务端函数,这样肯定是要出错的procedure TTzglSData.TzglConectData(const sConectStr: WideString);
    begin
      ADOConnectionData.close;
      ADOConnectionData.ConnectionString:= sConectStr;
    end;
      

  12.   

    PrgmLover(爱国者) 按你的方法,程序不再报错,
    但是在更改了连接串后,客户端的数据库并没有切换到新库,显示依然是原来的数据。
    如何是好???
      

  13.   

    FrmData.DComConData.AppServer.TzglConectData(MyString);
      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;
      

  14.   

    你修改了后台的连接字符串,但前台并不知道,
    用cds重新要一回数据即可