14.5 Flash查询和添加数据库数据

在Flash与数据库通讯的实际应用中,如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程,而注册则是ASP将Flash提供的数据写入数据库的过程。

1.启动Access2003,新建一名为“userInfo.mdb”的数据库,并在该数据库中新建一名为“userInfoTable”的表,该表中含有三个字段:“userName”、“passWord”和“level”,分别表示“用户名”、“密码”和“等级”,字段类型均为“文本”。

2.在“userInfoTable”表中输入数据。如图14-5-1所示。数据输入完毕后,关闭数据库,并将其保存到IIS主目录(D盘下的“wwwroot”文件夹)下的“loginAndRegiste”文件夹内。

图14-5-1 “userInfoTable”表中的数据

3.以独占方式重新打开刚刚建立的数据库“userInfo.mdb”,为该数据库设置密码,如“123”,设置完毕后退出并关闭Access2003。

4.在该文件夹下新建一名为“login.asp”的文件,并输入以下代码后保存:

<%

‘获取从Flash提交的数据

tmpUserName=Request(“userName”)

tmpPassWord=Request(“passWord”)

‘SQL语句中的用户名和密码需要用单引号括起来

tmpUserName=”‘”&tmpUserName&”‘”

tmpPassWord=”‘”&tmpPassWord&”‘”

‘创建Connection对象

Set conn =Server.CreateObject(“Adodb.Connection”)

‘设置驱动

tmpPD=”Provider=Microsoft.Jet.OLEDB.4.0″

‘指定数据库的路径

tmpDS=”Data Source=”&Server.MapPath(“userInfo.mdb”)

‘指定数据库的密码

tmpPW=”Jet OLEDB:Database Password=123″

‘构造打开字符串

tmpSTR=tmpPD&”;”&tmpDS&”;”&tmpPW

‘利用Connection对象的Open方法打开数据库

conn.Open tmpSTR

‘建立库连接

Set rs = Server.CreateObject(“Adodb.Recordset”)

‘SQL语句,从数据表userInfoTable中查询与Flash提交的用户名和密码一致的记录

sql = “select * from userInfoTable where userName=”&tmpUserName&” and passWord=”&tmpPassWord

‘打开从库中读出的记录集

rs.Open sql, conn, 1, 3

‘While 循环语句,如果有符合条件的记录就输出

While Not rs.EOF

‘从表中读取userName、passWord和level列的值,并将其赋予三个变量

userName = rs(“userName”)

passWord = rs(“passWord”)

level = rs(“level”)

‘将获取的值输出并用”#”隔开

response.Write userName

response.Write “#”

response.Write passWord

response.Write “#”

response.Write level

‘转到下一条记录前用”###”隔开,以便在Flash中处理

response.Write “###”

‘到下一条记录

rs.MoveNext

Wend

‘利用Connection对象的Close方法关闭连接

rs.Close

‘将Connection对象从内存中删除,以释放资源

Set rs = Nothing

Set conn = Nothing

%>

5.在该文件夹下再建一名为“registe.asp”的文件,输入以下代码后保存:

<%

‘获取从Flash提交的数据

tmpUserName=Request(“userName”)

tmpPassWord=Request(“passWord”)

‘SQL语句中的用户名和密码需要用单引号括起来

tmpUserNameStr=”‘”&tmpUserName&”‘”

‘创建Connection对象

Set conn =Server.CreateObject(“Adodb.Connection”)

‘设置驱动

tmpPD=”Provider=Microsoft.Jet.OLEDB.4.0″

‘指定数据库的路径

tmpDS=”Data Source=”&Server.MapPath(“userInfo.mdb”)

‘指定数据库的密码

tmpPW=”Jet OLEDB:Database Password=123″

‘构造打开字符串

tmpSTR=tmpPD&”;”&tmpDS&”;”&tmpPW

‘利用Connection对象的Open方法打开数据库

conn.Open tmpSTR

‘建立库连接

Set rs = Server.CreateObject(“Adodb.Recordset”)

‘SQL语句,从数据表userInfoTable中查询是否有跟Flash提交的用户名相同的记录,如果有则不允许重复注册

sql = “select * from userInfoTable where userName=”&tmpUserNameStr

‘打开从库中读出的记录集

rs.Open sql, conn, 1, 3

‘if语句,如果没有该用户名记录,则允许添加数据

if rs.eof and rs.bof then

rs.addnew

rs(“userName”) =tmpUserName

rs(“passWord”)=tmpPassWord

rs(“level”) =1

rs.update

‘返回注册成功的信息

response.write “true”

else

‘返回注册失败的信息

response.write “false”

end if

‘利用Connection对象的Close方法关闭连接

rs.Close

‘将Connection对象从内存中删除,以释放资源

Set rs = Nothing

Set conn = Nothing

%>

