我需要做一个客户端通过ADO连接SQL Server数据库,但是不想在客户端使用AdoConnection.Open()语句,因为在默认情况下SQL Server在确认登录的时候对用户名和密码几乎是明文发送的。我想通过远程的DCOM的AdoConnection的Open()方法连接数据库后将该AdoConnection返回给客户端直接使用。可是DCOM的OleVariant类型不能直接返回TAdoConnection类型变量。result := MyConn或者result := Myconn as OleVariant都出错。请问我该怎么做?如果我不使用DCOM,有类似的方法能实现我的要求吗?急,急,急,万分感谢!
v := dataModule2.DCOMConnection1.AppServer.Conn2DB;
FDBConn := @v;虽然编译通过但是运行出错。Conn2DB()返回的是一个转换成Olevariant类型的TADOConnection.ConnectionObject。谁能帮帮我啊?
>> FDBConn := @v;//这句这样写不对. FDBConn是个什么类型的?
如果是ADO的_connect接口
var
FDBConn:_connect;
v:variant;
.....
v := dataModule2.DCOMConnection1.AppServer.Conn2DB;
FDBConn:=IUnknown(v) as _connect;
....
如果使用FDConn.ConnectionObject:=IUnknown(v) as _connect;的话,编译通过,但是运行时还是会出错,请指教。
FDConn.ConnectionObject:=IUnknown(v) as _connect;这东西本身是可行的..不过因为使用DCOM参数远程传递数据库连接从本身并不太好,波及很多因素.问题..
我并不建议你这样做..一定要这样做也并不是不行的..
你说运行时候报错..干嘛不说出报的什么错呢??
另外,是你是在一个线程取到这个连接,在另一个线程用它呢?
还有,你客户机能够直接连接到数据库吗?
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'
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对象?谢谢
var
vOle : Variant;
conn : _connection;
s : string;