Flash AS2 .NET数据访问模型

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

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

1、Flash端:
1.1、EventObject.as
import 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.as
import 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
{
privatestatic 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.cs
using 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.cs
using 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
}
}

你可能感兴趣的:(.net,UI,Web,Flash,asp.net)