Flex通过FluorineFx与.Net交互,连接数据库返回到Flex的DataGrid中,DataGrid总是不能显示出数据,请高手赐教!!!

caonimadigepi 2010-10-28 05:52:05
.Net端ServiceLibrary.Sample.cs代码:

using System;
using System.Collections.Generic;
using System.Text;
using FluorineFx;
using System.Data;
using System.Data.SqlClient;

namespace ServiceLibrary
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}

public string Echo(string text)
{
return "Gateway echo: " + text;
}
public DataTable GetData()
{

SqlConnection conn = new SqlConnection(); //定义“SqlConnnection”类实例

//数据库连接字符串

conn.ConnectionString = "Data Source=.;Initial Catalog=Computer_lover_bbs;Integrated Security=True";

//定义“SqlCommand”实例,从“Notes”表中取数据

SqlCommand command = new SqlCommand("select UserName,TitleID,ContentID from Content", conn);

conn.Open();//打开连接

SqlDataAdapter da = new SqlDataAdapter(); //定义“SqlDataAdapter”类实例

//将“command”值传递给“SqlDataAdapter”的“SelectCommand”属性

da.SelectCommand = command;

DataSet ds = new DataSet(); //定义“DataSet”类实例

da.Fill(ds, "stars"); //取数据

return ds.Tables["stars"];

}
}
}

Flex端代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridListData;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;

[Bindable]
public var arr:ArrayCollection;
public function getdata(evt:ResultEvent):void{
arr=evt.result as ArrayCollection;
}
public function faultHandler(event:FaultEvent):void
{
Alert.show("Fault", event.fault.toString());
}
]]>
</mx:Script>
<mx:RemoteObject id="fluorineRemote" destination="fluorine" source="ServiceLibrary.Sample" showBusyCursor="true" fault="faultHandler(event)">
<mx:method name="GetData" result="getdata(event)"/>
</mx:RemoteObject>
<mx:Panel title="Fluorine">

<mx:DataGrid id="dg" dataProvider="{arr}">
<mx:columns>
<mx:DataGridColumn dataField="Body" headerText="主体"/>
<mx:DataGridColumn dataField="UserName" headerText="用户名"/>
<mx:DataGridColumn dataField="TitleID" headerText="编号"/>
</mx:columns>
</mx:DataGrid>

</mx:Panel>
</mx:Application>
运行后总是显示不出数据库中数据,只显示出DataGrid中的标题栏。
...全文
660 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
caonimadigepi 2011-01-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tangzhaoyong 的回复:]
我觉得你还是没有找到真正的原因
[/Quote]
请赐教!
tangzhaoyong 2010-12-30
  • 打赏
  • 举报
回复
我觉得你还是没有找到真正的原因
caonimadigepi 2010-11-05
  • 打赏
  • 举报
回复
这个问题,首先感谢大家提供的一些帮助,在你们的启发下,我自己已经解决了。至于这其中的原因是什么,我也不知道,我也不知道怎么的稀里糊涂的就这样解决了:
1、本人当前的系统是在Windows 7下,系统自带的是IIS 7。在用的过程中有一个很奇怪的现象:当我在IIS中预先建好虚拟目录,然后在Viual Studio 2008以Http的方式建立FluotineFx ASP.NET Web Site时,运行Console.aspx(这个可以用来测试配置是否正确)时,却报出了找不到当前网站目录的错误;然而,当我不在IIS中建虚拟目录,而直接以文件系统的方式建立网站时,再次运行Console.aspx时,成功,经过测试Echo,是正确的。
2、接下来,我只有照上面所说的第二种方式建好了.Net端网站,然后再在IIS 7中建好虚拟目录(这个虚拟目录是必须的,因为在Flex端配置时必须配置为Http的方式)。在Flex中也配置好后,运行我上面贴出的代码,就出现了我上面所说的问题,就是任凭你怎么在<Remoteobject></Remoteobject>中故意更改成错误的,它都不会报错,这个就很奇怪了,又让我联想到1中的问题,我开始怀疑是IIS中的配置问题了。
3、然后,我在IIS 7中看了一下它的帮助文档,了解了一下应用程序池,然后抱着试一试的心态做了一下设置:我之前网站的应用程序池选择的都是DefaultAppPool,我的IIS 7中.Net版本设置的是2.0,我就想会不会是这个版本是以前的版本,(那个版本设置只有2.0和4.0两个选择,FluorineFx目前还不支持.Net 4.0,所以我没选4.0),我又想到IIS 7中有一个Classic .NET AppPool这样的应用程序池,我就想,它会不会是专门用来为以前的版本来服务的呢?于是我便试着将它改为Classic .NET AppPool的应用程序池了。再次以Http的方式配置.Net端时,运行Console.aspx,OK!,成功了。
4、然后配置好Flex端,再次运行我的代码,出现一个错误提示框,上面大致说的是找不到http://localhost/Gateway.aspx。这一次,至少它有反应了,我很高兴,至少它已经告诉我是通信出现RemoteObject通信出现问题了。这个问题,我在网上搜了一下便找出解决方法了,我直接在services-config.xml文件的<endpoint uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx"这个地方,将引号里面的内容,直接改成我在Visual Studio 2008运行Gateway.aspx这个页面时浏览器中显示的地址,就这样,通信解决了,接下来又出现一个问题...
5、应该就是11楼的那方面的问题了,弹出ActionScript的调试错误,我好像看懂了,说的是我在.NET那边获取的数据格式不正确。然后我看了一下FluorineFx中自带的一些范例(这里面才是最权威的,好东西~~),参照上面说的,我在Flex这边建立一个Content.as类,文件直接建在Flex端项目的根目录下,代码如下:
package
{
[RemoteClass(alias="Flex.Content")]
public class Content
{
public function Content()
{
public var Body:text;
public var UserName:string;
public var TitleID:int;
}
}
}
然后在.Net端GetData前加上这样的一句:[DataTableType("Flex.Content")]。再次运行,OK!,数据可以显示在DataGrid中了!!!
6、虽然这样稀里糊涂的给蒙出来了,但还是希望高手能帮我解释一下其中真正的原因,谢谢!!!
不会飞的鱼 2010-10-31
  • 打赏
  • 举报
