6.2. ADO.NET

ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para programadores de .NET Framework. ADO.NET ofrece abundancia de componentes para la creación de aplicaciones de uso compartido de datos distribuidas. Constituye una parte integral de .NET Framework y proporciona acceso a datos relacionales, XML y de aplicaciones. ADO.NET satisface diversas necesidades de desarrollo, como la creación de clientes de base de datos front-end y objetos empresariales de nivel medio que utilizan aplicaciones, herramientas, lenguajes o exploradores de Internet.

ADO.NET proporciona acceso coherente a orígenes de datos como SQL Server y XML, así como a orígenes de datos expuestos mediante OLE DB y ODBC. Las aplicaciones de consumidor que comparten datos pueden utilizar ADO.NET para conectar a estos orígenes de datos y recuperar, controlar y actualizar los datos contenidos.

Ejemplo de cinexión con SQL Server

using System;
using System.Data;
using System.Data.SqlClient;

/// <summary>
/// Demonstrates how to work with SqlConnection objects
/// </summary>
class SqlConnectionDemo{
  static void Main(){
    SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
    SqlDataReader rdr = null;
    try {
      rdr = cmd.ExecuteReader();

      // print the CustomerID of each record
      while (rdr.Read()) {
        Console.WriteLine(rdr[0]);
      }
    }
    finally {
      // close the reader
      if (rdr != null) {
         rdr.Close();
      }

      if (conn != null) {
        conn.Close();
      }
   }
  }
}

Inserting Data

Para insertar datos en una base de datos, utilice el método ExecuteNonQuery del objeto SqlCommand. El siguiente código muestra cómo insertar datos en una tabla de base de datos:

// prepare command string
 string insertString = @"
     insert into Categories
     (CategoryName, Description)
     values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')"; 

La instancia SqlCommand es un poco diferente de lo que has visto antes, pero es básicamente el mismo. En lugar de una cadena literal como el primer parámetro del constructor SqlCommand, estamos usando una variable, insertString. La variable insertString es declarado justo por encima de la declaración SqlCommand.

Fíjese en las dos apóstrofes ('') en el texto insertString para la palabra "doesn''". Esta es la forma de escapar de la apóstrofe para obtener la cadena de poblar la columna correctamente.

Otra observación que hacer sobre el comando de insert es que hemos especificado explícitamente el CategoryName columnas y Descripción. La tabla de categorías tiene un campo de clave principal llamado IdCategoría. Dejamos esto fuera de la lista porque SQL Server añadirá este campo mismo. tratando de agregar un valor a un campo de clave principal, como IdCategoria generará una excepción.

Para ejecutar este comando, simplemente llamamos el método ExecuteNonQuery en la instancia SqlCommand, cmd.

Updating Data

EWl siguiente código muestra como modificar datos

// prepare command string
 string updateString = @"
     update Categories
     set CategoryName = 'Other'
     where CategoryName = 'Miscellaneous'";
 

Una vez más, se aplica el comando SQL en una variable de cadena, pero esta vez se utilizó un constructor SqlCommand diferente que toma solamente el comando. En el paso 2, asignamos el objeto SqlConnection, conec, a la propiedad Connection del objeto SqlCommand, cmd.

Esto podría haberse hecho con el mismo constructor utilizado para el comando de inserción, con dos parámetros. Demuestra que se puede cambiar el objeto de conexión asignado a un comando en cualquier momento.

El método ExecuteNonQuery realiza el comando de actualización.

Deleting Data

El siguiente código muestra como borrar registroa de ubna tabla al usar ExecuteNonQuery

// prepare command string
 string deleteString = @"
     delete from Categories
     where CategoryName = 'Other'";
 

Procesando datos

using System;
using System.Data;
using System.Data.SqlClient;

namespace Lesson04{
class ReaderDemo{
  static void Main() {
    ReaderDemo rd = new ReaderDemo();
	rd.SimpleRead();
  }

  public void SimpleRead() {
	// declare the SqlDataReader, which is used in
	// both the try block and the finally block
	SqlDataReader rdr = null;

	// create a connection object
	SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
    // create a command object
	SqlCommand cmd  = new SqlCommand("select * from Customers", conn);
	try {
	  // open the connection
	  conn.Open();
    
	  // 1. get an instance of the SqlDataReader
	  rdr = cmd.ExecuteReader();

	  // print a set of column headers
	  Console.WriteLine("Contact Name             City                Company Name");
	  Console.WriteLine( while (rdr.Read())	{
		// get the results of each column
		string contact = (string)rdr["ContactName"];
		string company = (string)rdr["CompanyName"];
		string city    = (string)rdr["City"];

		// print out the results
		Console.Write("{0,-25}", contact);
		Console.Write("{0,-20}", city);
		Console.Write("{0,-25}", company);
		Console.WriteLine();
	 }
   }
  finally {
	// 3. close the reader
	if (rdr != null) {
	  rdr.Close();
	}

	// close the connection
	if (conn != null) {
	  conn.Close();
	}
  }	
  }
}}