I have the following sample where the SourceData
class would represent a DataView resulting from an Sql query:
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.Add开发者_JAVA技巧RowData("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);
}
}
My output is:
Data View Records: 5
Source Table1 has 100 records.Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object at System.Data.DataView.AddNew () [0x0003e] in /usr/src/packages/BUILD/mono-2.4.2.3 /mcs/class/System.Data/System.Data/DataView.cs:344 at DataViewTest.MainClass.Main (System.String[] args) [0x000e8] in /home/david/Projects/DataViewTest/SourceData.cs:29
I did some reading here: DataView:AddNew Method...
...and it would appear that I am doing this the right way. How come I am getting the Object reference not set?The DataView
has to be a view of something. The way you've got it, it's not a view of anything (using the default constructor) - you need to at least set the DataView.Table property to something.
I think you actually want to create a new DataTable
for "destination", not a DataView
.
The problem resides in the declaration of the Destination
dataview. In order for the AddNew()
to function, there must be an object (in this case, a DataTable) in which to reference and add the new record.
By correcting the following:
Destination = new DataView(new SourceData().Table);
...the dataview will have it's requirements met. This may not make sense at first - but realize that the DataView
class isn't really complete until it has a DataTable (or some other form of record set) on which to build.
The output is now:
Data View Records: 5
Source Table1 has 100 records.
Source Table2 has 1500 records.
Source Table3 has 1300324 records.
Source Table4 has 1122494 records.
Source Table5 has 132545 records.Destination View Records: 5
Destination Table1 has 100 records.
Destination Table2 has 1500 records.
Destination Table3 has 1300324 records.
Destination Table4 has 1122494 records.
Destination Table5 has 132545 records.
精彩评论