改个问法:怎样从服务器端传一个参数给客户端呢。(简单问题) 请直接从红色的字开始看。 (200分)

  • 主题发起人 主题发起人 free_knight
  • 开始时间 开始时间
F

free_knight

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1011780
我找了一下大富翁以前的问题,发现一个,不过还是不会用,各位谁
有试成功的,告知一声,让大家都学习学习。
大富翁以前的问题如下:
如何才能让client使用appserver动态创建的TDataSetProvider (200分)
分类:数据库-C/S型 gulfstream (2000-11-15 12:23:00)
AppServer在运行时动态创建一个DataSetProvider,如何才能让该DataSetProvider
能够被client使用?

jqw (2000-11-15 12:58:00)
server端创建dataset datasetprovider
client端创建clientdataset,其provider指向datasetprovider

DreamTiger (2000-11-15 13:11:00)
动态创建,可以从AppServer查询到有哪些DataSetProvider么?
我觉得比较困难

gulfstream (2000-11-15 16:26:00)
d5的midas 3中,tclientdataset不再维护IProvider接口,没有了provider属性,代之以
providername属性,但是clientdatase没法看见appserver中动态创建的datasetprovider,
有没有什么办法可以动态创建datasetprovider供client使用?

gulfstream (2000-11-17 15:12:00)
我已将问题解决,现已可以使用动态创建的tdatasetprovider
版主能否将此问题取消?

DreamTiger (2000-11-17 15:34:00)
不要忙着取回分数么,既然你已经知道怎么做了,不如把
你的解决方法告诉大家,让大家分享你的快乐。这个问题
也算有个圆满结束。如果你需要分数,我可以另开一个问
题给你分数。这题分数就给jqw 了。希望能够看到你的解
决方法。

gulfstream (2000-11-18 10:13:00)
其实很简单,使用 RemoteDataModule.RegisterProvider注册DataSetProvider,
但要注意设置TDataSetProvider.Name,当时我就是忘了设置该值,所以client
看不见动态创建的TDataSetProvider。
 
function TAPScom.GetProvidername(const mDBname: WideString): WideString;
var
mProvider: Tdatasetprovider;
mQuery: TQuery;
mNAME: string;
begin
mNAme := getRANDOMname;
//------------- Create Tquery
// mQuery := CreateQuery(mDBname, Self, 'Query' + mName);
//------------- Create Tprovider
mProvider := Tdatasetprovider.Create(self);
mPRovider.Name := 'Provider'+ mNAme;
mProvider.ResolveToDataSet := false;
mProvider.Exported := true;
mPRovider.DataSet := mQuery;
//mProvider.OnDataRequest := DataSetProviderDataRequest;
// mProvider.OnUpdateError := DataSetProviderUpdateError;
Result := mPRovider.Name;
end;
function Tapscom.GetRanDOMname: string;
var
tmp: string;
function getName: string;
var
nameLen, I: integer;
begin
Randomize;
NameLen := 5;
Result := '';
for I := 1 to NameLendo
Result := Result + inttostr(Random(10));
end;
begin
Result := '';
repeat
TMP := getName;
until Self.FindComponent(ProviderHeader + TMP) = nil;
Result := TMP;
end;
 
好像不行,我要在应用程序服务器端创建,吧名称传递到客户端在客户端的
TClinetDataSet中用
 
上面的程序是写在view--type libaray里的方法随dcom发布的。客户端调用方法为
Clientdataset1.ProviderName := (DM.Dcom1.GetServer as IAPScom).getprovidername(mDBname);
DM 为datamodule
Dcom1为dcomconection
 
在view--type libaray里建什么,
怎么建function ,我只会建Method
 
我是这样做的
procedure Ttest1.addp(var fp: OleVariant);
var a:TDataSetProvider;
begin
OracleSession1.Connected:=true;
a:=Tdatasetprovider.Create(self);
a.Name:='Provider'+fp;
self.RegisterProvider(a);
fp:=a.Name;
end;

可是在客户端却得不到fp
说明一下,我的fp是 in out型的
 
谁解决了这个问题,给477分,连下面的分一起给他。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1011780
 
还没解决?
 
