1

我有一个 ASP.NET 页面,其中包含一个Gridview.

我正在尝试将IDataReader对象绑定到网格。这个IDataReader对象是通过调用更多的代码层(实际上是形成控制器层和数据库层的其他 .ent 项目 dll)来分配的,然后最终绑定到我的网格。

gridview1.Datasource = dr(博士是我的 IDataReader),我没有看到任何问题。

但是在 gridview1.Databind 行我得到一个异常,异常对象中的详细信息如下:

{“在程序集 'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 中键入 'System.Data.Common.DbEnumerator' 未标记为可序列化。”}

我不确定应用程序中出了什么问题。有什么想法或意见吗?

编辑 1

添加堆栈跟踪异常:

服务器堆栈跟踪:
   在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型)
   在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext 上下文)
   在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
   在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter)
   在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象 obj,ISurrogateSelector surrogateSelector,StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter)
   在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象图,Header[] inHeaders,__BinaryWriter serWriter,布尔 fCheck)
   在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流序列化流,对象图,标头 [] 标头,布尔 fCheck)
   在 System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage(IMessage 消息,流输出流,布尔包含版本)
   在 System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack,IMessage 消息,ITransportHeaders& 标头,Stream& 流)
   在 System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,流 requestStream,IMessage& responseMsg,ITransportHeaders& 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.cs

从上面的堆栈跟踪中无法理解太多。

4

2 回答 2

1

查看异常的堆栈跟踪。它会告诉你什么代码试图序列化DbEnumerator.

于 2012-08-06T12:58:34.990 回答
1

从阅读您发布的堆栈跟踪来看,您的层之间似乎有一些远程处理 - 此代码是否跨多台机器运行?DataReaders(SqlDataReader、EntityDataReader 等)等不可序列化的类(如果您在美国,则为可序列的 :-))不能跨远程边界传递。

您需要一种不同的设计来完成这项工作,一种在代码层之间传递可序列化对象的设计。传递 DataSet 可能是让你的 UI 代码工作的最低摩擦方法,因为你可以替换

gridview1.Datasource = dr

gridview1.DataSource = ds
于 2012-08-06T13:43:39.147 回答