6.打开Flash,新建一名为“loginAndRegiste.fla”的Flash文档,并将其保存到IIS主目录(D盘下的“wwwroot”文件夹)下的“loginAndRegiste”文件夹。

7.新建一名为“loginAndRegiste.as”的Flash脚本文档,同样保存到“D:\wwwroot\ loginAndRegiste”下,使其与上面的“loginAndRegiste.fla”、“login.asp”、“registe.asp”和“userInfo.mdb”在同一文件夹下。

8.切换到“loginAndRegiste.fla”文档,选择【Ctrl+F7】组合键打开【Components】面板,展开【User Interface】树形菜单,分别拖动一个DataGrid组件和一个Button组件到场景中,然后将其删除。按下【Ctrl+L】组合键打开【Library】面板查看,确保DataGrid组件和Button组件已存在于库中。在“loginAndRegiste.fla”的属性面板中设置其【Document class】为“loginAndRegiste”,然后在“loginAndRegiste.as”脚本文档中输入下列代码并保存:

package {

//导入文件运行所需的类

import flash.display.*;

import flash.text.*;

import flash.net.*;

import flash.events.*;

import flash.errors.*;

import flash.system.*;

//导入Button组件

import fl.controls.Button;

//导入DataGrid组件

import fl.controls.DataGrid;

//导入DataGridColumn类

import fl.controls.dataGridClasses.DataGridColumn;

//导入DataProvider类

import fl.data.DataProvider;

public class loginAndRegiste extends Sprite {

//定义输入文本框

private var userNameInputTxtFld:TextField;

private var passWordInputTxtFld:TextField;

//定义用户名和密码Label

private var userNameLabel:TextField;

private var passWordLabel:TextField;

//定义两个变量,用以接收用户名和密码

private var userName:String;

private var passWord:String;

//定义显示返回信息的文本框

private var returnInfoTxt:TextField;

//定义临时字符串接收返回数据

private var tmpString:String;

//定义临时数组接收返回数据

private var tmpArray:Array;

//定义临时字符串

private var tmpName:String;

private var tmpPassWord:String;

private var tmpLevel:String;

//定义登录按钮和注册按钮

private var loginBtn:Button;

private var registeBtn:Button;

//定义DataGrid以显示用户信息

private var myDataGrid:DataGrid;

//定义ASP文件路径

private var aspPath:String;

//定义URLRequest和URLLoader对象

private var aspRequest:URLRequest;

private var loginLoader:URLLoader;

private var registeLoader:URLLoader;

//构造函数

public function loginAndRegiste() {

init();

}

//在场景中添加文本框

private function init() {

//设置编码,不然会显示乱码

System.useCodePage=true;

//用户名和密码输入框

userNameInputTxtFld= createTextField(200, 140, 100, 20);

passWordInputTxtFld= createTextField(200, 160, 100, 20);

userNameInputTxtFld.type = TextFieldType.INPUT;

passWordInputTxtFld.type = TextFieldType.INPUT;

userNameInputTxtFld.border = true;

passWordInputTxtFld.border = true;

passWordInputTxtFld.displayAsPassword=true;

//用户名和密码Label

userNameLabel=createTextField(150, 140, 50, 20);

passWordLabel=createTextField(150, 160, 50, 20);

userNameLabel.text=”用户名:”;

passWordLabel.text=”密 码:”;

//提示信息

returnInfoTxt= createTextField(200,190, 150, 20);

returnInfoTxt.type = TextFieldType.DYNAMIC;

returnInfoTxt.border=false;

returnInfoTxt.text=”请输入用户名和密码…”;

//添加登录按钮

loginBtn=new Button();

loginBtn.move(310,140);

loginBtn.setSize(50,20);

loginBtn.label=”登录”;

//当单击计算按钮时将数据提交给ASP进行计算

loginBtn.addEventListener(MouseEvent.CLICK,login);

addChild(loginBtn);

//添加注册按钮

registeBtn=new Button();

registeBtn.move(310,160);

registeBtn.setSize(50,20);

registeBtn.label=”注册”;

//当单击计算按钮时将数据提交给ASP进行计算

registeBtn.addEventListener(MouseEvent.CLICK,registe);

addChild(registeBtn);

}

//登录模块

private function login(event:Event):void {

userName=userNameInputTxtFld.text;

passWord=passWordInputTxtFld.text;

if (userName!=””&&passWord!=””) {

aspPath=”http://127.0.0.1/loginAndRegiste/login.asp” />

aspRequest=new URLRequest(aspPath);

loginLoader=new URLLoader();

loginLoader.addEventListener(Event.COMPLETE,loginLoadComplete);

loginLoader.addEventListener(IOErrorEvent.IO_ERROR,loginLoadError);

try {

loginLoader.load(aspRequest);

} catch (error:Error) {

returnInfoTxt.text=”加载ASP文件失败…”;

}

} else {

returnInfoTxt.text=”请检查您的用户名和密码…”;

}

}

//注册模块

private function registe(event:Event):void {

userName=userNameInputTxtFld.text;

passWord=passWordInputTxtFld.text;

if (userName!=””&&passWord!=””) {

aspPath=”http://127.0.0.1/loginAndRegiste/registe.asp?userName=”+userName+”&passWord=”+passWord+”&randomNum=”+Math.random();

aspRequest=new URLRequest(aspPath);

registeLoader=new URLLoader();

registeLoader.addEventListener(Event.COMPLETE,registeLoadComplete);

registeLoader.addEventListener(IOErrorEvent.IO_ERROR,registeLoadError);

try {

registeLoader.load(aspRequest);

} catch (error:Error) {

returnInfoTxt.text=”加载ASP文件失败…”;

}

} else {

returnInfoTxt.text=”请检查您的用户名和密码…”;

}

}

//登录结束时的处理

private function loginLoadComplete(event:Event):void {

tmpString=event.target.data;

if (tmpString!=””) {

returnInfoTxt.text = “登录成功…”;

tmpArray=new Array();

tmpArray=tmpString.split(“###”);

tmpArray.pop();

//添加DataProvider

var tmpDP:DataProvider = new DataProvider();

for (var i=0; i<tmpArray.length; i++) {

tmpName=tmpArray[i].split(“#”)[0];

tmpPassWord=tmpArray[i].split(“#”)[1];

tmpLevel=tmpArray[i].split(“#”)[2];

tmpDP.addItem({姓名:tmpName,密码:tmpPassWord,等级:tmpLevel});

}

var nameColumn:DataGridColumn = new DataGridColumn(“姓名”);

var passWordColumn:DataGridColumn = new DataGridColumn(“密码”);

var levelColumn:DataGridColumn = new DataGridColumn(“等级”);

//添加DataGrid组件

myDataGrid=new DataGrid();

myDataGrid.addColumn(nameColumn);

myDataGrid.addColumn(passWordColumn);

myDataGrid.addColumn(levelColumn);

myDataGrid.move(150, 220);

myDataGrid.setSize(210, 45);

myDataGrid.dataProvider=tmpDP;

addChild(myDataGrid);

} else {

returnInfoTxt.text = “登录失败…”;

}

}

//无法登录时的处理

private function loginLoadError(event:IOErrorEvent):void {

returnInfoTxt.text=”加载ASP文件失败…”;

}

//注册结束时的处理

private function registeLoadComplete(event:Event):void {

tmpString=event.target.data;

if (tmpString==”true”) {

returnInfoTxt.text = “注册成功…”;

} else {

returnInfoTxt.text = “注册失败…”;

}

}

//无法注册时的处理

private function registeLoadError(event:IOErrorEvent):void {

returnInfoTxt.text=”加载ASP文件失败…”;

}

//生成文本框函数

private function createTextField(x:Number, y:Number, width:Number, height:Number):TextField {

var tmpTxtFld:TextField = new TextField();

tmpTxtFld.x = x;

tmpTxtFld.y = y;

tmpTxtFld.width = width;

tmpTxtFld.height = height;

addChild(tmpTxtFld);

return tmpTxtFld;

}

}

}

9.按下【Ctrl+Enter】组合键,在“loginAndRegiste.swf”窗口中的用户名和密码输入框中输入用户名密码,单击【登录】按钮,如果用户名和密码正确,则给出该用户的其它信息,并提示“登录成功…”,如果用户名或密码错误,则提示“登录失败…”。如图14-5-2所示是登录成功时的状态。

图14-5-2登录成功

10.在“loginAndRegiste.swf”窗口中的用户名和密码输入框中输入用户名密码,单击【注册】按钮,如果数据库中没有该用户信息,则将该用户信息添加到数据,并给出“注册成功…”的提示,否则,将给出“注册失败…”的提示。如图14-5-3所示是注册成功时的状态。

图14-5-3注册成功

以上给出的注册和登录例子只是为了说明Flash如何查询和添加数据库中的数据,在实际应用中,用户注册成功后,可以跳到登录页提示用户登录,用户登录成功后,可以根据从数据库中获取的数据分配给用户相应的权限,用户根据相应的权限进行相关的操作,如:进入聊天室聊天、发帖回帖等。

Flash通过ASP对数据库进行的操作除了以上介绍的读取、修改、查询和添加以外,还有删除、批更新等其它操作,其原理大同小异,其中的关键之处就在于如何构造SQL语句,把符合条件的语句检索出来。当然,也可以在检索所有数据库记录的过程中直接使用条件语句进行判断,但效率会比直接使用SQL语句低许多。

在搞清楚Flash与数据库之间的基本通讯原理之后,学习的重点就可以转移到ASP与数据库的通讯及如何在Flash中灵活处理返回的数据上,处理好这两点,开发实用的RIA应用程序将非常轻松。