回复
或者干脆利用.NET的扩展方法,把DataTable直接转换为IList也是个不错的选择

/// <summary>
/// DataTable 转换为List 集合
/// </summary>
/// <typeparam name="TResult">类型</typeparam>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class, new()
{
//创建一个属性的列表
var prlist = new List<PropertyInfo>();
//获取TResult的类型实例 反射的入口
Type t = typeof(TResult);
//获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
Array.ForEach(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
//创建返回的集合
var oblist = new List<TResult>();

foreach (DataRow row in dt.Rows)
{
//创建TResult的实例
var ob = new TResult();
//找到对应的数据 并赋值
prlist.ForEach(p =>
{
if (row[p.Name] != DBNull.Value)
p.SetValue(ob, row[p.Name], null);
});
//放入到返回的集合中.
oblist.Add(ob);
}
return oblist;
}
不会飞的鱼 2010-10-31
  • 打赏
  • 举报
回复
返回DataTable时最好映射成VO,如:
[DataTableType("FlexRemoteObjectSample.PhoneVO")]
public DataTable GetDataTable()
{
DataSet dataSet = new DataSet("mydataset");
DataTable dataTable = dataSet.Tables.Add("phones");
dataTable.Columns.Add( "number", typeof(string) );
dataTable.Rows.Add( new object[] {"123456"} );
dataTable.Rows.Add( new object[] {"456789"} );
return dataTable;
}
请参考
http://www.fluorinefx.com/docs/fluorine/rpcdata.html
880820 2010-10-31
  • 打赏
  • 举报
回复
数据库数据是不是有问题!
caonimadigepi 2010-10-29
  • 打赏
  • 举报
回复
突然发现:
<mx:RemoteObject id="fluorineRemote" destination="fluorine" source="ServiceLibrary.Sample" showBusyCursor="true" fault="faultHandler(event)">
<mx:method name="GetData" result="getdata(event)"/>
</mx:RemoteObject>
这一段根本没起到什么作用,无论我怎么将destination的值改成一个错误的值,fault="faultHandler(event)"都不会弹出错误的对话框。给我的感觉是,这一整段都好像没写进去。这又是什么原因?
CCjian 2010-10-29
  • 打赏
  • 举报
回复
1,先直接看evt.result有没有数据出来,

2,注意类型映射,返回数据的

3,RemoteObject 结果默认是OBJECT的.
caonimadigepi 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leemiki 的回复:]
引用 4 楼 caonimadigepi 的回复:
加了Alert.show(arr.length+"");//测试获取数据
这句后,弹不出对话框,这句没有效果,难道程序根本没有运行进去??

我1楼写的你加进去了吧!

说明前后台交互失败,基本上是配置文件配错!
[/Quote]
你1楼写的也加进去了,配置文件配错,怎么解决?
passself 2010-10-29
  • 打赏
  • 举报
回复
s说明你的数据源没有问题,只是得不到相应的值,这个应该是用的属性有错误
leemiki 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 caonimadigepi 的回复:]
加了Alert.show(arr.length+"");//测试获取数据
这句后,弹不出对话框,这句没有效果,难道程序根本没有运行进去??
[/Quote]
我1楼写的你加进去了吧!

说明前后台交互失败,基本上是配置文件配错!

caonimadigepi 2010-10-28
  • 打赏
  • 举报
回复
加了Alert.show(arr.length+"");//测试获取数据
这句后,弹不出对话框,这句没有效果,难道程序根本没有运行进去??
leemiki 2010-10-28
  • 打赏
  • 举报
回复
上面不行??那我怀疑你的代码是前后台通信没有成功

C#我不搞的,也没办法测

你按照下面步骤测试应该问题很快就能解决

1.先测后台数据有没有查出来
2.测Flex端
public function getdata(evt:ResultEvent):void{
arr=evt.result as ArrayCollection;
Alert.show(arr.length+"");//测试获取数据
}
如果获取数据错误往下
3.查看Flex与后台通信的配置文件是否正确

几条路走通了,你的问题也就解决了




caonimadigepi 2010-10-28
  • 打赏
  • 举报
回复
不是啊,还是不行
leemiki 2010-10-28
  • 打赏
  • 举报
回复
你Flex都没调后台方法,getdata结果集函数怎么会执行,又怎么显示??

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" initialize="init()">

private function init():void{
fluorineRemote.GetData();
}

4,328

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