class FDO
{
//版本和作者信息
#include "FDO_include.as"
//指定FDO_SERVER文件夹所在的目录
private var sev_url:String;
//指定FDO_SERVER的名称,默认名称为:FDO_SERVER
private var sev_name:String;
//connection 状态描述,一个connection 实例只能和一个command实例绑定
//-1:connection创建错误。
//0:空闲且未与command绑定
//1:空闲但已经绑定到command
//2: 正在与
服务器进行通信
public var state:Number = -1;
private var rst_
XML:
XML;
private var error:String;
private var intervalID:Number;
private var percent:Number;
private var pct:Function;
//为Connection 添加两个事件
public var onLoading:Function;
public var onData:Function;
public var onResult:Function;
//构造函数要求传入FDO
服务器所在的url位置和FDO
服务器的名称
function FDO (url:String, name:String)
{
if (url == null or url == undefined)
{
throw new Error ("Error:Connection.Constructor url required.");
return;
}
if (name == null or name == undefined)
{
throw new Error ("Error:Connection.Constructor name required.");
return;
}
System.useCodepage = true;
var me:FDO = this;
error = "";
percent = 0;
intervalID = 0;
state = 0;
sev_url = url;
sev_name = name;
rst_
XML.ignoreWhite = true;
rst_
XML = new
XML ();
rst_
XML.onLoad = on
XML;
function on
XML (suc)
{
var err_
XML:
XML;
var root:
XMLNode;
clearInterval (me.intervalID);
delete me.intervalID;
if (suc)
{
me.percent = 100;
me.state = 1;
//当数据下载完成后最后调用一次
err_
XML = this;
root = err_
XML.firstChild;
//trace ("root.nodeName=" + root.nodeName + (root.nodeName == "err"));
if (root.nodeName == "err")
{
me.error = "ServerError:[type:" + root.attributes.type + ";info:" + root.attributes.info + ";discription:" + root.attributes.discription + "]";
me.onLoading (me.percent);
throw new Error (me.error);
return;
}
else if (root.nodeName == "result")
{
me.error ="";
me.onLoading (me.percent);
me.onResult(this.firstChild.attributes.info,me.state);
return;
}
else
{
//获取服务端返回的请求数据
trace ("Success[FDO]:ServerData Loaded....");
//当数据被成功加载后,调用FDO的onData方法,在外部可以重写该事件
rst_
XML = this;
//me.state = 1;
me.error = "";
//置Connection状态为 数据等待被传递
me.onLoading (me.percent);
me.onData (this, me.state);
}
}
else
{
me.error = "NetworkError:[Network or ServerError,please check the Network]";
me.onLoading (0);
throw new Error (me.error);
}
}
//检查进度
function checkProgress (
XMLObj:
XML)
{
var bytesLoaded:Number =
XMLObj.getBytesLoaded ();
var bytesTotal:Number =
XMLObj.getBytesTotal ();
me.percent = Math.floor ((bytesLoaded / bytesTotal) * 100);
if (isNaN (me.percent))
{
me.percent = 0;
}
//持续调用
me.onLoading (me.percent);
if (me.percent >= 100)
{
clearInterval (me.intervalID);
delete me.intervalID;
me.state = 1;
}
}
//checkProcess 引用
pct = checkProgress;
//修改
XML模型,使抛出异常
XML.prototype.onData = function (src:String)
{
try
{
if (src == undefined)
{
this.onLoad (false);
}
else
{
this.parse
XML (src);
this.loaded = true;
this.onLoad (true);
}
}
catch (ex)
{
trace (ex);
}
};
}
//与服务端通信,执行
数据库命令,并返回结果。
//参数:eData:发送到服务端的数据;eType:执行的操作类型。
public function execute (cmd_
XML:
XML)
{
if (state != 1)
{
throw new Error ("Error FDO.execute Connection is busy or Connection Creation error.state=" + state);
return null;
}
if (cmd_
XML == null or cmd_
XML == undefined)
{
throw new Error ("Error:FDO.execute no command.");
return null;
}
//锁定Connection 到通信状态
state = 2;
//清零加载量和错误信息
percent = 0;
error = "";
var url:String = cmd_
XML.firstChild.attributes.url;
intervalID = setInterval (pct, 50, rst_
XML);
//rst_
XML;
cmd_
XML.sendAndLoad (sev_url + "/" + sev_name + "/FDO/" + url + "?LeeFJ=Leaf", rst_
XML);
return null;
}
}
因为我觉得FDO类设计比较难,也是核心,所以我把它贴出来大家看看,至于其他的类,就相对比较简单了。
在测试fla文件的第一帧代码:
var myfdo:FDO = new FDO ("http://10.1.51.82:88/FDO", "FDO_SERVER");
//var myfdo:FDO = new FDO ("http://127.0.0.1/FDO", "FDO_SERVER");
var cmd:Command = new Command (myfdo);
//cmd.executeQuery("give me money",);
cmd.Query ("get top 150", ["0"],"query.
ASP");
var rs:RecordSet;
//重写FDO的 onData事件
myfdo.onData = function (it, state)
{
//trace(it);
rs = new RecordSet (it);
//trace ("len=" + rs.len ());
//trace ("line no="+rs.getLine ());
//trace ("islast="+rs.isLast ());
//trace ("isfirst="+rs.isFirst ());
//
//rs.moveLast();
//rs.moveFirst();
//rs.moveLine(5);
//trace(rs.get("name"));
t_txt.text += "Data Loaded..." + state;
//cmd.Addnew("adduser",rcd,"addnew.
ASP")
//cmd.Update("update password",rcd2,["LeeFJ"],"update.
ASP")
cmd.Delete ("delete by name", ["LeeFJ"],"delete.
ASP");
};
//重写FDO的 onLoading 事件
myfdo.onLoading = function (pct)
{
t_txt.text += pct + "%,";
};
myfdo.onResult=function(info,state)
{
trace("Result:"+info);
};
var rcd:Record=new Record();
rcd.set("name","LeeFJ");
rcd.set("password","1234567");
rcd.set("email","tianmazhixing@eyou.com");
rcd.set("qq","123456789");
rcd.set("role","秘密");
rcd.set("sex","boy");
//rcd.set("age","19");
rcd.set("XML","我是一个胆小鬼!");
var rcd2:Record=new Record();
rcd2.set("password","666666");
rcd2.set("role","流氓");