1

を収容する ASP.NET ページがありますGridview

IDataReaderオブジェクトをグリッドにバインドしようとしています。このIDataReaderオブジェクトは、さらにいくつかのコード レイヤー (実際にはコントローラー レイヤーと DB レイヤーを形成する他の .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.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 (オブジェクト グラフ、ヘッダー [] inHeaders、__BinaryWriter serWriter、ブール値の fCheck) で
   System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (ストリーム serializationStream、オブジェクト グラフ、ヘッダー [] ヘッダー、ブール値の fCheck) で
   System.Runtime.Remoting.Channels.CoreChannel.SerializeBinaryMessage (IMessage メッセージ、ストリーム outputStream、ブール値の includeVersions) で
   System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse (IServerResponseChannelSinkStack sinkStack、IMessage メッセージ、ITransportHeaders& ヘッダー、ストリーム & ストリーム) で
   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 dataSource、ブール値の dataBinding) で
   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 に答える