Как нельзя установить ссылку на объект DataView? - PullRequest
0 голосов
/ 27 мая 2010

У меня есть следующий пример, где класс SourceData будет представлять DataView, полученный в результате запроса Sql:

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: ссылка на объект не установлена ​​для экземпляра объекта в System.Data.DataView.AddNew () [0x0003e] в /usr/src/packages/BUILD/mono-2.4.2.3 /mcs/class/System.Data/System.Data/DataView.cs:344 в DataViewTest.MainClass.Main (System.String [] args) [0x000e8] в /home/david/Projects/DataViewTest/SourceData.cs:29

Я немного прочел здесь: Просмотр данных: метод AddNew ...
... и кажется, что я делаю это правильно. Как получилось, что ссылка на объект не установлена?

Ответы [ 2 ]

0 голосов
/ 27 мая 2010

Проблема заключается в объявлении Destination просмотра данных. Для функционирования AddNew() должен существовать объект (в данном случае DataTable), в который можно сослаться и добавить новую запись.

Исправив следующее:

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

... у dataview будут соблюдены его требования. Поначалу это может не иметь смысла, но следует понимать, что класс DataView на самом деле не завершен, пока у него нет DataTable (или некоторой другой формы набора записей) для построения.

Вывод теперь:

Записи просмотра данных: 5
Исходная таблица 1 имеет 100 записей.
Исходная таблица2 содержит 1500 записей.
Исходная таблица 3 имеет 1300324 записей.
Исходная таблица 4 имеет 1122494 записей.
Исходная таблица 5 содержит 132545 записей.

Записи назначения: 5
Таблица назначения содержит 100 записей.
Таблица назначения 2 содержит 1500 записей.
Таблица назначения 3 содержит 1300324 записей.
Таблица назначения 4 содержит 1122494 записей.
Таблица назначения 5 содержит 132545 записей.

0 голосов
/ 27 мая 2010

DataView должно быть представлением чего-то . То, как вы это получили, это не просмотр чего-либо (с использованием конструктора по умолчанию) - вам нужно как минимум установить для свойства DataView.Table нечто.

Я думаю, что вы действительно хотите создать новый DataTable для "назначения", а не DataView.

...