用delphi 做服务器,basic4android 实现三层数据交互
這是我第一次寫博客,寫得不好,以前學的東西我從來就沒有想過記錄下來,使用很快就忘記了,所以我現在開始寫博客把所有學到的東西都要記錄下來,加油...
首先delphi 里面加入kbmMWClient 這個插件 下載地址:http://pan.baidu.com/share/link?shareid=2712849152&uk=3993363350
第一個頁面
unit unt_main;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, kbmMWCustomTransport, kbmMWServer, kbmMWTCPIPIndyServerTransport,
 StdCtrls;
type
 Tmainform = class(TForm)
 kbmMWServer1: TkbmMWServer;
 kbmMWTCPIPIndyServerTransport1: TkbmMWTCPIPIndyServerTransport;
 Edit1: TEdit;
 Label1: TLabel;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
var
 mainform: Tmainform;
implementation
uses unt_service_func, unt_dm;
{$R *.dfm}
procedure Tmainform.Button1Click(Sender: TObject);
begin
 //鏈接數據庫
 DataModule1.ADOConnection1.ConnectionString := Edit1.Text;
 DataModule1.ADOConnection1.Connected := True;
 //啟動服務
 kbmMWServer1.Active := True;
end;
procedure Tmainform.FormCreate(Sender: TObject);
var
 sd: TKbmMWCustomServiceDefinition;
begin
 //項目啟動時先要注冊服務
 sd := kbmMWServer1.RegisterService(TkbmMWSimpleService1,false);
end;
end.
第 二 個頁面
unit unt_service_func;
// =========================================================================
// kbmMW - An advanced and extendable middleware framework.
// by Components4Developers (http://www.components4developers.com)
//
// Service generated by kbmMW service wizard.
//
// INSTRUCTIONS FOR REGISTRATION/USAGE
// -----------------------------------
// Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding 
// YourServiceUnitName to it. Eg.
// 
// uses ...,kbmMWServer,YourServiceUnitName;
// 
// Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance. Eg.
// 
// var
// sd:TkbmMWCustomServiceDefinition;
// ..
// sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);
// 
// Set the last parameter to true if this is the default service.
// 
?
{$I kbmMW.inc}
interface
uses
 SysUtils,
{$ifdef LEVEL6}
 Variants,
{$else}
 Forms,
{$endif}
 Classes,
 kbmMWSecurity,
 kbmMWServer,
 kbmMWServiceUtils,
 kbmMWGlobal,
 kbmMWADOX,DB, ADODB,kbmMemTable, kbmMemBinaryStreamFormat;
