我有一个ASP.NET页面,其中包含一个Gridview
。
我正在尝试将IDataReader
对象绑定到网格。这个IDataReader
对象是通过调用更多的代码层(实际上是形成控制器层和数据库层的其他.ent项目dll)来分配的,然后最终被绑定到我的网格。
在gridview1.Datasource = dr
(dr是我的IDataReader),我看不出有任何问题。
但在gridview1.Databind行,我得到了一个异常,异常对象中的详细信息如下:
{"程序集"System.Data,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"中的类型"System.Data.Common.DbEnumerator"未标记为可序列化。"}
我不确定申请中出了什么问题。有什么想法或意见吗?
编辑1
添加堆栈跟踪异常:
服务器堆栈跟踪:位于System.Runtime.Serialization.FormatterServices.InteralGetSerializableMembers(RuntimeType类型)在System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext上下文)在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象对象obj,ISurrogateSelector代理选择器,StreamingContext上下文,SerObjectInfoInit serObjectInfoIni,IFormatterConverter转换器,ObjectWriter ObjectWriter)在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象对象对象,ISurrogateSelector代理选择器,StreamingContext上下文,SerObjectInfoInit serObjectInfoIni,IFormatterConverter转换器,ObjectWriter对象写入器)在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象图,Header[]inHeaders,__BinaryWriter serWriter,布尔fCheck)在System.Runtime.Serialization.Formatters.BinaryFormatter.Serialize(流序列化流,对象图,Header[]标头,布尔fCheck)在System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage(IMessage消息,流输出流,布尔includeVersion)在System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack,IMessage msg,ITransportHeaders&headers,Stream&Stream)在System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,Stream requestStream,IMessage&responseMsg,ITransport Headers&responseHeaders,Stream&responseStream)在[0]处重新引发异常:在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage-reqMsg,IMessage-retMsg)在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型)位于System.Collections.IEnumerable.GetEnumerator()位于System.Collections.IEnumerable.GetEnumerator()位于System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable数据源,布尔数据绑定)位于System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable数据)位于System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable数据)位于System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable数据)位于System.Web.UI.DataSourceView.Select(DataSourceSelectArguments参数,DataSourceViewSelectCallback回调)位于System.Web.UI.WebControls.DataBoundControl.PerformSelect()位于System.Web.UI.WebControls.BaseDataBoundControl.DataBind()位于System.Web.UI.WebControls.GridView.DataBind()位于Drive.CampaignManager.CreateQuery.GridViewBind()在Mycode.aspx中
无法从上面的堆栈中理解太多内容。
通过阅读您发布的堆栈跟踪,您的层之间似乎正在进行一些远程处理——这段代码是在多台机器上运行的吗?像DataReaders(SqlDataReader、EntityDataReader等)这样不可串行化的类(如果您在美国,则为可串行化:-))不能跨远程边界传递。
您需要一种不同的设计来实现这一点,一种在代码层之间传递可串行对象的设计。传递数据集可能是使UI代码工作的最低摩擦方法,因为您只需替换
gridview1.Datasource = dr
带有
gridview1.DataSource = ds
查看异常的堆栈跟踪。它将显示尝试序列化DbEnumerator
的代码。