Dataset y DataTable en VISUAL STUDIO 2010-1
Short Description
Download Dataset y DataTable en VISUAL STUDIO 2010-1...
Description
DataSet (Clase) Representa una memoria caché de datos en memoria.
Sintaxis VB C# C++ F# JScript
[SerializableAttribute] public class class DataSet DataSet : MarshalByValueComponent, IListSource, IXmlSerializable, IXmlSerializable, ISupportInitializeNotific ISupportInitializeNotification, ation, ISupportInitialize, ISupportInitialize, IS erializable
Ejemplos El ejemplo siguiente se compone de varios métodos que, combinados, crean y rellenan un objeto DataSet a partir de la base de datos Northwind. Northwind. using System; using System; using System.Data; using System.Data; using using System.Data.SqlClient; namespace namespace Microsoft.AdoNet.DataSetDemo { class class NorthwindDataSet { static void void Main() Main() { string connectionString string connectionString = GetConnectionString(); ConnectToData(connectio ConnectToData(connectionString); nString); } private static void void ConnectToData( ConnectToData( string string connectionString) { //Create a SqlConnection to the Northwind database. using (SqlConnection using (SqlConnection connection = new new SqlConnection(connectionString)) { //Create a SqlDataAdapter for the Suppliers table. SqlDataAdapter adapter = new SqlDataAdapter(); SqlDataAdapter(); // A table mapping names the DataTable. adapter.TableMappings.Add( "Table" "Table", , "Suppliers" );
// Open the connection. connection.Open(); Console.WriteLine( "The SqlConnection is open." ); // Create a SqlCommand to retrieve Suppliers data. SqlCommand command = new new SqlCommand( SqlCommand( "SELECT SupplierID, CompanyName FROM dbo.Suppliers;" , connection); command.CommandType = CommandType.Text; // Set the SqlDataAdapter's SelectCommand. adapter.SelectComman adapter.SelectCommand d = command; // Fill the DataSet. DataSet dataSet = new new DataSet( DataSet("Suppliers" "Suppliers"); ); adapter.Fill(dataSet); // Create a second Adapter and Command to get // the Products table, a child table of Suppliers. SqlDataAdapter productsAdapter = new new SqlDataAdapter(); productsAdapter.TableMappings.Add( "Table" "Table", , "Products" ); SqlCommand productsCommand = new new SqlCommand( 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" "Suppliers"].Columns[ ].Columns["SupplierID" "SupplierID" ]; DataColumn childColumn = dataSet.Tables[ "Products" ].Columns["SupplierID" ].Columns["SupplierID" ]; DataRelation relation = new new System.Data.DataRelation( "SuppliersProducts" , parentColumn, parentColumn, childColumn); childColumn); dataSet.Relations.Add(r dataSet.Relations.Add(relation); elation); Console.WriteLine( "The {0} DataRelation has been created." , relation.RelationName); } } static private string GetConnectionString() 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" ; } } }
Agregar datos a DataTable .NET Framework 4 Otras versiones
Después de crear una DataTable y definir su estructura usando columnas y restricciones, se le pueden agregar nuevas filas de datos. Para agregar una nueva fila, declare una nueva variable como tipo DataRow DataRow.. Se devuelve un nuevo objeto DataRow cuando se llama al método NewRow NewRow.. A continuación, la DataTable crea el objeto DataRowbasándose DataRowbasándose en la estructura de la tabla, definida por la DataColumnCollection DataColumnCollection.. En el ejemplo siguiente se muestra cómo se crea una nueva fila llamando al método NewRow. NewRow.
VB C# C++ F# JScript
DataRow workRow = workTable.NewRow(); workTable.NewRow();
A continuación, la fila recién agregada se puede manipular mediante un índice o nombre de columna, como se muestra en el siguiente ejemplo.
VB C# C++ F# JScript
workRow["CustLName" workRow["CustLName"] ] = "Smith" "Smith"; ; workRow[1] = "Smith" "Smith"; ;
Una vez que se han insertado datos en la nueva fila, se utiliza el método Add para agregar la fila a la DataRowCollection DataRowCollection,, como se muestra en el siguiente código.
VB C# C++ F# JScript
workTable.Rows.Add(workRow);
También se puede llamar al método Add para agregar una nueva fila pasando una matriz de valores, con el tipo Object Object,, tal y como se muestra en el ejemplo siguiente.
VB C# C++ F# JScript
workTable.Rows.Add(new workTable.Rows.Add( new Object[] Object[] {1, "Smith" "Smith"}); });
Si se pasa una matriz de objetos con el tipo Object al método Add, Add, se crea una nueva fila dentro de la tabla y se establece sus valores de columna en los valores de la matriz de objetos. Tenga en cuenta que los valores de la matriz se hacen coincidir en secuencia con las columnas, basándose en el orden en que aparecen en la tabla. En el siguiente ejemplo se agregan diez filas a la tabla Customers recién creada. VB C# C++ F# JScript DataRow workRow; for ( for (int int i i = 0; i criterio de ordenación y estado de la fila. Además, se puede utilizar el método Find de
una DataRowCollection cuando DataRowCollection cuando se busque una fila determinada mediante el valor de una clave principal. El método Select del Select del objeto DataTable devuelve DataTable devuelve un conjunto de objetos DataRow que cumplen con los criterios especificados. Select toma Select toma argumentos opcionales de una expresión de filtro, expresión de ordenación y DataViewRowState. DataViewRowState. La expresión de filtro identifica qué filas se van a devolver basándose en valores de DataColumn como, DataColumn como, por ejemplo, LastName = 'Smith'. La expresión de ordenación sigue convenciones SQL estándar para ordenar columnas, por ejemplo LastName ASC, FirstName ASC. Para obtener las reglas de escritura de expresiones, vea la propiedad Expression de la clase DataColumn. DataColumn.
Sugerencia Cuando se realizan varias llamadas al método Select de una DataTable , se puede aumentar el rendimiento m la DataTable . Al crear la DataView , las filas de la tabla se colocan en un índice. A continuación, el método considerablemente el tiempo necesario para generar el resultado de la consulta. Para obtener información sob una DataTable , vea DataViews (ADO.NET). (ADO.NET). El método Select determina Select determina qué versión de las filas se debe ver o manipular, según un DataViewRowState DataViewRowState.. En la siguiente tabla se recogen los posibles valores de la enumeración DataViewRowState. DataViewRowState.
Valor DataViewRowState
Descripción
CurrentRows
Filas actuales, incluidas las filas sin modificar, agregadas y modificadas.
Deleted
Una fila eliminada.
ModifiedCurrent
Una versión actual, que es una versión modificada de los datos originales.
ModifiedOriginal
Versión original de todas las filas modificadas. La versión actual está disp
Added
Una fila nueva.
None
Ninguno.
OriginalRows
Filas originales, incluidas las filas sin modificar y las eliminadas.
Unchanged
Una fila sin modificar.
En el ejemplo siguiente, el objeto DataSet se DataSet se filtra de manera que se trabaje solo con las filas cuyo DataViewRowState está DataViewRowState está establecido en CurrentRows. CurrentRows.
VB
C# C++ F# JScript
DataRow[] currentRows = workTable.Select( workTable.Select( null, null , null null, , DataViewRowState.Cu DataViewRowState.CurrentRows); rrentRows); if (currentRows.Length < 1 ) if (currentRows.Length Console.WriteLine( "No Current Rows Found" ); else { foreach (DataColumn foreach (DataColumn column in workTable.Columns) workTable.Columns) Console.Write( "\t{0}" "\t{0}", , column.ColumnName); column.ColumnName); Console.WriteLine( "\tRowState" ); foreach (DataRow foreach (DataRow row in in currentRows) currentRows) { foreach (DataColumn foreach (DataColumn column in workTable.Columns) workTable.Columns) Console.Write( "\t{0}" "\t{0}", , row[column]); Console.WriteLine( "\t" "\t" + + row.RowState); } }
El método Select se Select se puede utilizar para devolver filas con valores de RowState o RowState o valores de campo distintos. En el ejemplo siguiente se devuelve una matriz DataRow que DataRow que hace referencia a todas las filas que se han eliminado y devuelve otra matriz DataRow que DataRow que hace referencia a todas las filas, ordenadas por CustLName, CustLName, donde la columna CustID es CustID es mayor que 5. Para obtener información sobre cómo ver la información en la fila Deleted, fila. Deleted, vea Estados de fila y versiones de fila. VB C# C++ F# JScript // Retrieve all deleted rows. DataRow[] deletedRows = workTable.Select( workTable.Select( null, null , null null, , DataViewRowState.Deleted); // Retrieve rows where CustID > 5, and order by CustLName. DataRow[] custRows = workTable.Select( workTable.Select( "CustID > 5" , "CustLName ASC" );
Recuperar datos mediante DataReader (ADO.NET) La recuperación de datos mediante DataReader implica DataReader implica crear una instancia del objeto Command y Command y de un DataReader a DataReader a continuación, para lo cual se llama aCommand.ExecuteReader a Command.ExecuteReader a a fin de recuperar filas de un origen de datos. En el ejemplo siguiente se muestra cómo se utiliza un DataReader, DataReader, donde reader representa un DataReader válido y command representa un objeto Command válido. reader = command.ExecuteReader(); command.ExecuteReader();
Puede utilizar el método Read del Read del objeto DataReader para DataReader para obtener una fila a partir de los resultados de una consulta. Para tener acceso a cada columna de la fila devuelta, puede pasar a DataReader el DataReader el nombre o referencia numérica de la columna en cuestión. Sin embargo, el mejor rendimiento se logra con los métodos que ofrece DataReader y DataReader y que permiten tener acceso a los valores de las columnas en sus tipos de datos nativos (GetDateTime, GetDateTime, GetDouble, GetDouble, GetGuid, GetGuid, GetInt32, GetInt32, etc.). Para obtener una lista de métodos de descriptor de acceso con tipo para DataReaders de DataReaders de proveedores de datos específicos, vea las secciones OleDbDataReader y SqlDataReader SqlDataReader.. Si se utilizan los métodos de descriptor de acceso con tipo, dando por supuesto que se conoce el tipo de datos subyacentes, se reduce el número de conversiones de tipo necesarias para recuperar el valor de una columna. En el ejemplo de código siguiente se repite por un objeto DataReader y DataReader y se devuelven dos columnas de cada fila. VB C# C++ F# JScript
static void void HasRows(SqlConnection connection) { using (connection) using (connection) { SqlCommand command = new new SqlCommand( SqlCommand( "SELECT CategoryID, CategoryName FROM Categories;" , connection); connection.Open(); SqlDataReader SqlDataReader reader = command.ExecuteReader( command.ExecuteReader(); ); if (reader.HasRows) (reader.HasRows) { while while (reader.Read()) {
Console.WriteLine( "{0}\t{1}" "{0}\t{1}", , reader.GetInt32(0), reader.GetString(1)); } } else { Console.WriteLine( "No rows found." ); } reader.Close(); }
}
DataReader proporciona DataReader proporciona un flujo de datos sin búfer que permite a la lógica de los procedimientos procesar eficazmente y de forma secuencial los resultados procedentes de un origen de datos. DataReader es DataReader es la mejor opción cuando se trata de recuperar grandes cantidades de datos, ya que éstos no se almacenan en la memoria caché.
Recuperar varios conjuntos de resultados con NextResult En el caso en que se devuelvan varios resultados, el DataReader proporciona DataReader proporciona el método NextResult para NextResult para recorrer los conjuntos de resultados en orden. En el siguiente ejemplo se muestra el SqlDataReader mientras procesa los resultados de las dos instrucciones SELECT mediante el método ExecuteReader ExecuteReader.. static void RetrieveMultipleResults RetrieveMultipleResults(SqlConnect (SqlConnection ion connection) connection) { using (connection) using (connection) { SqlCommand command = new new SqlCommand( SqlCommand( "SELECT CategoryID, CategoryName FROM dbo.Categories;" + "SELECT EmployeeID, LastName FROM dbo.Employees" , connection); connection.Open(); SqlDataReader SqlDataReader reader = command.ExecuteReader( command.ExecuteReader(); ); while (reader.HasRows) (reader.HasRows) { Console.WriteLine( "\t{0}\t{1}" , reader.GetName(0), reader.GetName(0), reader.GetName(1)); while while (reader.Read()) { Console.WriteLine( "\t{0}\t{1}" , reader.GetInt32(0), reader.GetInt32(0), reader.GetString(1)); } reader.NextResult(); } } }
Obtener información del esquema a partir del DataReader Mientras hay abierto un DataReader, DataReader, puede utilizar el método GetSchemaTable para GetSchemaTable para recuperar información del esquema acerca del conjunto actual de resultados.GetSchemaTable resultados. GetSchemaTable devuelve devuelve un objeto DataTable rellenado con filas y columnas que contienen la información del esquema del conjunto actual de resultados. DataTablecontiene DataTablecontiene una fila por cada una de las columnas del conjunto de resultados. Cada columna de una fila de la tabla de esquema está asociada a una propiedad de la columna que se devuelve en el conjunto de resultados. ColumnName es ColumnName es el nombre de la propiedad y el valor de la columna es el de la propiedad. En el ejemplo de código siguiente se muestra la información del esquema de DataReader. DataReader. static void GetSchemaInfo(SqlConnec GetSchemaInfo(SqlConnection tion connection) { using (connection) using (connection) { SqlCommand command = new new SqlCommand( SqlCommand( "SELECT CategoryID, CategoryName FROM Categories;" , connection); connection.Open(); SqlDataReader SqlDataReader reader = command.ExecuteReader( command.ExecuteReader(); ); DataTable schemaTable = reader.GetSchemaTable reader.GetSchemaTable(); (); foreach (DataRow row in foreach (DataRow in schemaTable.Rows) { foreach (DataColumn foreach (DataColumn column in schemaTable.Columns) schemaTable.Columns) { Console.WriteLine(String.Format( "{0} = {1}", {1}" , column.ColumnName, column.ColumnName, row[column])); row[column])); } } } }
Estados de fila y versiones de fila .NET Framework 4 Otras versiones
ADO.NET administra las filas de las tablas mediante estados de fila y versiones de fila. Un estado de fila indica el estado de una fila; las versiones de fila mantienen los valores almacenados en una fila en cuanto se modifica, incluyendo los valores actuales, originales y predeterminados. Por ejemplo, después de realizar una modificación en una columna de una fila, ésta adquiere el estado de
fila Modified y dos versiones de fila:Current, que contiene los valores actuales de fila, y Original, que contiene los valores de fila antes de la modificación de la columna. Cada objeto DataRow cuenta con la propiedad RowState que puede examinar para determinar el estado actual de la fila. En la siguiente tabla se ofrece una breve descripción de los valores de enumeración de RowState.
Valor de RowState
Descripción
Unchanged
No se han hecho cambios desde la última llamada a AcceptChanges o desde que DataAdapt
Added
Se ha agregado la fila a la tabla, pero no se ha llamado a AcceptChanges.
Modified
Se ha cambiado algún elemento de la fila.
Deleted
Se ha eliminado la fila de una tabla y no se ha llamado a AcceptChanges.
Detached
La fila no forma parte de ninguna DataRowCollection. El valor de RowState de una fila reci ha agregado la nueva DataRow a DataRowCollection llamando al método Add, el valor de l También se establece Detached en una fila que se ha quitado de una DataRowCollection co método Delete seguido del métodoAcceptChanges.
Si se llama a AcceptChanges en un objeto DataSet DataSet,, DataTable o DataRow DataRow,, se quitan todas las filas con el estado de fila Deleted. Las filas que quedan reciben el estado de filaUnchanged y los valores de la versión de fila Original se sobrescriben con los valores de la versión de fila Current. Si se llama a RejectChanges, se quitan todas las filas con el estado de fila Added. Las filas que quedan reciben el estado de fila Unchanged y los valores de la versión de fila Current se sobrescriben con los valores de la versión de filaOriginal. Las distintas versiones de una fila se pueden ver pasando un parámetro DataRowVersion con la referencia de la columna, como se muestra en el ejemplo siguiente. VB C# C++ F# JScript DataRow custRow = custTable.Rows[0]; string custID string custID = custRow[ "CustomerID" , DataRowVersion.Origin DataRowVersion.Original].ToStrin al].ToString(); g();
En la siguiente tabla se ofrece una breve descripción de los valores de enumeración de DataRowVersion.
Valor de
Descripción
DataRowVersion
Current
Valores actuales de la fila. Esta versión de fila no está disponible para filas con un v
Default
Ésta es la versión de fila predeterminada para una fila determinada. La versión de fil fila Added, Modified o Unchanged esCurrent. La versión de fila predeterminada par predeterminada para una fila Detached es Proposed. Pro posed.
Original
Valores originales de la fila. Esta versión de fila no está disponible para filas con un
Proposed
Valores propuestos para la fila. Esta versión de fila existe mientras dura una operaci forma parte de unaDataRowCollection.
Se puede comprobar si una DataRow tiene una versión de fila concreta llamando al método HasVersion y pasando DataRowVersion como argumento. Por ejemplo,DataRow.HasVersion(DataRowVersion.Original) devolverá false para las filas recién agregadas antes de llamar a AcceptChanges. En el siguiente ejemplo de código, se muestran los valores en todas las filas eliminadas de una tabla. Las filas Deleted no tienen una versión de fila Current y, por lo tanto, debe pasar DataRowVersion.Original cuando obtenga acceso a los valores de columna. VB C# C++ F# JScript DataTable catTable = catDS.Tables[ "Categories" ]; DataRow[] delRows = catTable.Select( null null, , null null, , DataViewRowState.Dele DataViewRowState.Deleted); ted); Console.WriteLine("Deleted Console.WriteLine( "Deleted rows:\n"); rows:\n" ); foreach (DataColumn catCol in foreach (DataColumn in catTable.Columns) Console.Write(catCol.ColumnName + "\t" "\t"); ); Console.WriteLine(); foreach (DataRow foreach (DataRow delRow in in delRows) delRows) { foreach (DataColumn foreach (DataColumn catCol in in catTable.Columns) Console.Write(delRow[catCol, DataRowVersion.Original] + "\t" "\t"); ); Console.WriteLine(); }
View more...
Comments