Dataadapter Class
Dataadapter Class
Represents a set of SQL commands and a database connection that are used to fill the DataSet and update the data source. The DataAdapter serves as a bridge between a DataSet and a data source for retrieving and saving data. The DataAdapter provides this bridge by mapping Fill, which changes the data in the DataSet to match the data in the data source, and Update, which changes the data in the data source to match the data in the DataSet. If you are connecting to a SQL Server database, you can increase overall performance by using the SqlDataAdapter along with its associated SqlCommand andSqlConnection objects. For OLE DB-supported data sources, use the DataAdapter with its associated OleDbCommand and OleDbConnection objects. For ODBC-supported data sources, use the DataAdapter with its associated OdbcCommand and OdbcConnection objects. For Oracle databases, use the DataAdapter with its associatedOracleCommand and OracleConnection objects. When an instance of DataAdapter is created, the read/write properties are set to initial values. For a list of these values, see the DataAdapter constructor.
DataTable Class
Represents one table of in-memory data. The DataTable is a central object in the ADO.NET library. Other objects that use the DataTable include the DataSet and the DataView. When accessing DataTable objects, note that they are conditionally case sensitive. For example, if one DataTable is named "mydatatable" and another is named "Mydatatable", a string used to search for one of the tables is regarded as case sensitive. However, if "mydatatable" exists and "Mydatatable" does not, the search string is regarded as case insensitive. A DataSet can contain two DataTable objects that have the same TableName property value but different Namespace property values. For more information about working with DataTable objects, see Creating a DataTable (ADO.NET). If you are creating a DataTable programmatically, you must first define its schema by adding DataColumn objects to the DataColumnCollection (accessed through theColumns property). For more information about adding DataColumn objects, see Adding Columns to a DataTable (ADO.NET). To add rows to a DataTable, you must first use the NewRow method to return a new DataRow object. The NewRow method returns a row with the schema of the DataTable, as it is defined by the table's DataColumnCollection. The maximum number of rows that a DataTable can store is 16,777,216. For more information, see Adding Data to a DataTable. The DataTable also contains a collection of Constraint objects that can be used to ensure the integrity of the data. For more information, see DataTable Constraints (ADO.NET). There are many DataTable events that can be used to determine when changes are made to a table. These include RowChanged, RowChanging, RowDeleting, andRowDeleted. For more information about the events that can be used with a DataTable, see Handling DataTable Events (ADO.NET). When an instance of DataTable is created, some of the read/write properties are set to initial values. For a list of these values, see the DataTable.DataTable constructor topic.
The following example creates two DataTable objects and one DataRelation object, and adds the new objects to a DataSet. The tables are then displayed in a DataGridViewcontrol. C# VB
// Put the next line into the Declarations section. private System.Data.DataSet dataSet; private void MakeDataTables() { // Run all of the functions. MakeParentTable(); MakeChildTable(); MakeDataRelation(); BindToDataGrid(); } private void MakeParentTable() { // Create a new DataTable. System.Data.DataTable table = new DataTable("ParentTable"); // Declare variables for DataColumn and DataRow objects. DataColumn column; DataRow row; // Create new DataColumn, set DataType, // ColumnName and add to DataTable. column = new DataColumn(); column.DataType = System.Type.GetType("System.Int32"); column.ColumnName = "id"; column.ReadOnly = true; column.Unique = true; // Add the Column to the DataColumnCollection. table.Columns.Add(column); // Create second column. column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "ParentItem"; column.AutoIncrement = false; column.Caption = "ParentItem"; column.ReadOnly = false; column.Unique = false; // Add the column to the table. table.Columns.Add(column); // Make the ID column the primary key column. DataColumn[] PrimaryKeyColumns = new DataColumn[1]; PrimaryKeyColumns[0] = table.Columns["id"]; table.PrimaryKey = PrimaryKeyColumns;
// Instantiate the DataSet variable. dataSet = new DataSet(); // Add the new DataTable to the DataSet. dataSet.Tables.Add(table); // Create three new DataRow objects and add // them to the DataTable for (int i = 0; i<= 2; i++) { row = table.NewRow(); row["id"] = i; row["ParentItem"] = "ParentItem " + i; table.Rows.Add(row); } } private void MakeChildTable() { // Create a new DataTable. DataTable table = new DataTable("childTable"); DataColumn column; DataRow row; // Create first column and add to the DataTable. column = new DataColumn(); column.DataType= System.Type.GetType("System.Int32"); column.ColumnName = "ChildID"; column.AutoIncrement = true; column.Caption = "ID"; column.ReadOnly = true; column.Unique = true; // Add the column to the DataColumnCollection. table.Columns.Add(column); // Create second column. column = new DataColumn(); column.DataType= System.Type.GetType("System.String"); column.ColumnName = "ChildItem"; column.AutoIncrement = false; column.Caption = "ChildItem"; column.ReadOnly = false; column.Unique = false; table.Columns.Add(column); // Create third column. column = new DataColumn(); column.DataType= System.Type.GetType("System.Int32"); column.ColumnName = "ParentID"; column.AutoIncrement = false; column.Caption = "ParentID";
column.ReadOnly = false; column.Unique = false; table.Columns.Add(column); dataSet.Tables.Add(table); // Create three sets of DataRow objects, // five rows each, and add to DataTable. for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i; row["ChildItem"] = "Item " + i; row["ParentID"] = 0 ; table.Rows.Add(row); } for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i + 5; row["ChildItem"] = "Item " + i; row["ParentID"] = 1 ; table.Rows.Add(row); } for(int i = 0; i <= 4; i ++) { row = table.NewRow(); row["childID"] = i + 10; row["ChildItem"] = "Item " + i; row["ParentID"] = 2 ; table.Rows.Add(row); } } private void MakeDataRelation() { // DataRelation requires two DataColumn // (parent and child) and a name. DataColumn parentColumn = dataSet.Tables["ParentTable"].Columns["id"]; DataColumn childColumn = dataSet.Tables["ChildTable"].Columns["ParentID"]; DataRelation relation = new DataRelation("parent2Child", parentColumn, childColumn); dataSet.Tables["ChildTable"].ParentRelations.Add(relation); } private void BindToDataGrid() { // Instruct the DataGrid to bind to the DataSet, with the // ParentTable as the topmost DataTable.
dataGrid1.SetDataBinding(dataSet,"ParentTable"); }
DataSet Class
Represents an in-memory cache of data. The DataSet, which is an in-memory cache of data retrieved from a data source, is a major component of the ADO.NET architecture. The DataSet consists of a collection ofDataTable objects that you can relate to each other with DataRelation objects. You can also enforce data integrity in the DataSet by using the UniqueConstraint andForeignKeyConstraint objects. For further details about working with DataSet objects, see DataSets, DataTables, and DataViews (ADO.NET). Whereas DataTable objects contain the data, the DataRelationCollection allows you to navigate though the table hierarchy. The tables are contained in a DataTableCollectionaccessed through the Tables property. When accessing DataTable objects, note that they are conditionally case sensitive. For example, if one DataTable is named "mydatatable" and another is named "Mydatatable", a string used to search for one of the tables is regarded as case sensitive. However, if "mydatatable" exists and "Mydatatable" does not, the search string is regarded as case insensitive. For more information about working with DataTable objects, see Creating a DataTable (ADO.NET). A DataSet can read and write data and schema as XML documents. The data and schema can then be transported across HTTP and used by any application, on any platform that is XML-enabled. You can save the schema as an XML schema with the WriteXmlSchema method, and both schema and data can be saved using the WriteXml method. To read an XML document that includes both schema and data, use the ReadXml method. In a typical multiple-tier implementation, the steps for creating and refreshing a DataSet, and in turn, updating the original data are to: 1. Build and fill each DataTable in a DataSet with data from a data source using a DataAdapter. 2. Change the data in individual DataTable objects by adding, updating, or deleting DataRow objects. 3. Invoke the GetChanges method to create a second DataSet that features only the changes to the data. 4. Call the Update method of the DataAdapter, passing the second DataSet as an argument. 5. Invoke the Merge method to merge the changes from the second DataSet into the first. 6. Invoke the AcceptChanges on the DataSet. Alternatively, invoke RejectChanges to cancel the changes.
The following example consists of several methods that, combined, create and fill a DataSet from the Northwind database. C# VB
using System; using System.Data; using System.Data.SqlClient; namespace Microsoft.AdoNet.DataSetDemo { class NorthwindDataSet
{ static void Main() { string connectionString = GetConnectionString(); ConnectToData(connectionString); } private static void ConnectToData(string connectionString) { //Create a SqlConnection to the Northwind database. using (SqlConnection connection = new SqlConnection(connectionString)) { //Create a SqlDataAdapter for the Suppliers table. SqlDataAdapter adapter = new SqlDataAdapter(); // A table mapping names the DataTable. adapter.TableMappings.Add("Table", "Suppliers"); // Open the connection. connection.Open(); Console.WriteLine("The SqlConnection is open."); // Create a SqlCommand to retrieve Suppliers data. SqlCommand command = new SqlCommand( "SELECT SupplierID, CompanyName FROM dbo.Suppliers;", connection); command.CommandType = CommandType.Text; // Set the SqlDataAdapter's SelectCommand. adapter.SelectCommand = command; // Fill the DataSet. DataSet dataSet = new DataSet("Suppliers"); adapter.Fill(dataSet); // Create a second Adapter and Command to get // the Products table, a child table of Suppliers. SqlDataAdapter productsAdapter = new SqlDataAdapter(); productsAdapter.TableMappings.Add("Table", "Products"); SqlCommand productsCommand = new SqlCommand( "SELECT ProductID, SupplierID FROM dbo.Products;", connection); productsAdapter.SelectCommand = productsCommand; // Fill the DataSet. productsAdapter.Fill(dataSet); // Close the connection. connection.Close();
Console.WriteLine("The SqlConnection is closed."); // Create a DataRelation to link the two tables // based on the SupplierID. DataColumn parentColumn = dataSet.Tables["Suppliers"].Columns["SupplierID"]; DataColumn childColumn = dataSet.Tables["Products"].Columns["SupplierID"]; DataRelation relation = new System.Data.DataRelation("SuppliersProducts", parentColumn, childColumn); dataSet.Relations.Add(relation); Console.WriteLine( "The {0} DataRelation has been created.", relation.RelationName); } } static private string GetConnectionString() { // To avoid storing the connection string in your code, // you can retrieve it from a configuration file. return "Data Source=(local);Initial Catalog=Northwind;" + "Integrated Security=SSPI"; } } }
Note
Using the DataAdapter to retrieve all of a table takes time, especially if there are many rows in the table. This i locating and processing the data, and then transferring the data to the client is time-consuming. Pulling all of the the rows on the server. To improve performance, you can use the WHERE clause to greatly reduce the number can also reduce the amount of data returned to the client by only explicitly listing required columns in the SELE workaround is to retrieve the rows in batches (such as several hundred rows at a time) and only retrieve the next with the current batch.
The Fill method uses the DataReader object implicitly to return the column names and types that are used to create the tables in the DataSet, and the data to populate the rows of the tables in the DataSet. Tables and columns are only created if they do not already exist; otherwise Fill uses the existing DataSet schema. Column types are created as .NET Framework types according to the tables in Data Type Mappings in ADO.NET. Primary keys are not created unless they exist in the data source and DataAdapter.MissingSchemaAction is set to MissingSchemaAction.AddWithKey. If Fill finds that a primary key exists for a table, it will overwrite data in the DataSet with data from the data source for rows where the primary key column values match those of the row returned from the data source. If no primary key is found, the data is appended to the tables in the DataSet. Fill uses any mappings that may exist when you populate the DataSet (see DataAdapter DataTable and DataColumn Mappings (ADO.NET)).
Note
If the SelectCommand returns the results of an OUTER JOIN, the DataAdapter does not set a PrimaryKey v You must define thePrimaryKey yourself to make sure that duplicate rows are resolved correctly. For more inf Keys (ADO.NET).
The following code example creates an instance of a SqlDataAdapter that uses a SqlConnection to the Microsoft SQL Server Northwind database and populates a DataTable in a DataSet with the list of customers. The SQL statement and SqlConnection arguments passed to the SqlDataAdapter constructor are used to create the SelectCommandproperty of the SqlDataAdapter.
Example
C# VB
// Assumes that connection is a valid SqlConnection object. string queryString = "SELECT CustomerID, CompanyName FROM dbo.Customers"; SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); DataSet customers = new DataSet(); adapter.Fill(customers, "Customers");
Note
The code shown in this example does not explicitly open and close the Connection. The Fill method implicitly the DataAdapter is using if it finds that the connection is not already open. If Fill opened the connection, it also when Fill is finished. This can simplify your code when you deal with a single operation such as a Fill or an Up performing multiple operations that require an open connection, you can improve the performance of your appli the Open method of the Connection, performing the operations against the data source, and then calling the Clo You should try to keep connections to the data source open as briefly as possible to free resources for use by oth
Example
The following code example populates a list of customers from the Northwind database on Microsoft SQL Server 2000, and a list of orders from the Northwind database stored in Microsoft Access 2000. The filled tables are related with a DataRelation, and the list of customers is then displayed with the orders for that customer. For more information about DataRelation objects, see Adding DataRelations (ADO.NET) and Navigating DataRelations (ADO.NET). C# VB
// Assumes that customerConnection is a valid SqlConnection object. // Assumes that orderConnection is a valid OleDbConnection object. SqlDataAdapter custAdapter = new SqlDataAdapter( "SELECT * FROM dbo.Customers", customerConnection); OleDbDataAdapter ordAdapter = new OleDbDataAdapter( "SELECT * FROM Orders", orderConnection); DataSet customerOrders = new DataSet(); custAdapter.Fill(customerOrders, "Customers"); ordAdapter.Fill(customerOrders, "Orders"); DataRelation relation = customerOrders.Relations.Add("CustOrders", customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]); foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows) { Console.WriteLine(pRow["CustomerID"]); foreach (DataRow cRow in pRow.GetChildRows(relation)) Console.WriteLine("\t" + cRow["OrderID"]); }
Note
The syntax for parameter placeholders depends on the data source. This example shows placeholders for a SQL mark (?) placeholders forSystem.Data.OleDb and System.Data.Odbc parameters.
In this Visual Basic example, the CompanyName field is updated with the value of the @CompanyName parameter for the row where CustomerID equals the value of the@CustomerID parameter. The parameters retrieve information from the modified row using the SourceColumn property of the SqlParameter object. The following are the parameters for the previous sample UPDATE statement. The code assumes that the variable adapter represents a valid SqlDataAdapter object.
adapter.Parameters.Add( _ "@CompanyName", SqlDbType.NChar, 15, "CompanyName") Dim parameter As SqlParameter = _ adapter.UpdateCommand.Parameters.Add("@CustomerID", _ SqlDbType.NChar, 5, "CustomerID") parameter.SourceVersion = DataRowVersion.Original
The Add method of the Parameters collection takes the name of the parameter, the data type, the size (if applicable to the type), and the name of the SourceColumn from theDataTable. Notice that the SourceVersion of the @CustomerID parameter is set to Original. This guarantees that the existing row in the data source is updated if the value of the identifying column or columns has been changed in the modified DataRow. In that case, the Original row value would match the current value at the data source, and theCurrent row value would contain the updated value. The SourceVersion for the @CompanyName parameter is not set and uses the default, Current row value.
Note
For both the Fill operations of the DataAdapter and the Get methods of the DataReader, the .NET Framework returned from the .NET Framework data provider. The inferred .NET Framework types and accessor methods fo DB, and ODBC data types are described in Data Type Mappings in ADO.NET.
Parameter.SourceColumn, Parameter.SourceVersion
The SourceColumn and SourceVersion may be passed as arguments to the Parameter constructor, or set as properties of an existing Parameter. The SourceColumn is the name of the DataColumn from the DataRow where the value of the Parameter will be retrieved. The SourceVersion specifies the DataRow version that the DataAdapteruses to retrieve the value. The following table shows the DataRowVersion enumeration values available for use with SourceVersion.
Description
The parameter uses the current value of the column. This is th The parameter uses the DefaultValue of the column.
Original Proposed
The parameter uses the original value of the column. The parameter uses a proposed value.
The SqlClient code example in the next section defines a parameter for an UpdateCommand in which the CustomerID column is used as a SourceColumn for two parameters: @CustomerID (SET CustomerID = @CustomerID), and @OldCustomerID (WHERE CustomerID = @OldCustomerID). The @CustomerID parameter is used to update the CustomerID column to the current value in the DataRow. As a result, the CustomerID SourceColumn with a SourceVersion of Current is used. The@OldCustomerID parameter is used to identify the current row in the data source. Because the matching column value is found in the Original version of the row, the sameSourceColumn (CustomerID) with a SourceVersion of Original is used.
public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; // Create the commands. adapter.SelectCommand = new SqlCommand( "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection); adapter.InsertCommand = new SqlCommand( "INSERT INTO Customers (CustomerID, CompanyName) " + "VALUES (@CustomerID, @CompanyName)", connection); adapter.UpdateCommand = new SqlCommand( "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " + "WHERE CustomerID = @oldCustomerID", connection); adapter.DeleteCommand = new SqlCommand( "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection); // Create the parameters. adapter.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5, "CustomerID"); adapter.InsertCommand.Parameters.Add("@CompanyName", SqlDbType.VarChar, 40, "CompanyName"); adapter.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5, "CustomerID"); adapter.UpdateCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName"); adapter.UpdateCommand.Parameters.Add("@oldCustomerID", SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original; adapter.DeleteCommand.Parameters.Add("@CustomerID", SqlDbType.Char, 5, "CustomerID").SourceVersion = DataRowVersion.Original; return adapter; }
int currentIndex = 0; int pageSize = 5; string orderSQL = "SELECT * FROM Orders ORDER BY OrderID"; // Assumes that connection is a valid SqlConnection object. SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection); DataSet dataSet = new DataSet(); adapter.Fill(dataSet, currentIndex, pageSize, "Orders");
In the previous example, the DataSet is only filled with five records, but the entire Orders table is returned. To fill the DataSet with those same five records, but only return five records, use the TOP and WHERE clauses in your SQL statement, as in the following code example. C# VB
int pageSize = 5;
string orderSQL = "SELECT TOP " + pageSize + " * FROM Orders ORDER BY OrderID"; SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection); DataSet dataSet = new DataSet(); adapter.Fill(dataSet, "Orders");
Note that, when paging through the query results in this way, you must preserve the unique identifier that orders the rows, in order to pass the unique ID to the command to return the next page of records, as shown in the following code example. C# VB
orderSQL = "SELECT TOP " + pageSize + " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID"; adapter.SelectCommand.CommandText = orderSQL; dataSet.Tables["Orders"].Rows.Clear(); adapter.Fill(dataSet, "Orders");
DataView Class
A major function of the DataView is to allow for data binding on both Windows Forms and Web Forms. Additionally, a DataView can be customized to present a subset of data from the DataTable. This capability lets you have two controls bound to the same DataTable, but that show different versions of the data. For example, one control might be bound to a DataView that shows all the rows in the table, and a second might be
configured to display only the rows that have been deleted from the DataTable. The DataTable also has a DefaultView property. This returns the default DataView for the table. For example, if you want to create a custom view on the table, set the RowFilter on the DataView returned by the DefaultView. To create a filtered and sorted view of data, set the RowFilter and Sort properties. Then, use the Item property to return a single DataRowView. You can also add and delete from the set of rows using the AddNew and Delete methods. When you use those methods, the RowStateFilter property can set to specify that only deleted rows or new rows be displayed by the DataView.
Note
If you do not explicitly specify sort criteria for DataView, the DataRowView objects in DataView are sorted b corresponding DataRow in the DataTable.Rows DataRowCollection.
LINQ to DataSet allows developers to create complex, powerful queries over a DataSet by using LINQ. A LINQ to DataSet query returns an enumeration of DataRow objects, however, which is not easily used in a binding scenario. DataView can be created from a LINQ to DataSet query and takes on the filtering and sorting characteristics of that query. LINQ to DataSet extends the functionality of the DataView by providing LINQ expression-based filtering and sorting, which allows for much more complex and powerful filtering and sorting operations than string-based filtering and sorting. See Data Binding and LINQ to DataSet for more information.
Examples
The following example creates a single DataTable with one column and five rows. Two DataView objects are created and the RowStateFilter is set on each to show different views of the table data. The values are then printed. C# VB
public class Form1: Form { protected DataSet DataSet1; protected DataGrid dataGrid1;
private void DemonstrateDataView() { // Create one DataTable with one column. DataTable table = new DataTable("table"); DataColumn colItem = new DataColumn("item", Type.GetType("System.String")); table.Columns.Add(colItem); // Add five items.
DataRow NewRow; for(int i = 0; i <5; i++) { NewRow = table.NewRow(); NewRow["item"] = "Item " + i; table.Rows.Add(NewRow); } // Change the values in the table. table.AcceptChanges(); table.Rows[0]["item"]="cat"; table.Rows[1]["item"] = "dog"; // Create two DataView objects with the same table. DataView firstView = new DataView(table); DataView secondView = new DataView(table); // Print current table values. PrintTableOrView(table,"Current Values in Table"); // Set first DataView to show only modified // versions of original rows. firstView.RowStateFilter=DataViewRowState.ModifiedOriginal; // Print values. PrintTableOrView(firstView,"First DataView: ModifiedOriginal"); // Add one New row to the second view. DataRowView rowView; rowView=secondView.AddNew(); rowView["item"] = "fish"; // Set second DataView to show modified versions of // current rows, or New rows. secondView.RowStateFilter=DataViewRowState.ModifiedCurrent | DataViewRowState.Added; // Print modified and Added rows. PrintTableOrView(secondView, "Second DataView: ModifiedCurrent | Added"); } private void PrintTableOrView(DataTable table, string label) { // This function prints values in the table or DataView. Console.WriteLine("\n" + label); for(int i = 0; i<table.Rows.Count;i++) { Console.WriteLine("\table" + table.Rows[i]["item"]); } Console.WriteLine(); }
private void PrintTableOrView(DataView view, string label) { // This overload prints values in the table or DataView. Console.WriteLine("\n" + label); for(int i = 0; i<view.Count;i++) { Console.WriteLine("\table" + view[i]["item"]); } Console.WriteLine(); } }
The following example creates a DataView of online orders ordered by total due from a LINQ to DataSet query: C# VB
DataTable orders = dataSet.Tables["SalesOrderHeader"]; EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable() where order.Field<bool>("OnlineOrderFlag") == true orderby order.Field<decimal>("TotalDue") select order; DataView view = query.AsDataView(); bindingSource1.DataSourc
DataRow Class
The DataRow and DataColumn objects are primary components of a DataTable. Use the DataRow object and its properties and methods to retrieve and evaluate; and insert, delete, and update the values in the DataTable. The DataRowCollection represents the actual DataRow objects in the DataTable, and the DataColumnCollection contains theDataColumn objects that describe the schema of the DataTable. Use the overloaded Item property to return or set the value of a DataColumn. Use the HasVersion and IsNull properties to determine the status of a particular row value, and the RowState property to determine the state of the row relative to its parentDataTable. To create a new DataRow, use the NewRow method of the DataTable object. After creating a new DataRow, use the Add method to add the new DataRow to theDataRowCollection. Finally, call the AcceptChanges method of the DataTable object to confirm the addition. For more information about adding data to a DataTable, seeAdding Data to a DataTable. You can delete a DataRow from the DataRowCollection by calling the Remove method of the DataRowCollection, or by calling the Delete method of the DataRow object. TheRemove method removes the row from the collection. In contrast, Delete marks the DataRow for removal. The actual removal occurs when you call AcceptChanges method. By calling Delete, you can programmatically check which rows are marked for removal before actually deleting them. For more information, see DataRow Deletion.
Examples
The following example creates a new DataRow by calling the NewRow method of the DataTable object. C# VB
private void CreateNewDataRow() { // Use the MakeTable function below to create a new table. DataTable table; table = MakeNamesTable(); // Once a table has been created, use the // NewRow to create a DataRow. DataRow row; row = table.NewRow(); // Then add the new row to the collection. row["fName"] = "John"; row["lName"] = "Smith"; table.Rows.Add(row); foreach(DataColumn column in table.Columns) Console.WriteLine(column.ColumnName); dataGrid1.DataSource=table; } private DataTable MakeNamesTable() { // Create a new DataTable titled 'Names.' DataTable namesTable = new DataTable("Names"); // Add three column objects to the table. DataColumn idColumn = new DataColumn(); idColumn.DataType = System.Type.GetType("System.Int32"); idColumn.ColumnName = "id"; idColumn.AutoIncrement = true; namesTable.Columns.Add(idColumn); DataColumn fNameColumn = new DataColumn(); fNameColumn.DataType = System.Type.GetType("System.String"); fNameColumn.ColumnName = "Fname"; fNameColumn.DefaultValue = "Fname"; namesTable.Columns.Add(fNameColumn); DataColumn lNameColumn = new DataColumn(); lNameColumn.DataType = System.Type.GetType("System.String"); lNameColumn.ColumnName = "LName"; namesTable.Columns.Add(lNameColumn); // Create an array for DataColumn objects.
DataColumn [] keys = new DataColumn [1]; keys[0] = idColumn; namesTable.PrimaryKey = keys; // Return the new DataTable. return namesTable; }
DataColumn Class
The DataColumn is the fundamental building block for creating the schema of a DataTable. You build the schema by adding one or more DataColumn objects to theDataColumnCollection. For more information, see Adding Columns to a DataTable (ADO.NET). Each DataColumn has a DataType property that determines the kind of data the DataColumn contains. For example, you can restrict the data type to integers, or strings, or decimals. Because data that is contained by the DataTable is typically merged back into its original data source, you must match the data types to those in the data source. For more information, see Data Type Mappings in ADO.NET. Properties such as AllowDBNull, Unique, and ReadOnly put restrictions on the entry and updating of data, thereby helping to guarantee data integrity. You can also use theAutoIncrement, AutoIncrementSeed, and AutoIncrementStep properties to control automatic data generation. For more information about AutoIncrement columns, seeCreating AutoIncrement Columns (ADO.NET). For more information, see Defining Primary Keys (ADO.NET). You can also make sure that values in a DataColumn are unique by creating a UniqueConstraint and adding it to the ConstraintCollection of the DataTable to which theDataColumn belongs. For more information, see DataTable Constraints (ADO.NET). To create a relation between DataColumn objects, create a DataRelation object and add it to the DataRelationCollection of a DataSet. You can use the Expression property of the DataColumn object to calculate the values in a column, or create an aggregate column. For more information, see Creating Expression Columns (ADO.NET).
Examples
The following example creates a DataTable with several DataColumn objects. C# VB
private void MakeTable() { // Create a DataTable. DataTable table = new DataTable("Product"); // Create a DataColumn and set various properties. DataColumn column = new DataColumn(); column.DataType = System.Type.GetType("System.Decimal");
column.AllowDBNull = false; column.Caption = "Price"; column.ColumnName = "Price"; column.DefaultValue = 25; // Add the column to the table. table.Columns.Add(column); // Add 10 rows and set values. DataRow row; for(int i = 0; i < 10; i++) { row = table.NewRow(); row["Price"] = i + 1; // Be sure to add the new row to the // DataRowCollection. table.Rows.Add(row); } }