3

セッション変数はReferenceとして使用されており、 valueとして使用したいので、使用に問題があります。

私は自分のソリューションをデバッグして、次のようなものを作成しました:

DataTable dt = 
     (DataTable)HttpContext.Current.Session[
                      "SearchReturn-DataTableSchema"];

// Adding Rows of Data to DataTable dt

HttpContext.Current.Session["SearchReturn-DataTable"] = dt;

((DataTable)HttpContext.Current.Session[
     "SearchReturn-DataTableSchema"]).Rows.Clear();

return dt;

私の考えは、「DataTableSchema」には列スキーマを持つ DataTable のみを、「DataTable」には列 + 行を含めることでした。

問題は、 DataTableSchemaからすべての行をクリアすると、変数 dt の行もクリアされることです(!!)

どうすればこれを回避できますか? 変数 (この場合はセッション変数) を参照ではなく値として割り当てるにはどうすればよいですか?

ありがとうございました。


答え

これ

DataTable dt = (DataTable)Session["SearchReturn-DataTableSchema"];

これである必要があります:

DataTable dt = ((DataTable)Session["SearchReturn-DataTableSchema"]).Copy();

:-)

4

4 に答える 4

3

テーブルのコピーを作成する必要があります。

于 2010-02-23T13:01:53.227 に答える
2

これの興味深い部分は、動作がセッション状態プロバイダーに依存することです。おそらく、参照を保持するインプロセス プロバイダーを現時点で使用していると思われますが、ほとんどのプロバイダーは (当然のことながら) シリアル化を使用します。

これは、スケールアップしようとすると、セッションにシリアル化できないものがあることに気付くため、しばしば人々を悩ませます。そのため、状態を別のプロバイダーにプッシュすることを検討してください。SQL-Server、memcached など - それらはすべてシリアル化を行うため、データは独立しています。

于 2010-02-23T13:07:22.783 に答える
0

DataTable の .Copy() メソッドを使用します:
http://msdn.microsoft.com/en-us/library/system.data.datatable.copy.aspx

于 2010-02-23T13:04:29.843 に答える
0

また、Clone メソッドを使用して DataTable スキーマを複製することもできます。次に、Load メソッドと CreateReader メソッドを使用してデータを読み込みます。

于 2010-02-23T13:08:07.043 に答える