我需要做一个客户端通过ADO连接SQL Server数据库,但是不想在客户端使用AdoConnection.Open()语句,因为在默认情况下SQL Server在确认登录的时候对用户名和密码几乎是明文发送的。我想通过远程的DCOM的AdoConnection的Open()方法连接数据库后将该AdoConnection返回给客户端直接使用。可是DCOM的OleVariant类型不能直接返回TAdoConnection类型变量。result := MyConn或者result := Myconn as OleVariant都出错。请问我该怎么做?如果我不使用DCOM,有类似的方法能实现我的要求吗?急,急,急,万分感谢!

解决方案 »

  1.   

    DCOM那边的问题解决了,但是客户端调用的时候如果使用
        v := dataModule2.DCOMConnection1.AppServer.Conn2DB;
        FDBConn := @v;虽然编译通过但是运行出错。Conn2DB()返回的是一个转换成Olevariant类型的TADOConnection.ConnectionObject。谁能帮帮我啊?
      

  2.   

    直接返回数据集不行吗?客户端只需要传递SQL语句给应用服务器就可以了
      

  3.   

    >>    v := dataModule2.DCOMConnection1.AppServer.Conn2DB;
    >>    FDBConn := @v;//这句这样写不对.  FDBConn是个什么类型的?
    如果是ADO的_connect接口
    var
      FDBConn:_connect;
      v:variant;
    .....
      v := dataModule2.DCOMConnection1.AppServer.Conn2DB;
      FDBConn:=IUnknown(v) as _connect;
    ....
      

  4.   

    to halfdream(哈欠) 和热心的各位 :不好意思忘了说明一下,FDConn 是TADOConnection变量。你所介绍的方法只能得到TADOConnection.ConnectionObject变量,但是因为程序原因我必须要得到TADOConnection类型的。如果直接使用FDBConn:=IUnknown(v) as TADOConnection编译不通过,如果使用FDBConn:=TADOConnection(IUnknown(v))编译通过但是运行时程序出错。请问如何才能得到TADOConnection的变量?谢谢
      

  5.   

    如果FDCONN是TADOCONNECTION。FDConn:=TAdoconnection.Create(nil);//如果没有创建,要先创建..FDConn.ConnectionObject:=IUnknown(v) as _connect;
      

  6.   

    to  halfdream(哈欠):
    如果使用FDConn.ConnectionObject:=IUnknown(v) as _connect;的话,编译通过,但是运行时还是会出错,请指教。
      

  7.   

    呵呵..你那儿运行时候出问题我不意外的.
    FDConn.ConnectionObject:=IUnknown(v) as _connect;这东西本身是可行的..不过因为使用DCOM参数远程传递数据库连接从本身并不太好,波及很多因素.问题..
    我并不建议你这样做..一定要这样做也并不是不行的..
    你说运行时候报错..干嘛不说出报的什么错呢??
    另外,是你是在一个线程取到这个连接,在另一个线程用它呢?
    还有,你客户机能够直接连接到数据库吗?
      

  8.   

    不好意思,halfdream(哈欠),之前我一直没说明出错在哪里。。客户端能直接连接服务器,但是我的意图就是不想让客户端与服务器有登录验证的过程,因为SQL SERVER 在不设置SSL的情况下用户名和密码都是明文发送,但是我的SQL SERVER是D版,所以方便做SSL我尝试过两种写法,都是使用使用TRemoteDataModule,客户端的DCOMConnection能成功连接服务器上的TRemoteDataModule第一种:服务器那边function TSrvDCOM.Conn2DB: OleVariant;
    var
        FDBConn :TADOConnection;
    begin
        FDBConn := TADOConnection.Create(self);
        FDBConn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;'
            +'Data Source=127.0.0.1,1433;User ID=sa;pwd=1234;Initial Catalog=DB1';
        FDBConn.KeepConnection := true;
        FDBConn.Open();    result := FDBConn.ConnectionObject;
    end;客户端那边设置正确:
        DataModule2.DCOMConnection1.Connected :=  true;
        vOle := DataModule2.DCOMConnection1.AppServer.Conn2DB;
        conn := IUnKnown(vOle) as _Connection;
        s :=  conn.ConnectionString; //这句能得到正确的ConnStr    FDBConn.ConnectionObject := conn;
        s :=  FDBConn.ConnectionString; //到这句出错,提示如下:Access violation at address 00478c8b in module 'project1.exe'
      

  9.   

    方法二:服务器那边的最后一句话替换为:
        result := Olevariant(IUnKnown(FDBConn));客户端这边:
    //FDBConn := IUnKnown(conn) as TADOConnection; 编译不通过使用的是
        DataModule2.DCOMConnection1.Connected :=  true;
        vOle := DataModule2.DCOMConnection1.AppServer.Conn2DB;
        FDBConn := TADOConnection(IUnKnown(vOle)); 
        s :=  FDBConn.ConnectionString; //还是到这里出错,提示如下:Access violation at address 000404858 in module 'project1.exe'请问我该如何做才能客户端使用由服务器端建立的TADOConnection对象?谢谢
      

  10.   

    其他变量声明
    var
        vOle : Variant;
        conn : _connection;
        s : string;