你在服务器中动态创建了TDatasetprovider之后,你再重新在一台机器上启动一个
客户端程序,看它能不能连上.
当然TDatasetProvider首先得注册才行.
 
我的服务端:
procedure Ttest1.addp(var fp: OleVariant);
var a:TDataSetProvider;
begin
OracleSession1.Connected:=true;
a:=Tdatasetprovider.Create(self);
a.Name:='Provider'+fp;
self.RegisterProvider(a);
fp:=a.Name;
showmessage('*'+fp+'*');//到这里都执行正确
end;

这是我在客户端的调用:
procedure TForm1.Button1Click(Sender: TObject);
var str1:string;
begin
str1:='test';
SocketConnection1.AppServer.AddP(str1);//可每次执行到这里就出现“内存被锁定”的错误
showmessage(str1);
end;
 
具体错误提示如下:
Project ThisIsTest.ext raised exception class
EOLeSysError with messge'内存已锁定。'.Process
stopped.Use Step or Run to continue.
 
你同时在一台机器上启动两个DELPHI,然后分别F9,这样你调试客户端到你要
出错那一句时,用F7看到底在服务器端是哪句出的错
 
to: free_knight
就是建Method,实际就是客户端调服务器的GetProvidername方法,将provider name传
过来,provider还是在服务器创建的。在李维的书上讲的客户端调服务器方法比较明白。
 
我成功了:
服务器端:
procedure Ttest1.a(var n: OleVariant);
var test_p:TDataSetProvider;
begin
test_p:=Tdatasetprovider.Create(self);
with test_pdo
begin
DataSet:= OracleDataSet1;
Constraints:= True;
Options:= [poAllowCommandText];
Name:='Provider'+n;
end;

客户端:
procedure TForm1.Button2Click(Sender: TObject);
begin
SocketConnection1.AppServer.a('abcd');
ClientDataSet1.ProviderName:='Providerabcd';
ClientDataSet1.Close;
ClientDataSet1.CommandText:='select * from Product_info';
ClientDataSet1.open;
end;

可是我的分数…………
还有就是我把服务器端的参数 var n: OleVariant设成了in型
如果设成out型就不行了。
怎样从服务器端传一个参数给客户端呢,答者150分。
 
给你一个最简单的例子
建立一个最简单的服务器端和客户端。
服务器project1 包含unit1,unit2。 unit1是form
客户端project2包含unit3,unit4, unit3是form
uint2 ,unit4的代码为,我测试是成功的
unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Project1_TLB, StdVcl, DB, DBTables, Provider;
type
TTest = class(TRemoteDataModule, ITest)
Database1: TDatabase;
Query1: TQuery;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
function GetProviderName: WideString;
safecall;
public
{ Public declarations }
end;

implementation
{$R *.DFM}
class procedure TTest.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

function TTest.GetProviderName: WideString;
var
mProvider: Tdatasetprovider;
mNAME: string;
begin
mNAme := '1';
//------------- Create Tprovider
mProvider := Tdatasetprovider.Create(self);
mPRovider.Name := 'Provider'+ mNAme;
mProvider.ResolveToDataSet := false;
mProvider.Exported := true;
mPRovider.DataSet := Query1;
Result := mPRovider.Name;
end;

initialization
TComponentFactory.Create(ComServer, TTest,
Class_Test, ciMultiInstance, tmApartment);
end.

unit Unit4;
interface
uses
SysUtils, Classes, DB, DBClient, MConnect,Project1_TLB;
type
TDataModule4 = class(TDataModule)
DCOMConnection1: TDCOMConnection;
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
DataModule4: TDataModule4;
implementation
{$R *.dfm}
procedure TDataModule4.DataModuleCreate(Sender: TObject);
begin
Clientdataset1.ProviderName :=
(DCOMConnection1.GetServer as ITest).GetProviderName;
Clientdataset1.Active:=true;
end;

end.
 
[red]怎样从服务器端传一个参数给客户端呢,如字符型,答者150分。[/red]
 
var n: OleVariant设成了in型
如果设成out型就不行了。
~~~~~~~~~~~~~~~~~~~~~~~~IN是表示给服务器的,OUT表示是从服务器中传出的!
 
天真:不好意思,我没有说清楚,
是设成in .and. out 型就不行了
 
多人接受答案了。
 
后退
顶部