绑定到Repeater,出现IndexOutofRangeException或HttpException
ofei 2008-08-01 03:17:45 情形类似http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=137373&SiteID=1,请先查看
情况1:
从DAL返回SqlDataReader,填充实体类,绑定到Repeater,出现IndexOutofRangeException:xxx(某列名)
情况2:
从DAL返回DataTable,绑定到Repeater,出现HttpException: DataBinding:“System.Data.DataRowView”不包含名为“xxx”的属性(某列名)。
上述情况都偶发性的,因此排除列名没有被select出来的可能异常发生时,vs立即窗口中,均可获得相应的值,但绑定的时候就出错
网站上每个页面都可能发生
sql脚本或是文本或存储过程都有可能发生
sql脚本在查询分析器中执行很快,使用SqlProfiler检测也没发现异常情况,活动监视器里也没发现死锁
command.ExecuteReader(CommandBehavior.CloseConnection)返回的SqlDataReader,而且保证调用了SqlDataReader.Close()
调用SqlDataAdapter.Fill(DataTable)时没有手动打开和关闭连接
程序负载目前不高(尚未进行过压力测试),数据库数据也很少,最多几万条而已
主要发生在客户服务器上(通过vs2005发布到本地目录再上传到服务器)
服务器配置:xeon mp 2.2g, 8g ram, windows server 中文企业版+ sp2, sqlserver 2005英文版+sp2+sp2三个关键补丁,IIS6(期间也试过英文版的os,不过客户购买的软件就是这样的,因此也没)
使用nlog记录下来的异常信息样例如下:
2008-10-16 10:53:44.7031 ¦DEBUG ¦log ¦System.IndexOutOfRangeException: LinkID
在 System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
在 System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
在 WayGo.WebPurchase.SqlDBL.Portal.SqlLink.LoadFromReader(DbDataReader reader, LinkInfo info) 位置 D:\网询项目\WebPurchaseSolution\SqlDBL\Portal\SqlLink.generate.cs:行号 224
在 WayGo.WebPurchase.SqlDBL.Portal.SqlLink.LoadFromReader(DbDataReader reader) 位置 D:\网询项目\WebPurchaseSolution\SqlDBL\Portal\SqlLink.generate.cs:行号 247
在 WayGo.WebPurchase.SqlDBL.Portal.SqlLink.LoadByDisplayPositionID(Int32 displayPositionID) 位置 D:\网询项目\WebPurchaseSolution\SqlDBL\Portal\SqlLink.cs:行号 77
在 WayGo.WebPurchase.BLL.Portal.Link.LoadByDisplayPositionID(Int32 displayPositionID, QueryResult& result) 位置 D:\网询项目\WebPurchaseSolution\BLL\Portal\Link.cs:行号 37
(时间调过,不调也有出现。LinkID是Portal.Link表的主键,Portal.Link存放网站首页的友情链接;使用实体类绑定Repeater)
2008-09-30 19:34:20.5625 ¦DEBUG ¦log ¦System.Web.HttpException: DataBinding:“System.Data.DataRowView”不包含名为“SubsystemName”的属性。
在 System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName)
在 System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts)
在 System.Web.UI.DataBinder.Eval(Object container, String expression)
在 ASP.masterpages_management_master.__DataBind__control6(Object sender, EventArgs e) 位置 c:\Inetpub\wwwroot\MasterPages\Management.Master:行号 54
在 System.Web.UI.Control.OnDataBinding(EventArgs e)
在 System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
在 System.Web.UI.Control.DataBind()
在 System.Web.UI.Control.DataBindChildren()
在 System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
在 System.Web.UI.Control.DataBind()
在 System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem)
在 System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource)
在 System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e)
在 System.Web.UI.WebControls.Repeater.DataBind()
在 WayGo.WebPurchase.PortalSite.MasterPages.Management.BindSubsystems() 位置 D:\网询项目\WebPurchaseSolution\PortalSite\MasterPages\Management.Master.cs:行号 127
在 WayGo.WebPurchase.PortalSite.MasterPages.Management.Page_Load(Object sender, EventArgs e) 位置 D:\网询项目\WebPurchaseSolution\PortalSite\MasterPages\Management.Master.cs:行号 45
在 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
在 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
在 System.Web.UI.Control.OnLoad(EventArgs e)
在 System.Web.UI.Control.LoadRecursive()
在 System.Web.UI.Control.LoadRecursive()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
(时间调过,不调也有出现。SubsystemName是Users.Subsystem表的唯一键,Users.Subsystem存放用户菜单的子系统类型;使用DataTable绑定Repeater)
msdn论坛提到DataReader不要夸层传递,目前程序架构定了,修改工作量大,没做测试;以及不要将DataReader传递给静态方法,但我把相关的静态方法修改为实例方法,但程序还一样
如果DataTable也一样抛异常,因此觉得DataReader是不是传递给静态方法及跨层传递无关紧要