Conectándonos A SQL Server Con ADO
Conectándonos A SQL Server Con ADO
NET parte I
http://copstone.com/2010/03/conectandonos-a-sql-server-con-ado-net-parte-i/
Recuerda que ADO.NET nos da las clases para conectarnos y posteriormente trabajar
con la información, y la cadena de conexión tiene los valores necesarios para acceder al
servidor donde la información esta almacenada. Haciendo uso de estos conceptos
veremos el código necesario que debemos usar para crear una aplicación que se conecte
a una base de datos MS SQL Server.
En esta ocasión, lo que voy a hacer es crear dos proyectos del tipo ClassLibrary, uno en
C# y otro en C++ para que tengas la aplicación en ambos lenguajes. A través de estas
aplicaciones me conectaré a una Base de Datos MS SQL Server 2008, extraeré la
información y en un post posterior te mostraré como puedes hacer para mostrarla en
pantalla.
Te recomiendo leer el post Creando un Proyecto Class Library para que recuerdes de
que se trata.
Continuando, recuerda que que estoy haciendo dos proyectos, uno en C# y otro en C++,
pero basta con hacer sólo uno de ellos, porque recuerda que en Visual Studio, puedes
combinar, en una misma solución, varios lenguajes.
Luego de crear los proyectos, lo primero que voy a colocar son los namespace que me
hacen falta para trabajar:
Visual C++
C#
Si leíste los dos post a los que hago mención al inicio, pudiste observar que hay una
serie de Clases que nos permitirán trabajar con la data. Uno de estas clases es el
DataSet. El DataSet, te permite definir un objeto para que, luego de extraída la
información, el cliente pueda mostrarla, insertar nuevos campos, modificarla, etc. En
resumen, el DataSet se refleja desde el lado Cliente, por lo que permite que la aplicación
Cliente, tenga en memoria los datos que han sido extraídos para poder trabajar con ellos.
Por lo tanto, voy a definir una función que te permita obtener todos los registros de la
tabla CopstoneTable ubicada en la base de datos llamada CopstoneBD y que retorne un
DataSet, el cual será recorrido o manipulado por otra aplicación.
Visual C++
da->Fill(ds);
}
__finally{
Lo que hace este código únicamente es recopilar información desde una tabla, pero lo
que aún no hacemos es como insertar, modificar o borrar los valores, eso lo iremos
aprendiendo de a pocos.
Conectándonos a SQL Server con ADO.NET parte II
Si en el post anterior vimos como conectarnos a un Servidor SQL, es momento de
aprender como podemos recorrer la información obtenida mediante un DataSet. En este
post he tratado de hacer una definición resumida de lo que es un DataSet pero
principalmente he colocado el código necesario para que puedas ir aprendiendo más
acerca de esta clase importante de ADO.NET
Bueno, ahora lo que haremos es crear una aplicación del tipo consola que reciba el
objeto DataSet y lo recorra mostrando su contenido. Para poder hacer esto, primero
definamos que es un objeto DataSet.
Un punto clave en un DataSet y quizás lo mas importante tal como lo puedes ver en la
imagen siguiente, es que todo está soportado por XML, lo cual hace posible trabajar
con diversas fuentes de datos de la misma forma, realmente eso es muy importante.
El objetivo de este post es enseñarte a recorrer un DataSet, enseñarte como acceder a las
tablas que contiene, a las filas y columnas de cada una de éstas, por lo que vamos a ver
los bloques de código necesarios para cumplir con éstos puntos. Antes de empezar te
muestro la siguiente figura para que vayas reconociendo como será el esquema de
trabajo.
Recuerda que vamos a crear una aplicación consola, y que vamos a hacer referencia al
proyecto creado en el post Conectándonos a SQL Server con ADO.NET parte I para
poder obtener la información y en la aplicación consola que crees vamos a recorrer la
información.
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Namespace donde esta definido el DataSet
using System.Data;
/*Namespace de nuestro proyecto
*que se conecta a la BD */
using CopstoneClassLibrary;
Visual C++
namespace TrabajandoconDataSet
{
int main()
{
//Creamos un objeto para conectarnos a una BD
MiPrimeraConexionaunaBD^ mibd=gcnew MiPrimeraConexionaunaBD();
/*Le indicamos al objeto que nos devuelva
*un DataSet con los datos recopilados*/
DataSet^ ds=mibd->Trae_Informacion_Desde_BD();
//AQUI COLOCAR LA LLAMADA A LOS METODOS
}
}
C#
namespace TrabajandoconDataSet
{
class Program
{
//AQUI COLOCAR LOS METODOS
static void Main(string[] args)
{
//Creamos un objeto para conectarnos a una BD
MiPrimeraConexionaunaBD mibd = new
MiPrimeraConexionaunaBD();
/*Le indicamos al objeto que nos devuelva
*un DataSet con los datos recopilados*/
DataSet ds=mibd.Trae_Informacion_Desde_BD();
Visual C++
}
}
C#
Visual C++
C#
dr["Nombre_Campo_1"].ToString());
Console.WriteLine("Campo 2 : {0}",
dr["Nombre_Campo_2"].ToString());
Console.WriteLine("Campo 3 : {0}",
dr["Nombre_Campo_3"].ToString());
//Añade o elimina la cantidad de campos que deseas mostrar
}
}
En el código anterior, hemos recorrido las filas del DataTable, es decir la información,
en esta ocasión vamos a recorrer qué campos estamos almacenando en la tabla así como
las propiedades de éstos.
Visual C++
}
C#
}
}
}
Ya dirán ustedes que quiero imitar a los productores de Rocky o Terminator por la gran
cantidad de secuelas que tienen esos films, pues la respuesta es no!. El objetivo de crear
varias partes para este tema es por lo amplio que es y creo que dividiéndolo en varias
partes es mejor de comprender. En esta ocasión seguiremos trabajando con el DataSet,
pero vamos a aprender a añadir, modificar y eliminar filas de un DataTable.
Recomiendo que antes de continuar leyendo este post, leas estos dos post para que te
orientes mejor:
En esta ocasión lo que voy a hacer es, sobre el proyecto realizado en Conectándonos a
Sql Server con Ado.Net parte II voy a añadir métodos para insertar, modificar y
eliminar una nueva fila. En un siguiente post veremos como crear los métodos
necesarios para trasladar los cambios realizados en el DataSet al Servidor de Base de
Datos.
Antes de ver el código, debes de recordar que el DataTable es quien tiene una colección
de filas, a las cuales podemos acceder mediante la propiedad Rows. Cada uno de los
elementos de esta colección son del tipo DataRow.
Visual C++
C#
Modificar fila
Entendamos por modificar una fila al hecho de querer modificar información de alguno
de los campos que lo conforman. Si hablamos de modificar una fila, la lógica nos diría
que primero debemos de encontrar la fila que vamos a alterar, por lo que debemos de
tener en cuenta lo siguiente: Cuando definimos una tabla en una Base De Datos, casi
siempre le definimos un campo como llave, de forma tal que este campo identifique a la
información almacenada y no la repitamos. Pero puede darse el caso que la tabla no
tenga llave definida y por lo tanto la información esté repetida.Tomando ambos casos,
voy a definir el código para modificar una fila, bajo dos casos: una tabla con una
columna como llave y en el otro caso una tabla sin llave.
Si tenemos una tabla que tiene una llave, debemos de realizar la búsqueda de la
información basándonos en este campo único. Para tal efecto voy a hacer uso de un
método definido en la propiedad Rows del DataTable llamado find.
Visual C++
C#
Si tenemos una tabla que no tiene una llave, debemos de realizar nuestro método de
búsqueda, basándonos en uno o más campos.
Visual C++
Eliminar fila
Así como podemos insertar una nueva fila o modificar una existente, también podemos
eliminarla. Debo de confesar que no tengo por costumbre la eliminación de información
de una Base de Datos. Lo que yo hago es tener un campo adicional que me indica si la
fila esta activa o no, pero no hago una eliminación información, sólo la oculto.
Visual C++
C#
Visual C++
Luego de revisar como podemos modificar las filas en un DataTable, lo que nos falta es
aprender a llevar estos cambios en el servidor de Base de Datos, para que nuestra
información quede almacenada, actualizada y pueda ser compartida.
Bueno, en los post anteriores ya hemos visto toda una secuencia de como trabajar con
Base de Datos, en el post Conectándonos a SQL Server con ADO.NET parte I,
aprendimos a conectarnos a un servidor MSSQL para obtener la información
almacenada en una tabla y retornarla en un objeto DataSet. En el post Conectándonos a
SQL Server con ADO.NET parte II , lo que hicimos fue trabajar, desde el lado cliente,
con el DataSet, de forma que podamos recorrer los DataTable allí contenidos, así como
recorrer las filas y columnas de cada DataTable, y en el post Conectándonos a SQL
Server con ADO.NET parte III , aprendimos a insertar, modificar y eliminar filas
siempre en el DataSet. Para finalizar la secuencia, en este post lo que haremos es llevar
la información nueva o modificada contenida en un DataSet, de regreso a una Tabla de
una Base de Datos.
Bueno, para tal motivo lo que haremos es trabajar con nuestro proyecto del tipo Class
Library, definido en Conectándonos a SQL Server con ADO.NET parte I, le
agregaremos los métodos necesarios para actualizar la información de un DataSet
recibido como parámetro.
Para poder hacer esto, voy a crear objetos que me permitan ejecutar StoredProdecures
en una base de datos MSSQL, para lo cual, de ser necesarios, voy a insertar parámetros
y asociarle el valor de los campos que han sido modificados recientemente en el
DataSet.
Crear_Insert_Command()
Visual C++
C#
Crear_Update_Command()
Visual C++
Crear_Delete_Command()
Visual C++
C#
Bueno, ya tenemos los métodos que crea cada uno de los SqlCommand. Lo que nos
falta es utilizarlo con un objeto SqlAdapter, por lo que voy a crear una método que cree
al SqlAdapter, invoque a los métodos anteriores y posteriormente grabe la información
en la Base de Datos, mediante el método Update.
Visual C++
C#
public void Actualiza_Informacion_En_BD(DataSet dsupd)
{
/*Creamos un objeto del tipo SqlConnectio*/
SqlConnection sqlcon = new SqlConnection();
/*Asignamos la cadena de conexión */
sqlcon.ConnectionString = "DatSource=localhost;
initial catalog=MiBD; user id=sa; password=SsAa";
/*Creamos un sqladapter*/
SqlDataAdapter da = new SqlDataAdapter();
//Asociamos los SqlCommand respectivos
da.InsertCommand = Crear_Insert_Command();
da.UpdateCommand = Crear_Update_Command();
da.DeleteCommand = Crear_Delete_Command();
try
{ //Abrimos la conexión a la BD
sqlcon.Open();
//Actualizamos sólo la tabla con el nombre indicado
da.Update(dsupd, "Nombre_Tabla");
}
catch
{ //Ante cualquier error lanzamos la excepción
throw;
}
finally
{
//Finalmente siempre cerramos la conexión a la BD
sqlcon.Close();
}
He tratado de resumir en 4 post todo lo que tienes que hacer para conectarte a una base
de datos y poder obtener información, posteriormente cambiarla y de nuevo regresarla a
la base de datos, espero que al leer todo te haya quedado claro lo que debes de hacer,
pero si tienes algún problema, no dudes en dejar un comentario
ADO.NET
http://copstone.com/2010/02/ado-net/
Para realizar una aplicación que interactúe con una Base de Datos, en Visual Studio,
debes de conocer algunos conceptos nuevos, empieza aprendiendo qué es ADO.NET.
Cuando Microsoft creó la plataforma .NET, cambió por completo los componentes que
se tenían hasta entonces para trabajar con las diversas Bases de Datos del mercado. Esta
revolución no sólo implica componentes, sino clases y librerías que involucran el
manejo, control y consumo de un origen de datos cualquiera, incluyendo archivos XML.
ADO.NET (Activex Data Objects .Net), es considerado como una evolución de ADO,
versión que venía hasta Visual Basic 6.0, pero para ser sincero y a mi manera de ver las
cosas, no se parecen, son conceptos e ideas de trabajo distintas.
Lo que se busca con ADO.NET, es de separar dos cosas: El origen o proveedor de los
datos (La Base de Datos) y el manejo de la información luego de ser extraída. En la
siguiente imagen, podemos apreciar de qué estamos hablando.
Cuando hablamos que ADO.NET, encierra a todo el conjunto de clases que nos
permiten trabajar con las diversas bases de datos, no podemos negar que trabaja
perfectamente con MS. SQL Server, pero de manera particular he trabajado muy bien
con MySql, PostGres, Oracle y archivos XML, por lo que puedo dar fe de lo bien que se
maneja la información.
Namespace de ADO.NET
Recuerda, cuando hablamos de ADO.NET, estamos hablando de un conjunto de clases
o librerías que permiten interactuar con una fuente de datos (no necesariamente es un
SQL Server u Oracle, puede ser un archivo XML, MySql, Postgres, etc.). Por lo que es
necesario saber donde se encuentran estas clases y cuáles son los namespace que los
agrupan.
System.Data
Engloba las clase principal para poder trabajar con la información extraída en el lado
cliente: DataSet.
System.Xml
System.Data.OleDb
.Net Framework trae, por defecto, en ADO.NET las clases que proporcionan conexión y
funcionalidad para orígenes de datos compatibles con OLE DB. Estas clases permiten
conectarse a un origen de datos OLE DB, ejecutar comandos en el origen y leer los
resultados.
System.Data.SqlClient
En este namespace que engloba a las clases que conforman el proveedor de datos
de .NET Framework para MS SQL Server.
System.Data.SqlTypes
Proporciona clases para tipos de datos nativos de MS SQL Server. Estas clases
ofrecen una alternativa más segura y más rápida a otros tipos de datos.
System.Data.OracleClient
Clases que componen el proveedor de datos de .NET Framework para Oracle. Estas
clases permiten el acceso a orígenes de datos Oracle en el espacio administrado.
Un error común o como dicen algunos, una mala práctica, de un programador que recién
se inicia es colocar todo el código en una sola unidad, clase o librería. Este error, si no
lo corriges a tiempo te puede originar muy serios problemas si estamos hablando de
construir aplicaciones profesionales y sobre todo, mantenibles en el tiempo.
Definir un formulario que tenga los controles necesarios para mostrar la información.
Definir una clase, aparte del formulario, si es posible en un proyecto del tipo Class
Library, que sea la responsable de conectarse a la Base de Datos y de llevarle la
información al formulario.
Por ningún motivo, trates de juntar todo en un sólo proyecto, por más pequeña que sea
tu aplicación, te recomiendo siempre hacer las cosas como se deben.
Para los que lo han visto antes, claramente pueden saber que se trata de un diagrama de
capas o niveles, en donde cada recuadro, tiene un nombre basado en la responsabilidad
que cumple dentro de la aplicación. El primero es capaz de mostrar la información al
usuario (sea en Web o Windows), el segundo – donde esta ADO.NET- es llamado el
nivel de negocios y el tercero donde está la información es el Nivel de datos. Este es un
diagrama base, pero cada uno puede tener su propia versión, siempre y cuando respete
que cada nivel cumple con una funcionalidad diferenciada a las demás.
Resumen
Espero que este artículo te haya servido para entender básicamente lo siguiente acerca
de ADO.NET:
Es la forma de trabajo que brinda .Net Framework para trabajar con diversos tipos de
orígenes de datos, teniendo mejor relación con MS SQL Server, pero trabaja sin
problemas con todas las existentes en el mercado.
Engloba un conjunto de librerías, clases que permiten definir objetos para interactuar
con los diversos orígenes de datos.
Engloba clases tanto para conexión al origen de datos, como manejo de los mismos
luego que éstos son extraídos y colocados en la aplicación cliente.
Si crees que sólo hace falta saber de objetos, clases, etc. para conectarse a una Base de
Datos, pues te equivocas, tienes que saber también de Servidor, usuarios, passwords,
etc. Te dejo este post para que completes tu información y puedas aprender como
conectarte a una Base de Datos
En un post anterior escribí acerca de ADO.NET, expliqué que nos brinda componentes
para conectarte a un servidor de base de datos y extraer la información para mostrarla en
una aplicación cliente.
Bueno, una cosa es tener el componente o la clase que permita definir objetos para
conectarse a un servidor y otra muy distinta es tener acceso a un servidor (remoto por lo
general) mediante un usuario y password que tenga los niveles de acceso respectivos
para poder realizar las acciones que sean necesarias.
Teniendo en cuenta esto último, podemos decir entonces que necesitamos dos cosas
para conectarnos a una Base de Datos:
1. Un objeto llamado Connection, el cual depende del origen de datos al cual deseamos
conectarnos. Puede ser: SqlConnection – si nos vamos a conectar a una Base de Datos
MS SQL SERVER- OleDbConnection, ODBCConnection, etc. Cada una definida y
declarada en su namespace respectivo.
2. Y tener información acerca de: Nombre del Servidor de BD (puede ser local o remoto),
Nombre de la BD, un usuario en la BD y un password o en su defecto que el usuario
con el cual accedes a Windows, tenga acceso al servidor de BD, todos estos
almacenados en una cadena, llamada comúnmente cadena de conexión.
Nombre del
Descripción
Campo
Initial Catalog Hace referencia a la Base de datos contenida en el Data Source indicado, debe
o DataBase de escribirse el nombre de la base de datos, no el nombre de la tabla.
Este campo se usa sólo si no vamos a usar los dos anteriores e indica que el
Integrated usuario con el cual vamos a ingresar a trabajar al servidor de base de datos es
Security igual al que hemos usado para iniciar sesión en Windows. El valor de este campo
es True.
Antes de darte los ejemplos es necesario que aclare algo, de la forma como estoy
acostumbrado a programar, mis cadenas de conexión, no tienen el campo Integrated
Security, siempre usan un usuario y un password de la Base de Datos, así sea una
aplicación sencilla o pequeña, por lo que los ejemplos que pondré son de este tipo.
Crear una Base de Datos, resulta tan importante como saber que componentes vas a usar
o que tecnología, te dejo este post para compartirte 5 puntos que siempre cumplo para
crear mis bases de datos.
Qué levante la mano aquel que no se ha hecho la pregunta de, existe alguna plantilla
para crear un buen modelo entidad relación (E-R)?.
Bueno, yo me hice esa pregunta, y aunque he realizado varios modelos entidad relación,
les puedo asegurar que muchas veces me han cuestionado cosas como : y por qué
normalizaste, o y por que no normalizaste?, porque tantos o tan pocos stored
procedures?, cuál es tu estándar? y una serie de preguntas, cuya respuestas me han
ayudado a ir mejorando mis modelos E-R y por lo tanto mis bases de datos.
De manera particular, te puedo comentar que cuando estoy armando una Base de datos,
y luego de puesta en producción, tengo en cuenta muchos factores, pero te voy a
compartir los que considero sumamente importantes:
La experiencia o los años, como quieras verlos, te van a enseñar que antes de crear tu
BD, en el motor de BD que prefieras, debes de sentarte, pensar y diagramar, el modelo
que va a almacenar la información que quieres manejar con tu aplicación. Debes de
tomarte el tiempo para identificar aquella información que cambia gracias a las
transacciones que se van llevando y también, identifica las que no cambian en el tiempo
y se mantienen estáticas. Normaliza las tablas que lo requieran, no soy partidario de
normalizar todo, pero si lo necesario. Una vez alguien me dijo: "Es buena la
normalización, pero no debes abusar de la misma", y es verdad, no es bueno tener todos
tus datos normalizados, solo los necesarios.
Define tu estándar
Punto clave luego de cumplido el anterior, sin un estándar para llamar a los campos, a
las entidades, para definir los tipos de datos, hasta para llamar los archivos, es
sumamente importante. Recuerda que la memoria es frágil y quizás no recuerdes lo que
hiciste luego de una semana, es mejor tener todo estandarizado de forma que sea fácil de
entender. Estandarizar es sumamente recomendable si se trabaja en equipo.
Es casi "normal", hacer stored procedures con mucha lógica, pero te pido que te tomes
tu tiempo para analizar si realmente lo necesitas. Me explico, muchos programadores
tienden a colocar la lógica del negocio en los stored procedures, no digo que sea malo,
pero el abuso de esto, te puede traer problemas si de rendimiento y performance
hablamos. Realiza tus stored procedures de forma que hagan su trabajo lo más rápido
posible.
Espero que estos 5 tips te ayuden al momento de definir tus bases de datos de ahora en
adelante. Para terminar este post, te dejo unas líneas con respecto a una Base de Datos:
la práctica te enseña que no siempre la teoría es buena, pero si te enseña que es
sumamente útil para saber lo que haces, sobre todo si de normalización se trata.