2017-02-20 14 views
0

コピーや集計など、メソッドを呼び出すために使用できる指定された列を持つデータテーブルクラスを作成して、レコードを繰り返し処理してテーブルに追加できる場所を作成します。再利用可能なデータオブジェクトを作成します。

私は同じように、私はプライベートとパブリック変数セットを作成して、私のデフォルトにテーブルの値を割り当てることができると思った:

private DataTable newTable; 
public DataTable NewTable 
{ 
    get { return newTable; } 
    set 
    { 
     DataTable newTable= new DT(); 
     newTable.Columns.Add("Name", typeof(string)); 
     newTable.Columns.Add("Id", typeof(int)); 
    } 
} 

「私の考えは、人がそのテーブルを得ることができるということでしたが、彼らはcouldnデフォルトに設定されているため、設定しないでください。しかし、私は後でメソッドでそれを使用しても、これは常にnullになるというインターフェースからのメッセージを見ています。私が撮った

別の刺しが設定されているデータテーブルで上記を含む、私はこの方法で使用することができ、静的クラスを作成しました:

static DataTable myDt() 
{ 
    DataTable myDt = new DT(); 
    myDt.Columns.Add("Name", typeof(string)); 
    myDt.Columns.Add("Id", typeof(int)); 
} 

これは私が繰り返しで必要なように機能していません誰かが100,000を超えるレコードを繰り返しているときは、毎回データテーブルを作成する必要はありません。私はデータテーブルを一度作成して定義を作成し、一度作成したデータ行を作成し、各反復で定義からの列名に基づいて新しい行にデータを追加します。私の考えでは、クラスには決して変更されないデータテーブル定義と、各繰り返しで変更されてテーブルに追加されるデータ行があると考えました。

私がしようとしていることに基づいて、どこが間違っているのでしょうか、これは可能ですか?

+1

初期の問題は、設定者がプライベート変数を設定せず、単に新しい変数を作成してそれを放棄することです。つまり、クラスレベルの 'newTable'は常に' null'です。しかし、ここでより重要な設計上の問題は、設定者が実際に設定した内容を設定していないことです。誤解を招きやすく、時間の経過とともにデバッグが困難なあらゆる種類の論理エラーが発生します。 – David

+0

'DataTable newTable = new DT();'は、 'private DataTable newTable;と同じDataTableではありません。その変数を 'set'でクラスレベルのDataTableに隠しています。 –

答えて

0

データテーブルをラップし、消費コードで行を追加できるようにする場合は、データテーブルをまったく公開しないでください。それを秘密にする。このような何か:あなたはまたことを検証するために、上記の方法でチェックするいくつかのエラーを置きたいと思うかもしれ

public void AddRow(DataRow newRow) 
{ 
    table.Rows.Add(newRow); 
} 

public class MyTableWrapper 
{ 
    private DataTable table { get; set; } 

    public MyTableWrapper() 
    { 
     table = new DataTable(); 
     table.Columns.Add("Name", typeof(string)); 
     table.Columns.Add("Id", typeof(int)); 
    } 
} 

は、それからちょうどそのための方法を公開し、ユーザーが行を追加できるようにします提供されたDataRowは、テーブルのスキーマと一致します。そうでない場合は、例外をスローします。

は、実際には、それはまた、消費するコードの行を生成する方法を公開して良いでしょう:あなたは、クラスDataTableビルトインから公開することがあり、他の機能について

public DataRow GetNewRow() 
{ 
    return table.NewRow(); 
} 

を、必要に応じてより類似したパススルーメソッドを追加するだけです。ラッパー自体は非常にシンプルで、ラップされるタイプのプライベートメンバーと、必要な機能だけを公開するパススルーメソッドが必要です。

関連する問題