type
 TkbmMWSimpleService1 = class(TkbmMWSimpleService)
 private
 { Private declarations }
 protected
 { Protected declarations }
 //新增以下函數
 function ProcessRequest(const Func:string; const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; override;
 function PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual;
 function PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant; virtual;
 public
 { Public declarations }
{$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override;
 end;
implementation
uses kbmMWExceptions, unt_main, unt_dm;
{$R *.dfm}
// Service definitions.
//---------------------
{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetPrefServiceName:string;
begin
 Result:='demoservice';
end;
{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetVersion:string;
begin
 Result:='1.0';
end;
{$IFNDEF CPP}class{$ENDIF} function TkbmMWSimpleService1.GetFlags:TkbmMWServiceFlags;
begin
 Result:=[mwsfListed];
end;
function TkbmMWSimpleService1.ProcessRequest(const Func:string; const ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;
var
 AFunc:string;
begin
 AFunc:=UpperCase(Func);
 if AFunc='UPDATE' then // 關聯到PerformUpdate函數
 Result:=PerformUpdate(ClientIdent,Args)
 else
 if AFunc='SELECT' then // 關聯到PerformSelect 函數
 Result:=PerformSelect(ClientIdent,Args)
 else Result:=inherited ProcessRequest(Func,ClientIdent,Args);
end;
function TkbmMWSimpleService1.PerformUpdate(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;
var
 param: string;
 aQuery: TADOQuery;
 aconn: TkbmMWADOXConnection;
begin
 Result := 0;
 param :=args[0]; //取出參數
 aQuery := TADOQuery.Create(nil);
 //從數據庫連接池中取出可用鏈接
 aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000));
 if aconn = nil then
 begin
 kbmMWRaiseServerException('無可用的數據庫連接');
 Exit;
 end;
 aQuery.Connection := aconn.Database;
 aQuery.SQL.Text := 'update devinfo set dev_name=:param where id < 10';
 aQuery.Parameters.ParamByName('param').Value := param; //傳入參數
 try
 try
 aQuery.ExecSQL;
 Result := aQuery.RowsAffected;//返回影響條數
 except
 Result := -1; //錯誤時返回-1
 end;
 finally
 aconn.UnlockConnection;
 aQuery.Free;
 end;
end;
function TkbmMWSimpleService1.PerformSelect(ClientIdent:TkbmMWClientIdentity; const Args:array of Variant):Variant;
var
 param: string;
 aQuery: TADOQuery;
 aconn: TkbmMWADOXConnection;
 memTable: TkbmMemTable; //內存表類
 aStreamFormat: TkbmBinaryStreamFormat; //流格式類
begin
 Result := 0;
 param :=args[0]; //取出參數
 aQuery := TADOQuery.Create(nil);
 //從數據庫連接池中取出可用鏈接
 aconn := TkbmMWADOXConnection(DataModule1.kbmMWADOXConnectionPool1.GetBestConnection(True,0,nil,10000));
 if aconn = nil then
 begin
 kbmMWRaiseServerException('無可用的數據庫連接');
 Exit;
 end;
 aQuery.Connection := aconn.Database;
 aQuery.SQL.Text := 'select * from devinfo where dev_name=:param';
 aQuery.Parameters.ParamByName('param').Value := param; //傳入參數
 //初始化內存表
 memTable := TkbmMemTable.Create(nil);
 //初始化流格式
 aStreamFormat := TkbmBinaryStreamFormat.Create(nil);
 //內存表設置
 memTable.DefaultFormat := aStreamFormat;
 memTable.IndexFieldNames := '';
 memTable.SortFields := '';
 memTable.MasterSource := nil;
 try
 try
 aQuery.Open;
 Result := aQuery.RecordCount;//返回記錄條數
 //導入結果到流
 memTable.LoadFromDataSet(aQuery,[mtcpoStructure,mtcpoProperties]);
 //格式化流
 memTable.SaveToStreamViaFormat(ResultStream,aStreamFormat);
 except
 Result := -1; //錯誤時返回-1
 end;
 finally
 aconn.UnlockConnection;
 aQuery.Free;
 memTable.Free;
 aStreamFormat.Free;
 end;
end;
end.
第三個 頁面
?
unit unt_dm;
interface
uses
 SysUtils, Classes, kbmMWCustomConnectionPool, kbmMWCustomSQLMetaData,
 kbmMWMSSQLMetaData, DB, ADODB, kbmMWADOX;
type
 TDataModule1 = class(TDataModule)
 kbmMWADOXConnectionPool1: TkbmMWADOXConnectionPool;
 ADOConnection1: TADOConnection;
 kbmMWMSSQLMetaData1: TkbmMWMSSQLMetaData;
 kbmMWPooledSession1: TkbmMWPooledSession;
 private
 { Private declarations }
 public
 { Public declarations }
 end;
var
 DataModule1: TDataModule1;
implementation
{$R *.dfm}
end.
這些每加入一個頁面最好、F9 一下 看看錯在那?
如果有一些頁面時經常報錯的 加入
這樣服務器做好了...明天再發android 客戶端的
轉載于:https://www.cnblogs.com/-long/p/3188822.html
總結
以上是生活随笔為你收集整理的用delphi 做服务器,basic4android 实现三层数据交互的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux PAM 插件认证
- 下一篇: ubuntu12.10下arm-linu
