如何设置DataView对象引用?

时间:2010-05-27 02:53:12

标签: c# dataview datarowview

我有以下示例,其中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
  Source Table1有100条记录。

     

未处理的异常:System.NullReferenceException:对象引用未设置为/usr/src/packages/BUILD/mono-2.4.2.3中System.Data.DataView.AddNew()[0x0003e]中对象的实例   位于/home/david/Projects/DataViewTest/SourceData.cs:29的DataViewTest.MainClass.Main(System.String [] args)[0x000e8]中的/mcs/class/System.Data/System.Data/DataView.cs:344

我在这里做了一些阅读:DataView:AddNew Method...
......看来我正在以正确的方式做这件事。为什么我没有设置Object引用?

2 个答案:

答案 0 :(得分:0)

DataView必须是某个的视图。你得到它的方式,它不是任何东西的视图(使用默认构造函数) - 你需要至少将 DataView.Table 属性设置为某种东西。

我认为您确实要为“目的地”创建新的DataTable,而不是DataView

答案 1 :(得分:-1)

问题在于Destination数据视图的声明。为了使AddNew()起作用,必须有一个对象(在本例中是一个DataTable)来引用和添加新记录。

通过纠正以下内容:

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

......数据视图将满足它的要求。这一开始可能没有意义 - 但是要意识到DataView类在构建DataTable(或其他形式的记录集)之前并不是真正完整的。

输出现在是:

  

数据查看记录:5
  Source Table1有100条记录   来源表2有1500条记录   Source Table3有1300324条记录   Source Table4有1122494条记录   Source Table5有132545条记录。

     

目的地查看记录:5
  目的地表1有100条记录   目的地表2有1500条记录   目的地表3有1300324条记录   目的地表4有1122494条记录   目的地表5有132545条记录。