Flash AS2 .NET数据访问模型

    技术2022-05-11  63

     本文属张友邦(SpanZhang)原创,转载请注明出处。

    Flash AS2在使用.NET进行数据访问的时候很方便,如果进行一定程度的包装,可以使得这个模型更加清晰和易于使用。下面是我在开发一个WEB RIA应用的时候开发出来的一套访问模型。

    1、Flash端:1.1、EventObject.asimport mx.events.EventDispatcher;import mx.remoting.*;import mx.rpc.*;

    class span.EventObject { public var addEventListener:Function; public var removeEventListener:Function; private var dispatchEvent:Function;  public function EventObject() {  EventDispatcher.initialize(EventObject.prototype); }  private function dispatchDataEvent(strEventName:String, eventReturned:Object) {  var eventObj:Object = {type:strEventName, target:this, eventName:strEventName};    if (eventReturned.result != null) {   eventObj.eventParam  = eventReturned.result;   eventObj.success  = true;  }        if (eventReturned.fault != null) {   eventObj.eventParam  = eventReturned.fault.faultstring;   eventObj.success  = false;  }     dispatchEvent(eventObj); }  private function dispatchSimpleEvent(strEventName:String, objEventParam:Object) {  var eventObj:Object = {type:strEventName, target:this, eventParam:objEventParam};  dispatchEvent(eventObj); }}

    这个类是对Flash事件机制的进一步封装,以便简化实际使用中的调用程序。

    1.2、DataProxy.asimport mx.events.EventDispatcher;import mx.remoting.*;import mx.rpc.*;

    class span.DataProxy extends span.EventObject { private var dataService:Service; public function DataProxy() {  super();    var urlArray:Array = _root._url.split("/");  var strUrl:String = urlArray[2].toLowerCase();  dataService = new Service("http://" + strUrl + "/data/gateway.aspx", null, "data"); }  private function dummyFunction():Void{   }  private function invokeData(pendingCall:PendingCall, callbackFunction:String) {  if (callbackFunction == null || callbackFunction.length <= 0)   pendingCall.responder = new RelayResponder(this, "dummyFunction", "dummyFunction");  else   pendingCall.responder = new RelayResponder(this, callbackFunction, callbackFunction); }}

    这个类是一个基本的数据代理接口,它是配置.NET的gateway地址的唯一地方。

    1.3、HeartBeat.as/*

     Author: Span Time: 11/16, 2006 Description: This component is designed as singleton for global use.

    */

    import span.DataProxy;

    class pub.HeartBeat extends span.DataProxy{ private static var heartBeat:HeartBeat;  private var timerId:Number; private var isChecking:Boolean;  public static function instance():HeartBeat {  if (heartBeat == null) heartBeat = new HeartBeat;  return heartBeat; }  public function stopBeat():Void{  if (timerId > 0) {   clearInterval(timerId);   timerId = -1;

      }

     }  private function HeartBeat()  {  super();    isChecking = false;  doHeartBeat();  timerId = setInterval(this, "doHeartBeat", 10 * 1000); }  private function doHeartBeat() {  if (isChecking) return;  isChecking = true;    invokeData(dataService.pub_heartBeat(), "doHeartBeatReturned"); }

     private function doHeartBeatReturned(eventReturned:Object) {  if (eventReturned == null || eventReturned.result == undefined) {   dispatchSimpleEvent("heartBeatFailed");  }  else {   if (eventReturned.result == "1")    dispatchSimpleEvent("heartBeatSuccess");   else    dispatchSimpleEvent("heartBeatFailed");  }    isChecking = false; }}

    这个类是一个应用类,它是数据访问的实现类。

    2、.NET服务器端(C#)2.1、Public.csusing System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections;using System.ComponentModel;using System.Web;using System.Web.UI.WebControls;using System.Data.Common;using System.Text;using System.Web.SessionState;

    namespace System{ public enum NCENUM_LANG_TYPE //语言类型 {  zhcn = 0,  zhtw = 1,  en  = 2 }

     public enum NCENUM_FLASH_RESULT_TYPE {  STRING   = 0,  STRING_ARRAY = 1,  RECORDSET  = 2,  RECORDSET_ARRAY = 3 }

     public class Public {  public static void ExecFlashSql(ref FlashGateway.Flash flash, string strSql, NCENUM_FLASH_RESULT_TYPE retType)  {   if (flash == null) flash = new FlashGateway.Flash();

       flash.Result = null;

       DataSet ds = ncDB.ExecDataSet(strSql);   if (ds == null || ds.Tables.Count <= 0) return;

       switch (retType)   {    case NCENUM_FLASH_RESULT_TYPE.STRING:    {     if (ds.Tables[0].Rows.Count > 0)      flash.Result = ds.Tables[0].Rows[0][0].ToString();    }    break;

        case NCENUM_FLASH_RESULT_TYPE.STRING_ARRAY:    {     DataRow dr = ds.Tables[0].Rows[0];     int colLen = ds.Tables[0].Columns.Count;     string[] result = new string[colLen];     for (int i = 0; i < colLen; ++i)      result[i] = dr[i].ToString();

         flash.Result = result;    }    break;

        case NCENUM_FLASH_RESULT_TYPE.RECORDSET:    {     if (ds.Tables[0].Rows.Count > 0)      flash.Result = ds.Tables[0];    }    break;

        case NCENUM_FLASH_RESULT_TYPE.RECORDSET_ARRAY:    {     int tabLen = ds.Tables.Count;     DataTable[] result = new DataTable[tabLen];     for (int i = 0; i < tabLen; ++i)      result[i] = ds.Tables[i];

         flash.Result = result;    }    break;   }  } }}

    这个文件扩展了System命名空间,增加了Flash数据访问的相应支持。

    2.2、HeartBeat.aspx.csusing System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;

    namespace Project{ /// <summary> /// Summary description for HeartBeat. /// </summary> public class HeartBeat : System.Web.UI.Page {  protected FlashGateway.Flash flash = new FlashGateway.Flash();   private void Page_Load(object sender, System.EventArgs e)  {   Public.ExecFlashSql   (    ref flash,    "exec dbo.p_sm_heartBeat '" + Session.SessionID + "'",    NCENUM_FLASH_RESULT_TYPE.STRING   );  }

      #region Web Form Designer generated code  override protected void OnInit(EventArgs e)  {   //   // CODEGEN: This call is required by the ASP.NET Web Form Designer.   //   InitializeComponent();   base.OnInit(e);  }    /// <summary>  /// Required method for Designer support - do not modify  /// the contents of this method with the code editor.  /// </summary>  private void InitializeComponent()  {       this.Load += new System.EventHandler(this.Page_Load);  }  #endregion }}


    最新回复(0)