0

次のサンプルがあり、SourceDataクラスはSQLクエリの結果であるDataViewを表します。

class MainClass
{
    private static SourceData Source;
    private static DataView View;
    private static DataView Destination;
        
    public static void Main (string[] args)
    {
        Source = new SourceData();
        View = new DataView(Source.Table);
        Destination = new DataView();
            
        Source.AddRowData("Table1", 100);
        Source.AddRowData("Table2", 1500);
        Source.AddRowData("Table3", 1300324);
        Source.AddRowData("Table4", 1122494);
        Source.AddRowData("Table5", 132545);

        Console.WriteLine(String.Format("Data View Records: {0}", View.Count));         

        foreach(DataRowView drvRow in View)
        {
            Console.WriteLine(String.Format("Source {0} has {1} records.", drvRow["table"], drvRow["records"]));
            DataRowView newRow = Destination.AddNew();
            newRow["table"] = drvRow["table"];
            newRow["records"] = drvRow["records"];
        }
            
        Console.WriteLine();
        Console.WriteLine(String.Format("Destination View Records: {0}", Destination.Count));
            
        foreach(DataRowView drvRow in Destination)
        {
            Console.WriteLine(String.Format("Destination {0} has {1} records.", drvRow["table"], drvRow["records"]));
        }

    }
}

class SourceData
{
    public DataTable Table
    {
        get{return dataTable;}
    }
        
    private DataTable dataTable;
    
    public SourceData()
    {
        dataTable = new DataTable("TestTable");
        dataTable.Columns.Add("table", typeof(string));
        dataTable.Columns.Add("records", typeof(int));
    }
        
    public void AddRowData(string tableName, int tableRows)
    {
        dataTable.Rows.Add(tableName, tableRows);
    }
}

私の出力は次のとおりです。

データビューレコード:5
ソーステーブル1には100レコードがあります。

未処理の例外:System.NullReferenceException:/usr/src/packages/BUILD/mono-2.4.2.3 /mcs/class/のSystem.Data.DataView.AddNew()[0x0003e]にあるオブジェクトのインスタンスにオブジェクト参照が設定されていませんSystem.Data / System.Data / DataView.cs:344 at DataViewTest.MainClass.Main(System.String [] args)[0x000e8] in /home/david/Projects/DataViewTest/SourceData.cs:29

私はここでいくつかの読書をしました:DataView:AddNewメソッド......
そして私はこれを正しい方法で行っているように見えます。オブジェクト参照が設定されていないのはなぜですか?

4

2 に答える 2

0

何かのビューでなけれDataViewばなりません。あなたがそれを手に入れた方法は、(デフォルトのコンストラクターを使用して)何かのビューではありません-少なくともDataView.Tableプロパティを何かに設定する必要があります。

DataTableではなく、「宛先」の新しいを実際に作成したいと思いますDataView

于 2010-05-27T02:59:22.790 に答える
-1

問題はデータビューの宣言にありDestinationます。to が機能するにAddNew()は、新しいレコードを参照して追加するオブジェクト (この場合は DataTable) が必要です。

以下を修正することにより:

Destination = new DataView(new SourceData().Table);

...データビューの要件が満たされます。これは最初は意味をなさないかもしれませんがDataView、構築する DataTable (またはその他の形式のレコード セット) が作成されるまで、クラスは実際には完成しないことに注意してください。

出力は次のとおりです。

データ ビュー レコード: 5
ソース テーブル 1 には 100 レコードがあります。
ソース Table2 には 1500 のレコードがあります。
ソース Table3 には 1300324 レコードがあります。
ソース Table4 には 1122494 レコードがあります。
ソース Table5 には 132545 レコードがあります。

宛先ビュー レコード: 5
宛先 Table1 には 100 のレコードがあります。
Destination Table2 には 1500 のレコードがあります。
宛先 Table3 には 1300324 レコードがあります。
宛先 Table4 には 1122494 レコードがあります。
宛先 Table5 には 132545 レコードがあります。

于 2010-05-27T03:00:10.323 に答える