关于DATASNAP传递Record类型到客户端的问题
来源:互联网 发布:七天爱上你在哪网络看 编辑:程序博客网 时间:2024/05/22 06:27
以前,使用 DELPHI 2010 时,可以使用类似如下的代码来传递);
I wish to be able to declare a Data Snap method with the following signature
type TLoginInfo =record Username:string; Password:string; LastLogged: DateTime;end;function GetLoginInfo(const UserId: Integer): TLoginInfo;
When I try to call it it says that TLoginInfo is not well known.
Answer:
store the record into a stream and pass the stream to the DataSnap method
//on server sidefunction GetLoginInfo(const UserId: Integer): TStream;begin Result := TMemoryStream.Create; Result.Write( loginRec, SizeOf(TLoginInfo)) Result.Seek(0, TSeekOrigin.soBeginning);end;
//on client sideprocedure TfrmMain.getLogInto( sUser:string);var AStr : TStream; loginRec : TLoginInfo;begin// cycleConnection;with TMethodsClient.Create( SQLConn.DBXConnection,False)dobegin AStr := GetLoginInfo( sUser ); AStr.Read( loginRec, SizeOf(TLoginInfo)) Free;end; FreeAndNil(AStr);end;
---------------------------
即使用 流的方法的进行传递。
可是以上的代码,在DELPHI XE 时好象就能不通过了(如果我没有记错的话),当然,稍微调整一下,也还是能通过的;
即将:
type TLoginInfo =record Username:string; Password:string; LastLogged: DateTime;end;
改成类似:
type TLoginInfo =record Username:string[20]; Password:string[20]; LastLogged: DateTime;end;
直到现在 XE6 仍然可以用。
但是使用 XE6 的一个重要的原因,就是使用它来开发 Android 的应用。
在安卓的应用中类似 String[20]的类型是不被支持的。。
看来,只能使用其它的方法。。。于是想到了使用 OleVariant
具体代码如下:
服务器端:
TLoginUserInfo = record LoginState : Integer ; //登录状态:0成功,1密码错误,2用户不存在,3用户被禁用,255未知错误 IsSuperUser : Boolean; FactoryEvaluation : Boolean; //验厂状态,当为TRUE时,仅显示报程表,否则正常; UserCode : string; UserName : string; Password : string; Deportment : string; Barcode : string; MachineCode : string; AutoPromptMsg : string; UserClass : integer ; //用户类型,0普通用户 1印前 2印后 3手工 ProductionWorkShop: string; end;.......function ChekcUsernameAndPassword2(U,P:string):OleVariant;var UserInfo :TLoginUserInfo; V:Variant ;begin UserInfo.LoginState := 255 ; //Defautl: Unknown error with QRY do begin Close; SQL.Text :='';//省略 Open; if not IsEmpty then begin if P <> FieldByName('MM').AsString then begin UserInfo.LoginState :=1; end else if FieldByName('SFJY').AsBoolean then begin UserInfo.LoginState :=3; end else begin UserInfo.LoginState :=0; UserInfo.IsSuperUser := FieldByName('CJYH').AsBoolean; UserInfo.UserCode := U; UserInfo.UserCode := FieldByName('XH').AsString; UserInfo.UserName := FieldByName('MC').AsString; UserInfo.Password := FieldByName('MM').AsString; UserInfo.Deportment := FieldByName('BMBH').AsString; UserInfo.MachineCode := FieldByName('SBBH').AsString; //设备编号 UserInfo.AutoPromptMsg :=''; UserInfo.UserClass :=FieldByName('jtsclx').AsInteger ; UserInfo.ProductionWorkShop :=FieldByName('SCCJ').AsString ; end; end else UserInfo.LoginState :=2; Close; //读是否是验厂 SQL.Text :='';//省略 Open; UserInfo.FactoryEvaluation := FieldByName('FE').AsBoolean; Close; end; V := VarArrayCreate([0,8],VarVariant); v[0] := UserInfo.LoginState ; v[1] := UserInfo.IsSuperUser ; v[2] :=UserInfo.UserCode ; v[3] :=UserInfo.UserName ; v[4] :=UserInfo.Password ; v[5] :=UserInfo.Deportment ; v[6] :=UserInfo.MachineCode; v[7] :=UserInfo.AutoPromptMsg ; v[8] :=UserInfo.ProductionWorkShop ; Result := V;end;
客户端:
vardm :TServerMethods1Client;procedure Tdm.DataModuleCreate(Sender: TObject);begindm := TServerMethods1Client.Create(SQLCnt_1.DBXConnection);
end;function Tdm.PubF_CheckLoginUsername2(U, P: string): TLoginUserInfo;var V:Variant ;begin V := dm.ChekcUsernameAndPassword2(U,P); if VarIsArray(V) then begin Result.LoginState := v[0]; Result.IsSuperUser := v[1]; Result.UserCode := v[2]; Result.UserName := v[3]; Result.Password := v[4]; Result.Deportment := v[5]; Result.MachineCode := v[6]; Result.AutoPromptMsg := v[7]; Result.ProductionWorkShop := v[8]; end;end;
以上代码,服务器端 windows7 / windows2008 r2 客户端:windows7 、 小米3(MIUI5)中测试通过;
0 0
- 关于DATASNAP传递Record类型到客户端的问题
- RPC由客户端到服务器传递字符串的问题
- 关于datasnap服务器中一个内存错误的问题
- 关于SSM中的Controller传递参数的类型的问题
- 关于 fstream 类型作为参数传递的问题
- 关于Record类型RTTI反射的用途和方法
- 关于Record类型RTTI反射的用途和方法
- 利用DataSnap进行数据流(TStream)的传递
- DataSnap客户端共享服务器端的数据库连接
- datasnap 如何监控客户端的连接情况
- datasnap 如何监控客户端的连接情况
- DataSnap客户端共享服务器端的数据库连接
- 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子
- Java值传递和地址传递:关于String类型和集合类型作为函数参数时传值问题的测试
- 关于 DataSnap Rest Api 方法的定义
- 关于使用Mina做客户端和服务端传递对象的问题
- Delphi2010中DataSnap高级技术(3)—DataSnap服务器如何得到客户端的IP和端口
- Delphi2010中DataSnap高级技术(3)—DataSnap服务器如何得到客户端的IP和端口
- ZOJ 3789 Gears 并查集
- ExcelReader(解析Excel的工具类)
- MongDB应用场景(一)视觉中国从MySQL到MongDB
- 使用导入导出进行备份和恢复OCR(10g)
- fuelphp 查看query sql log
- 关于DATASNAP传递Record类型到客户端的问题
- 第三章作业
- [LeetCode10]Best Time to Buy and Sell Stock III
- oracle HA 高可用性详解(之一)
- MongDB应用场景(二) 使用场景和生产部署
- ubuntu安装JDK1.6
- .Net之路(十三)数据库导出到EXCEL
- 根据不同的操作系统读取配置文件/java读取属性文件代码
- Tomcat安装配置