前端代码:
var
vParam:TParams;
sMsg:string;
sKindStr:string;
I:Integer;
begin
vParam:=TParams.Create;
try
AddParam(vParam,'THE_CNT',ftInteger,ptInput,kmtb_Check.RecordCount);
AddParam(vParam,'KIND_STR',ftString,ptInput,sKindStr);
try
ExcuteMySQLProcedure('AddArticlepreferential',vParam,sMsg);
except
on e: Exception do
begin
Application.MessageBox(PChar(sMsg),PChar('gevraagd'),MB_ICONERROR);
exit;
end;
end;
finally
freeAndNil(vParam);
end;
end;
function ExcuteMySQLProcedure(sProcedureName:string;var vParam:TParams;var sMsg:string):Boolean;
var
oleParam:OleVariant;
vData:Binary;
I:Integer;
begin
if trim(sProcedureName)='' then exit;
vData:=Binary.Create;
result:=false;
try
oleParam:=ParamsToVariant(vParam);
vData:=BinaryFromVariant(oleParam);
FService := (acsStdFuncDataModule.rmsMain as IacsDataService); // rest of the run on the server
//Call a stored procedure and return value
FService.ExecuteProcedure(sProcedureName,vData,sMsg);
vParam.Clear;
oleParam:=ReadVariantFromBinary(vData);
VariantToParams(oleParam,vParam);
result:=true;
finally
freeAndnil(vData);
end;
end;
服务端代码:
function ExecuteProcedure(const procedureName: AnsiString; var pParam: Binary; var sMsg: AnsiString): Boolean;
var
I:Integer;
vParam:TParams;
vData:OleVariant;
begin
Result := false;
if Trim(procedureName)='' then
begin
Result := false;
sMsg := GloRs_IDsSQLStrIsEmpty;
_WriteError(tLogError,GloRs_DataBaseErrorCode + GloRs_IDsSQLStrIsEmpty);
Exit;
end;
vParam:=TParams.Create;
try
vData:=ReadVariantFromBinary(pParam);
VariantToParams(vData,vParam);
with MyStoredProc1 do begin
try
Close;
StoredProcName:=procedureName;
Params.Clear;
for I:=0 to vParam.Count-1 do
begin
Params.CreateParam(vParam.Items[I].DataType,vParam.Items[I].Name,vParam.Items[I].ParamType);
ParamByName(vParam.Items[I].Name).Value:=vParam.Items[I].Value;
end;
ExecProc;
for I:=0 to vParam.Count-1 do
begin
if (vParam.Items[I].ParamType=ptOutput) or (vParam.Items[I].ParamType=ptInputOutput) then
begin
vParam.Items[I].Value :=ParamByName(vParam.Items[I].Name).AsString;
end;
end;
pParam.Clear;
vData:=ParamsToVariant(vParam);
WriteVariantToBinary(vData,pParam);
finally
MyStoredProc1.Close;
end;
end;
Result := true;
sMsg := GloRs_IDsSQLDSSuccess;
Except
on e: Exception do
begin
sMsg := GloRs_IDsGetData;
_WriteError(tLogError,GloRs_DataBaseErrorCode + GloRs_IDsGetData + e.Message);
_WriteError(tLogError,GloRs_IDsSQLError + procedureName);
Result := false;
end;
end;
end;
用到的函数:
procedure VariantToParams(input:OleVariant;par:TParams);
// TParam 's property: fieldType, paramName, ParamType, value, size
// paramType default value ptinput
// size = sizeof(value)
var
n, i:integer;
begin
try
n:=0;
i:=0;
par.Clear;
while VarArrayHighBound(input,1)>=(n+4)do
begin
par.CreateParam(TFieldType(input[n+1]),input[n+2],input[n+4]);
par.Items[i].Value := input[n+3];
par.Items[i].Size :=SizeOf(input[n+3]);
n:=n+4;
i:=i+1;
end;
except
Exit;
end;
end;
function ParamsToVariant(par:TParams): OleVariant;
// TParam 's property: fieldType, paramName, ParamType, value, size
// paramType default value ptinput
// size = sizeof(value)
var
tmpv:OleVariant;
n,i:integer;
begin
try
tmpv:=VarArrayCreate([1,par.Count*4],VarVariant);
n:=0;
i:=0;
while par.Count>i do
begin
tmpv[n+1]:=Ord(par.Items[i].DataType);
tmpv[n+2]:=par.Items[i].Name;
tmpv[n+3]:=par.Items[i].Value;
tmpv[n+4]:=par.Items[i].ParamType;
i:=i+1;
n:=n+4;
end;
result:=tmpv;
except
Exit;
end;
end;
procedure AddParam(Params: TParams; const ParamName: string;
DataType: TFieldType;ParamType:TParamType;Value: OleVariant);
// only for client load
var
p: TParam;
begin
try
p := Params.CreateParam(DataType, ParamName, ParamType);
p.Value := Value;
p.Size := SizeOf(Value);
except
exit;
end;
end;
其中ReadVariantFromBinary、WriteVariantToBinary、BinaryFromVariant函数用到RemObjects 的uROBinaryHelpers单元
分享到:
相关推荐
在服务端实现多线程技术,意味着服务可以同时处理多个客户端的请求,提高了系统的并发性和响应速度。在Delphi中,可以利用VCL(Visual Component Library)提供的TThread类来创建和管理线程,确保服务端能够高效地...
本文将深入探讨如何在 Delphi 中创建多线程,并且着重讲解如何传递参数给线程以及如何在主线程中同步显示由线程处理后的数据。 一、多线程基础 在 Delphi 中,我们可以使用 TThread 类来创建和管理线程。TThread 是...
最给力的Delphi多层分布式架构资料.chm
5. 扩展性:设计服务端架构时,应考虑到未来可能的负载均衡和集群部署。 总的来说,通过Delphi实现的WebSocket服务端,你可以学习到如何利用Delphi的网络编程接口来实现一个实时通信系统,这不仅加深了对WebSocket...
`CreateAnonymousThreadX`是Delphi社区中广泛使用的一个扩展函数,用于解决原生`TThread.CreateAnonymousThread`不支持直接传递参数的问题。下面将详细探讨`CreateAnonymousThreadX`的工作原理、使用方法以及如何...
收集几个多层和SQL服务端与客户端开发实例,都挺简单,多层服务器在数据库系统开发中占有重要的地位,一些大型的软件系统基本都是建立在多层数据库基础上,你可通过这些简单的多层实例,为自己身更高深的方向发展做...
3. 扩展性设计:服务端架构应具备良好的可扩展性,以适应游戏更新、增加新功能的需求。 总结,传奇服务端代码是Delphi编程技术在网络游戏领域的应用实例,展示了其在处理复杂逻辑、高并发场景下的强大实力。通过对...
Delphi多层分布式架构资料,值得学习参考,对于delphi三层开发很有帮助。
《Delphi客户端与Java服务端整合开发...总之,通过分析"delphi客户端+JAVA服务端"的源码,开发者不仅能掌握跨平台客户端与服务端的开发技巧,还能提升对整体系统架构和通信机制的理解,为今后的项目开发打下坚实基础。
Delphi作为一款强大的Windows应用开发工具,提供了丰富的组件和库支持来实现多层架构,其中RemoteAdo就是一种重要的解决方案。 RemoteAdo是Delphi中用于实现远程数据访问的技术,它允许应用程序通过网络在客户端和...
为了更好地利用这个Delphi WebSocket服务端,开发者还需要熟悉TCP/IP网络编程基础,理解WebSocket协议的帧结构和握手过程,以及如何在Delphi中处理异步事件。此外,对于可能出现的错误情况,如网络中断、客户端断开...
多层架构是一种软件设计模式,它将应用程序分为多个相互独立的层次,通常包括表示层(用户界面)、业务逻辑层(处理业务规则)和数据访问层(与数据库交互)。这种架构的优点在于可以分别对各层进行优化和扩展,降低...
在本例中,"delphi三层架构例子.zip" 提供了一个使用Delphi构建的三层架构服务端应用的源代码示例。三层架构是一种软件设计模式,它将应用程序分为三个主要部分:用户界面层、业务逻辑层和数据访问层,以实现良好的...
Delphi XE10.2 是一款强大的集成开发环境(IDE),主要用于编写Windows、Mac OS X、iOS和Android等多平台的应用程序。在这个环境中,TCP/IP(Transmission Control Protocol/Internet Protocol)服务端和客户端程序...
### DELPHI多层分布式开发概述 #### 一、引言 随着信息技术的发展,软件架构设计不断演进,从最初的单体应用发展到现在的微服务架构。在这个过程中,多层分布式开发模型因其灵活性、可扩展性和易维护性而受到广泛...
本篇文章将深入探讨如何在Delphi中实现多线程参数传递以及同步输出,以确保线程安全。 首先,我们需要理解什么是线程。线程是程序中的执行流,一个进程可以有多个线程。在多线程环境中,每个线程都有自己的栈,但...
Delphi多层架构的ERP管理系统,运行时先运行服务端,配置好数据库服务器,然后再运行客户端,登录后即可进入ERP客户管理系统界面,本套系统采用MSSQL数据库。调试运行截图如上所示,为登录界面。
10. **并发处理**:服务端需要处理多个客户端的并发请求,需要设计合理的并发模型以确保高效运行。 通过学习和研究这套源码,开发者可以了解如何在Delphi环境下实现C/S架构的网络验证系统,这对于开发企业级应用,...
Java服务端与DELPHI客户端的整合是软件开发中的常见场景,特别是在企业级应用中,这种跨平台的通信架构能够充分利用各自的优势。Java以其跨平台性、强大的网络编程能力和丰富的库资源成为服务端开发的首选,而DELPHI...
在IT行业中,多层开发是一种常见的架构设计方法,它将应用程序分为不同的逻辑层,每层专注于特定的功能,以此实现更好的可维护性、扩展性和复用性。Delphi,作为一个强大的面向对象的编程环境,提供了多种多层开发...