Flex连接数据库(httpservice、asp.net、X

Flex连接数据库(httpservice、asp.net、XML)
众所周知,Flex是不能直接与数据库相连接的,Flex中提供了三种方式:HttpService,WebService和RemoteObject。后两者没研究过,不会,HttpService既可以直接获取XML中的数据,还可以通过JSP,ASP(asp.net)以及PHP读取数据库中的数据,这里主要记录Flex用HttpService通过asp.net读取并连接数据库。
本文的流程大概是这样:通过asp.net先连接数据库(sql server 2005express),然后生成xml,再通过Flex的httpservice调用asp.net中生成的xml代码。用到的相关工具或技术包括Flex、asp.net(vs)、sqlserver 2005 express、XML、HttpService。
一、先通过asp.net访问数据库,从数据库中读取数据,再生出XML文件。
①在asp.net中新建一个空的Default.aspx
将下面一段代码删除
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1"runat="server">
<div>
</div>
</form>
</body>
</html>
只保留第一行代码
<%@ Page Language="C#" CodeFile="Default.aspx.cs"Inherits="Default" %>
②再编写Default.aspx.cs这个文件
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Data.SqlClient;
using System.Xml;
public partial class Default :System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
//定义一个查询语句
//auto为XML模式(包括RAW、AUTO、EXPLICIT三种)
//XMLDATA,指定应返回XML-Data架构。文档的架构被预先设计为内嵌式架构。
//elements,列作为子元素返回。
string sql = "SELECT * FROM school FOR XMLauto,XMLDATA,elements";
SqlConnection conn = newSqlConnection("Server=(local)\\SQLEXPRESS;uid=sa;pwd=123456;Database=student");//连接本地数据库
SqlCommand cmd = new SqlCommand(sql,conn);//从数据库中查找数据
conn.Open();//打开数据库
XmlReader objXmlReader =cmd.ExecuteXmlReader();//定义一个对XML操作的读取器
DataSet ds = newDataSet();//定义一个数据集
ds.ReadXml(objXmlReader,XmlReadMode.Fragment);//将XML架构和数据读入数据集
ds.WriteXml(Server.MapPath("XML.xml"));//将上述数据集中的数据写入XML.xml,.xml不存在会自动生出,与Default.aspx同一目录下
conn.Close();//关闭数据库
StreamReader sr = newStreamReader(Server.MapPath("XML.xml"));//定义sr,以数据流的方式读取数据
Response.Clear();
//指定好输出到客户端内容的编码方式
Response.Charset = "gb2312";
Response.ContentType = "test/xml";
//Response.ContentEncoding =System.Text.Encoding.GetEncoding("gb2312");
Response.Write(sr.ReadToEnd());//将sr中数据全部读取出来输出到客户端
}
}
对①中,如果不删除后面代码,会产生错误“Prolog外部不能有DOCTYPE声明”,这是因为在CS文件中指定的Response.ContentType="text/xml";会与标签<!DOCTYPE>相矛盾。如果只把标签<!DOCTYPE>中的内容删掉,再运行页面,又会出现错误“XML文档只能有一个顶层元素。”,这是因为通过页面输出的XML内容都会有一个顶层元素<?xmlversion="1.0" encoding="gb2312" ?>。因为页面类型被指定为xml,xml文档只能有一个顶层元素。所以要把页面的设计文件(.aspx)文件中的标签全部删掉,只留下
<%@ Page Language="C#" CodeFile="test.aspx.cs" Inherits="test"%>
这一行。不难看出,这行是服务端标签,不会发送到客户端。
对②中,数据库名为student,内含一张school表,如下图:
运行页面,效果如下:



二、通过Flex的HttpService调用asp.net中生成的xml代码
Flex端代码(新建工程DataLink),在DataLink.mxml中:
<?xml version="1.0"encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel x="10" y="10"width="475" height="400" layout="absolute"title="学生信息">
<mx:DataGridx="20" y="20" id="dgPosts" width="400"dataProvider="{feedRequest.lastResult.Schema1.school}">
<mx:columns>
<mx:DataGridColumnheaderText="学号" dataField="XueHao"/>
<mx:DataGridColumnheaderText="姓名" dataField="Name"/>
<mx:DataGridColumnheaderText="年龄" dataField="Age"/>
</mx:columns>
</mx:DataGrid>
<mx:ButtonfontSize="12" x="185" y="186" label="填充"click="feedRequest.send();"/>
</mx:Panel>
<mx:HTTPService id="feedRequest"url="http://localhost:10860/WebSite2/Default.aspx"useProxy="false"/>
</mx:Application>
运行界面如下(此时点击“填充”按钮没有任何效果):



其中标签<mx:HTTPService>中的url,就是上面asp.net中Default.aspx运行时的网址。
三、整合一、二
将DataLink工程下“bin-debug”文件夹下的AC_OETags.js、DataLink.html、DataLink.swf、playerProductInstall.swf四个文件(编译后的),复制到Default.aspx所处的文件夹中。再次运行DataLink.html,点击“填充”按钮,界面如下:



至此,Flex连接数据库的操作已全部完工,本文一部分内容参考网上,在此记录下来,以备不时之需。
PS:在“一”中的Default.aspx.cs下,这里还有另外一种写法,特此记录:
protected override void Render(HtmlTextWriterwriter)
{
using (SqlConnection con = newSqlConnection("Server=(local)\\SQLEXPRESS;uid=sa;pwd=123456;Database=student"))
{
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROMschool",con);
DataTable dt = new DataTable();
adapter.Fill(dt);
dt.TableName = "aaa";
dt.WriteXml("C:\\try.xml");
StreamReader sr = new StreamReader("C:\\try.xml");
Response.Clear();
Response.ContentType = "test/xml";
writer.Write(sr.ReadToEnd());
}
}
Tags: 

延伸阅读

最新评论

发表评论