DataSet, DataTable y Data Providers
Yhoan Galeano
select * from tu_tabla
where tu_campo = tu_valor
CREATE TABLE Clientes(
Nombre VARCHAR (20),
Apellido VARCHAR (20),
FechaNacimiento DATETIME
);
CREATE PROCEDURE tuProcedimiento
@param1 nvarchar(30) = NULL,
@param2 nvarchar(60) = NULL
AS
select * from tu_tabla
where tu_campo = @param1
GO
exec tuProcedimiento 'valor1','valor2'
CREATE VIEW tuVista
AS
SELECT * FROM tu_tabla;
SELECT * FROM tuVista;
CREATE FUNCTION tuFuncion(@param1 VARCHAR(250))
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @var1 VARCHAR(250)
SET @var1 = @param1
SET @var1 = REPLACE(@var1 , 'www.', '')
SET @var1 = REPLACE(@var1 , '.com', '')
RETURN @var1
END
SELECT * FROM tuFuncion('hola')
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = 'tucontraseña' ;
GO
ADO .NET responde a las siglas de Microsoft ActiveX Data Objects de la plataforma .NET, y es una mejora evolutiva de la tecnología ADO. Realmente es una evolución más en las tecnologías de acceso a la información.
Es un conjunto de componentes del software que pueden ser usados por los programadores para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que están incluidas en el Microsoft .NET Framework.
Debemos usar la instrucción using(c#) para importar los siguientes namespaces:
Nosotros trabajaremos con los dos primeros namespace.
Es uno de los objetos centrales de la biblioteca ADO.NET. Su esquema esta definido por la clase DataColumnCollection.
Por medio de sus eventos podemos controlar los diferentes estados de los registros que se encuentran allí almacenados, porque esto funciona como una tabla de la base de datos. Tengamos en cuenta que este objeto desconoce su origen de datos, por lo que funciona como una entidad independiente.
Las clases que debemos usar para trabajar con los DataTables son:
.NewRow: Devuelve un objeto DataRow vació con el esquema del DataTable.
.Rows: Colección de Rows contenidos dentro del DataTable.
.Select: Método del cual podemos por medio de expresiones realizar consultas sobre los DataRows cargados.
.Columns: Colección de objetos DataColumn
El DataSet de ADO.NET es una representación de datos residente en memoria que proporciona un modelo de programación relacional coherente independientemente del origen de datos que contiene.
Un DataSet representa un conjunto completo de datos, incluyendo las tablas que contienen, ordenan y restringen los datos, así como las relaciones entre las tablas (Colección de objetos DataTables). Puede mantener la integridad entre los DataTables por medio del objeto DataRelation.
Las clases que debemos usar son:
El .NET Data Provider es el proveedor de datos de la plataforma .NET que permite conectar a un origen de datos con una aplicación para recuperar y modificar información. También este proveedor sirve de puente entre el origen de datos y el objeto más importante de ADO.NET, el DataSet.
Para utilizar los proveedores de acceso a datos de .NET debe utilizarse el namespace correspondiente:
System.Data.SqlClient para SQL Server 7.0 o Superior
System.Data.OleDb para proveedores OLE DB
El .NET Data Provider es el proveedor de datos de la plataforma .NET que permite conectar a un origen de datos con una aplicación para recuperar y modificar información. También este proveedor sirve de puente entre el origen de datos y el objeto más importante de ADO.NET, el DataSet.
Para utilizar los proveedores de acceso a datos de .NET debe utilizarse el namespace correspondiente:
System.Data.SqlClient para SQL Server 7.0 o Superior
System.Data.OleDb para proveedores OLE DB
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;
User ID=myDomain\myUsername;Password=myPassword;
El objeto SqlConnection se encarga de la parte de la comunicación física entre la aplicación y la base de datos SQL Server. Una instancia de la clase SqlConnection toma la cadena de conexión como argumento.
Cuando se establece la conexión, los comandos SQL se puede ejecutar, con la ayuda del objeto de conexión, para recuperar o manipular los datos en la base de datos. Una vez que las actividades de base de datos terminen la conexión se debe cerrar y liberar los recursos de base de datos.
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
//
//
//
string connectionString = "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI; User ID=myDomain\myUsername;Password=myPassword;";
//
//
using (SqlConnection con = new SqlConnection(connectionString))
{
//
// Open SqlConnection.
//
con.Open();
}
}
}
Trabajando con el appSettings, ponemos lo siguiente en el web.config y en nuestra clase de conexión
<appSettings>
<add key="myConnectionString" value="server=localhost;database=myDb;
uid=myUser;password=myPass;" />
</appSettings>
y en nuestra clase de conexión
string connStr = ConfigurationSettings.AppSettings("myConnectionString");
Trabajando con el connectionStrings, ponemos lo siguiente en el web.config
<connectionStrings>
<add name="myConnectionString" connectionString="server=localhost;database=myDb;
uid=myUser;password=myPass;" />
</connectionStrings>
y en nuestra clase de conexión
string connStr =
ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
Un objeto Command básicamente formula una petición y se la envía al origen de datos. Si esa petición devuelve datos, el objeto Command se encarga de empaquetarlos y devolverlos como un objeto DataReader, un valor escalar o como los parámetros de salida utilizados en el propio comando.
Existen dos propiedades muy importantes de la clase Command:
CommandType.Text. Indica que la propiedad CommandText es un texto plano. Por ejemplo:
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSQL = ”SELECT * FROM Employees”;
SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn);
// La línea siguiente no es necesaria porque Text es el
// valor por defecto
ObjCmd.CommandType = CommandType.Text;
}
}
}
CommandType.StoredProcedure. Representa que la propiedad CommandText es el nombre de un procedimiento almacenado. Por ejemplo:
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSP = ”CustOrdersDetail”;
SqlCommand ObjCmd = new SqlCommand(strSP, ObjCnn);
ObjCmd.ComamndType = CommandType.StoredProcedure;
}
}
}
Se necesita que haya una conexión válida abierta y dependiendo del comportamiento que se desee dar al objeto Command se utilizará uno de los siguientes:
ExecuteNonQuery: No devuelve un conjunto de registros sino que devuelve el número de filas afectadas por la acción.
ExecuteReader: Devuelve un conjunto de registros de sólo lectura y “forward-only”. No se informa del número de filas afectadas.
ExecuteScalar: Devuelve sólo el valor de la celda (0,0) del conjunto de registros.
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSQL = ”UPDATE Employees SET lastname=’Alvaro’ WHERE EmployeeID=2”;
SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn);
ObjCmd.ExecuteNonQuery();
}
}
}
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSQL = ”SELECT * FROM Employees”;
SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn);
SqlDataReader ObjReader = ObjCmd.ExecuteReader();
while (ObjReader.Read())
{
Console.Write(ObjReader[0].ToString());
}
}
}
}
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSQL=”SELECT COUNT(*) FROM Employees”;
SqlCommand ObjCmd=new SqlCommand(strSQL, ObjCnn);
Object ObjAux = ObjCmd.ExecuteScalar();
}
}
}
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
String strSQL = ”UPDATE Employees SET lastname=’Alvaro’ WHERE EmployeeID = @ID”;
SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn);
SqlParameter param = new SqlParameter();
param.ParameterName = "@ID";
param.Value = 1;
ObjCmd.Parameters.Add(param);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
Console.WriteLine("{0}, {1}", reader["CompanyName"], reader["ContactName"]);
}
ObjCnn.Close();
}
}
}
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”;
using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
ObjCnn.Open();
SqlCommand command = new SqlCommand("SalesByCategory", ObjCnn);
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@CategoryName";
parameter.SqlDbType = SqlDbType.NVarChar;
parameter.Direction = ParameterDirection.Input;
parameter.Value = categoryName;
command.Parameters.Add(parameter);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}: {1:C}", reader["Name"], reader[1]);
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
}
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetFruitName]
@FruitId INT,
@FruitName VARCHAR(30) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @FruitName = FruitName
FROM Fruits
WHERE FruitId = @FruitId
END
string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
using (SqlCommand cmd = new SqlCommand("GetFruitName", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FruitId", int.Parse(txtFruitId.Text.Trim()));
cmd.Parameters.Add("@FruitName", SqlDbType.VarChar, 30);
cmd.Parameters["@FruitName"].Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
lblFruitName.Text = "Fruit Name: " + cmd.Parameters["@FruitName"].Value.ToString();
}
}
1. Creamos el método para realizar la consulta y devolver una DataSet.
public static DataSet GetAllFromDataSet()
{
string sql = @"SELECT [IdContacto]
,[Nombre]
,[Apellido]
,[FechaNacimiento]
,[Localidad]
,[Calle]
,[Numero]
FROM Contacto";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(command);
DataSet contactos = new DataSet();
da.Fill(contactos, "Contacto");
return contactos;
}
}
1. Creamos el método para realizar la consulta y devolver una lista.
public static List<ContactoEntity> GetAll()
{
string sql = @"SELECT [IdContacto],[Nombre] ,[Apellido]
,[FechaNacimiento] ,[Localidad]
,[Calle] ,[Numero] FROM Contacto";
List<ContactoEntity> list = new List<ContactoEntity>();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
list.Add(LoadContacto(reader));
}
return list;
}
}
2. Creamos el método que se va encargar de encapsular los datos que devuelve la consulta
private static ContactoEntity LoadContacto(IDataReader reader)
{
ContactoEntity contacto = new ContactoEntity();
contacto.IdContacto = Convert.ToInt32(reader["IdContacto"]);
contacto.Nombre = Convert.ToString(reader["Nombre"]);
contacto.Apellido = Convert.ToString(reader["Apellido"]);
contacto.FechaNacimiento = Convert.ToDateTime(reader["FechaNacimiento"]);
contacto.Localidad = Convert.ToString(reader["Localidad"]);
contacto.Calle = Convert.ToString(reader["Calle"]);
contacto.Numero = Convert.ToInt16(reader["Numero"]);
return contacto;
}