Cómo trabajar con ADO.Net en modo desconectado

El marco de acceso a datos ADO.Net de Microsoft se ha utilizado durante más de dos décadas. Puede aprovechar ADO.Net para realizar operaciones CRUD en una amplia variedad de bases de datos desde el entorno administrado de .Net CLR.

Un proveedor de datos es un componente de software que encapsula los protocolos utilizados para conectarse e interactuar con la base de datos subyacente desde el entorno administrado. Algunos de los proveedores de datos más populares incluyen: Proveedor de datos de SQL Server, Proveedor de datos de Oracle y Proveedor de datos OLEDB. ADO.Net puede funcionar tanto en modo conectado como desconectado.

Un modo de operación conectado en ADO.Net es aquel en el que la conexión a la base de datos subyacente está activa durante toda la vida útil de la operación. Mientras tanto, un modo de operación desconectado es aquel en el que ADO.Net recupera datos de la base de datos subyacente, almacena los datos recuperados temporalmente en la memoria y luego cierra la conexión a la base de datos.

Al trabajar con ADO.Net en modo de operación desconectado, normalmente aprovechará DataAdapter, DataSet, DataTable y DataTableReader. Mientras que el DataAdapter actúa como un puente entre la aplicación y la base de datos, un DataSet es una representación desconectada en memoria de la base de datos y puede contener una o más instancias de DataTable. Un DataTableReader es similar a un DataReader excepto que funciona en modo desconectado.

Profundicemos en un código

Ya hemos tenido suficientes conceptos, entremos en un código. El siguiente fragmento de código muestra cómo puede recuperar datos de una base de datos en un modo desconectado. Tenga en cuenta que este ejemplo se conecta a la base de datos AdventureWorks solo con fines ilustrativos.

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataSet dataSet = new DataSet();

                    sqlDataAdapter.Fill(dataSet);

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

        }

En la lista de códigos anterior, se establece una conexión a la base de datos utilizando una instancia de la clase SqlConnection. Luego se crea una instancia de DataAdapter y se usa para poblar una instancia de DataSet usando el método Fill () de la clase DataAdapter. La conexión a la base de datos se cierra automáticamente cuando el control sale del bloque "using" ya que el método Dispose () se invoca automáticamente en la instancia de SqlConnection. Los datos almacenados en la instancia de DataSet residen en la memoria y no dependen de una conexión de base de datos activa, ya que DataSet funciona en modo desconectado. Una vez que los datos se recuperan de la base de datos y se almacenan en la memoria en una instancia de DataSet, también puede cambiar los datos si lo desea y luego conservarlos nuevamente cuando sea necesario.

DataRow dataRow = dataSet.Tables[0].NewRow(); //Creates a new data row

//You can now especifica el values for each of the columns of the data row

dataSet.Tables[0].Rows.Add(dataRow); //Add the data row

sqlDataAdapter.Update(dataSet); // Inserts a new record

Tenga en cuenta que puede utilizar el bloque "using" en los tipos que implementan la interfaz IDisposable. Todo el bloque "using" está envuelto dentro de un bloque try - catch para manejar las excepciones que pueden surgir cuando el programa está en ejecución. Tenga en cuenta que la cadena de conexión en este ejemplo se recupera de un archivo de configuración; es una buena práctica aislar la cadena de conexión del código de su aplicación. También puede cifrar su cadena de conexión si es necesario.

También puede rellenar un DataTable de la misma forma que rellena un DataSet. Aquí hay un ejemplo que ilustra esto.

string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);                   

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

Un DataTableReader combina lo mejor de ambos mundos, es decir, es como un DataReader que funciona en modo desconectado y es más rápido que DataTable y DataReader. Para crear un DataTableReader, todo lo que necesita hacer es invocar el método CreateDataReader () en la instancia de DataTable.

DataTableReader dataTableReader = dataTable.CreateDataReader();

La siguiente lista de códigos muestra cómo puede mostrar los nombres de todos los departamentos usando DataTableReader.

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);

                    DataTableReader dataTableReader = dataTable.CreateDataReader(); 

                    while(dataTableReader.Read())

                    {

                        Console.WriteLine(dataTableReader["Name"].ToString());

                    }      

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

            Console.Read();

        }