3. Definición
• ADO.NET provee un acceso consistente entre
fuentes de datos, como MSSQL, OLEDB, XML, etc.
• ADO.NET provee mecanismos para ejecutar
comandos y obtener los resultados.
• Cada vez es más común codificar información en
XML para pasarla a trabes de conexiones de red.
Este modelo es muy diferente al modelo de la era
cliente/servidor donde se mantenía una conexión
abierta durante la ejecución de un programa.
• ADO.NET fue diseñado para las solucionar las
necesidades de este nuevo modelo, con una
arquitectura desconectada, integración con XML,
representación común de los datos y la posibilidad de
combinar datos de varias fuentes de datos.
4. Proveedores de datos
• Un proveedor de datos de .NET es usado para conectarse a una
base de datos, ejecutar comandos y obtener los resultados.
• NET Provee los siguientes proveedores de datos:
– MSSQL Server 7.0 o superior.
– OLEDB
– ODBC
– ORACLE
• Además de estos hay varios otros proveedores de datos para otros
manejadores de bases de datos, como:
– Npgsql para PostgreSQL
– IBM DB2
– SQL Lite
– Sybase
– Firebird e Interbase
– MySQL
– Db4objects
– Etc.
5. Proveedores de datos
• Es recomendable utilizar un proveedor de datos
especifico para el manejador de base de datos a
usar si esta está disponible, ya que este
aprovecha completamente las características de
este, mejorando el rendimiento y la funcionalidad
ofrecida.
• La nomenclatura de las clases de ADO.NET es
sencilla. Dependiendo de el proveedor de datos
el nombre de las clases cambia, la nomenclatura
usada es <Proveedor>Nombre de clase.
7. Definición
ADO.NET permite el acceso desconectado a datos.
En este modelo se llena un DataSet a través de
un DataAdapter.
Cada proveedor de datos debe de brindar su
DataAdapter, el cual debe de ser el encargado
de llenar un DataSet y actualizar la base de
datos según los cambios en el DataSet.
El DataSet es una colección de DataTable, cada
una de ellas contiene DataRow y DataColumn.
10. Ejemplo
//Crea Dataset
Datos = new DataSet("CuentaBancaria");
//Crea un DataTable
DataTable tablaClientes = new DataTable("clientes");
DataColumn colNumcta = new DataColumn("numcta", typeof(int));
DataColumn colNombre = new DataColumn("nombre", typeof(string));
DataColumn colApellidos = new DataColumn(“apellidos", typeof(string));
/ DataColumn colSaldo = new DataColumn("saldo", typeof(double));
// Crea las columnas para el DataTable
tablaClientes.Columns.Add(colNumcta);
tablaClientes.Columns.Add(colNombre);
tablaClientes.Columns.Add(colApellidos);
tablaClientes.Columns.Add(colSaldo);
// Agrega la Tabla al DataSet
Datos.Tables.Add(tablaClientes);
11. Ejemplo…
// Crea nuevo Cliente
DataRow nuevoCliente = Datos.Tables["clientes"].NewRow();
// Asigna datos al nuevo cliente
nuevoCliente["numcta"] = 123;
nuevoCliente["nombre"] = "Claudia";
nuevoCliente[“apellidos"] = "Lopez";
nuevoCliente["saldo"] = 1500.55;
// Agrega nuevo cliente a tabla de clientes
Datos.Tables["clientes"].Rows.Add(nuevoCliente);
12. Ejemplo
//Crea Dataset
Datos = new DataSet("CuentaBancaria");
//Crea un DataTable
DataTable tablaClientes = new DataTable("clientes");
// Crea las columnas para el DataTable
tablaClientes.Columns.Add(new DataColumn("numcta", typeof(int)));
tablaClientes.Columns.Add(new DataColumn("nombre", typeof(string)));
tablaClientes.Columns.Add(new DataColumn(“apellidos”, typeof(string)));
tablaClientes.Columns.Add(new DataColumn("saldo", typeof(double)));
// Agrega la Tabla al DataSet
Datos.Tables.Add(tablaClientes);
// Crea nuevo Cliente
DataRow nuevoCliente = Datos.Tables["clientes"].NewRow();
// Asigna datos al nuevo cliente
nuevoCliente["numcta"] = 123;
nuevoCliente["nombre"] = "Claudia";
nuevoCliente[“apellidos"] = “Lopez";
nuevoCliente["saldo"] = 1500.55;
13. Propiedades de Columna
• Datatype. Establece el tipo de dato a almacenar, el valor prestablecido
es string
• Unique . Permite la existencia de valores repetidos, el valor
prestablecido es false
• AllowDBNull. Permite que no tenga información la columna, el valor
prestablecido es true.
• Caption. Es el nombre de la columna por default es el valor establecido
en el constructor.
• AutoIncrement. Establece si el campo es de auto incremento, el valor
prestablecido es n.
• AutoIncrementSeed. Establece el valor inicial de la columna, el valor
prestablecido es 0.
• AutoIncrementStep. Establece el incremento para un campo
incremental, el valor prestablecido es 1.
14. Columna como llave primaria
• Generalmente, una tabla de base de datos tiene una columna o
grupo de columnas que identifican de manera exclusiva cada fila
de la tabla. Esta columna o grupo de columnas de identificación
se denomina llave primaria.
• Al identificar una única DataColumn como la PrimaryKey para
una DataTable, la tabla establece automáticamente la
propiedad AllowDBNull de la columna como false y la
propiedad Unique como true. Para las llaves primarias de
varias columnas sólo se establece de forma automática la
propiedad AllowDBNull en false.
• La propiedad PrimaryKey de una DataTable recibe como valor
una matriz de uno o varios objetos DataColumn, como se
muestra en los ejemplos siguientes. En el ejemplo se define una
sola columna como llave primaria.
tablaClientes.PrimaryKey = new DataColumn[] {
tablaClientes.Columns["numcta"] };
15. Columnas Calculadas
• En ocasiones es necesario contar con columnas
con información generada a partir de otras
columnas.
tablaClientes.Columns["NombreCompleto"].Expression =
"nombre + ‘ ’ + apellidos";
17. Métodos para Serialización XML
• DataSet ofrece manejo directo de documentos y
esquemas XML
– ReadXml(string ArchXML)
– ReadXmlSchema(string ArchXML)
– WriteXml(string ArchXSD)
– WriteXmlSchema(string ArchXSD)
18. Ejemplo
Datos = new DataSet();
…
// Guarda el esquema del DataSet
Datos.WriteXmlSchema(@"c:usersgerardodatos.xsd");
// Guarda ls Datos en formato xml
Datos.WriteXml(@"c:usersgerardodatos.xml");
…
// Recupera el esquema del DataSet
Datos.ReadXmlSchema(@"c:usersgerardodatos.xsd");
// Recupera los Datos en formato xml
Datos.ReadXml(@"c:usersgerardodatos.xml");
19. Eliminación de DataRow
• Delete (). Elimina un DataRow
• Datos.Tables["clientes"].Rows[0].Delete();
21. Control de Cambios
• Mientras se están realizando cambios en un
conjunto de datos mediante la actualización,
inserción y eliminación de registros, el conjunto
de datos mantiene las versiones original y actual
de los registros.
• Se puede realiza el seguimiento de la propiedad
RowState de cada fila para indicar si los
registros están en su estado original o si se han
modificado, agregado o eliminado.
22. Control de Cambios
• Se puede confirmar los cambios llamando al método
AcceptChanges de DataSet, DataTable o DataRow.
• Cada fila de datos contiene información sobre la
propiedad RowState ( Added, Modified, Deleted,
Unchanged).
• Al llamar a AcceptChanges, cualquier objeto
DataRow que aún esté en el modo de edición finaliza
correctamente el proceso de edición. La propiedad
RowState de cada DataRow también cambia; las
filas en estado Added y Modified se convierten en
Unchanged, y se quitan las filas Deleted.
23. Control de Cambios
• Al llamar a AcceptChanges, cualquier objeto
DataRow que aún esté en el modo de edición
finaliza correctamente el proceso de edición. La
propiedad RowState de cada DataRow también
cambia; las filas en estado Added y Modified se
convierten en Unchanged, y se quitan las filas
Deleted.
• Al invocar al método RejectChanges se cancelar
cualquier edición, la fila vuelve a sus valores
anteriores y la propiedad RowState permanece
sin cambios.
24. Busquedas en DataTable
• Select(). Obtiene una vector de todos los objetos
DataRow
DataRow []info =null;
info = Datos.Tables["clientes"].Select();
if (info != null)
{
for (int i = 0; i < info.Length;i++ )
Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]);
}
25. Busquedas en DataTable
– Select (string criterio). Obtiene una vector de
todos los objetos DataRow que coinciden con los
criterios de filtro por orden de clave principal (o si
ésta no existe, por orden de adición).
info = Datos.Tables["clientes"].Select("nombre = 'claudia‘ ");
if (info != null)
{
for (int i = 0; i < info.Length; i++ )
Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]);
}
26. Busquedas en DataTable
• Select(string criterio, string ordenar). Obtiene
una matriz de todos los objetos DataRow que
coinciden con los criterios de filtro, en el criterio
de ordenación especificado.
info = Datos.Tables["clientes"]. Select("numcta< 10020", "nombre ASC");
if (info != null)
{
for (int i = 0; i < info.Length; i++ )
Console.WriteLine("{0} {1}",info[i]["numcta"], info[i]["nombre"]);
}
27. Buscar un DataRow
• Find(ClavePrincipal) Obtiene la fila especificada
por el valor de clave principal. Obtiene la fila
especificada por el valor de clave principal.
// Busca numcta (Numero de Cuenta )
DataRow reg = Datos.Tables["clientes"].Rows.Find(10038);
if (reg != null)
{
Console.WriteLine("{0} {1}", reg["numcta"], reg["nombre"]);
}
28. Ejercicio
Desarrolle una aplicación para el control del acervo bibliográfico de
una biblioteca, tome en cuenta que se tienen libros con préstamo
a domicilio.
El programa debe contar con lo siguiente:
a) Adquirir nuevo libro.
b) Adquirir mas libros de alguno registrado
c) Prestar un libro (si es posible ya que siempre deberá quedar
uno en la biblioteca)
d) Retornar un Libro.
e) Mostar una lista de libros con la existencia disponible
Agregue al programa la posibilidad de recuperar y guardar la
información de los libros en algún archivo.
29. Ejercicio
• Desarrolle una programa que mantenga el control de los
empleados de una empresa tomando en cuenta que se
tienen los datos personales del empleado (código,
nombre, apellidos), una relación de los nombres de los
distintos departamentos, así como otra relación de los
puestos existentes con su respectivo sueldo.
• No olvide que cada empleado pertenece a un
departamento y cuenta con un puesto.
• El programa debe agregar nuevos empleados,
departamentos o puestos, además de emitir un listado de
los empleados registrados y aunado a de los reportes de
los distintos departamentos y puestos.
• Es importante que los datos sean almacenados y
recuperados de un archivo.
31. Relaciones en DataSet
Crea una relación
dsRecursosHumanos.Relations.Add(
"Departamento_Empleados",
dtDepartamentos.Columns["depID"],
dtEmpleados.Columns["empDepto"],
true
);
32. Relaciones en DataSet
• Recuperación de datos padre de una relación
dsRecursosHumanos.Relations.Add(
"Departamento_Empleados",
dtDepartamentos.Columns["depID"],
dtEmpleados.Columns["empDepto"]
);
for (int i = 0; i < dtEmpleados.Rows.Count; i++) {
// Recupera datos de la relacion
DataRow drDepto =
dtEmpleados.Rows[i].GetParentRow("Departamento_Empleados");
Console.WriteLine("{0} {1} {2} {3}", dtEmpleados.Rows[i]["empID"],
dtEmpleados.Rows[i]["empNombre"],
drDepto["depNombre"]
);
}
33. Relaciones en DataSet
• Recuperación de datos hijos de una relación
dsRecursosHumanos.Relations.Add(
"Departamento_Empleados",
dtDepartamentos.Columns["depID"],
dtEmpleados.Columns["empDepto"]
);
for (int i = 0; i < dtDepartamentos.Rows.Count; i++)
{
// Muestra los departamentos
Console.WriteLine(" Departamento {0} {1} ",
dtDepartamentos.Rows[i]["depID"],
dtDepartamentos.Rows[i]["depNombre"]);
// Recupera Datos de empleados del departamento
DataRow[] drEmpleados = dtDepartamentos.
Rows[i].GetChildRows("Departamento_Empleados");
// Muestra los empleados del departamento
foreach (DataRow emp in drEmpleados ){
Console.WriteLine("{0} {1} {2}",emp["empID"],
emp["empNombre"],
emp["empApellidos"]);
}
34. Actualización y eliminación en cascada
• Al establecer una relación entre tablas se
establece restricciones que al hacer
actualizaciones o eliminaciones en la tabla padre
se aplican en cascada a la tabla hija.
35. Ejercicio
• Del Ejercicio anterior emita un reporte de los
empleados por departamento y de los
empleados por puesto, así como eliminar
empleados, departamento o puesto.
36. Restricciones en DataSet
• Se pueden utilizar restricciones con el fin de
mantener la integridad de los datos. Una restricción
es una regla automática que se aplica a una columna
relacionada, que determina cómo proceder cuando
se modifica de alguna manera el valor de una fila.
• Existen dos tipos de restricciones en ADO.NET:
ForeignKeyConstraint y UniqueConstraint. De
forma predeterminada, las dos restricciones se crean
automáticamente al crear una relación entre dos o
más tablas agregando DataRelation al DataSet. Sin
embargo, se puede deshabilitar este comportamiento
especificando false en el tercer parámetro al crear la
relación.
37. Restricciones en DataSet
ForeignKeyConstraint
• Esta regla establece cómo se propagan las
actualizaciones y eliminaciones a las tablas relacionadas.
Por ejemplo, si se actualiza o elimina el valor de una fila
de una tabla y el mismo valor también se utiliza en una o
varias tablas relacionadas, ForeignKeyConstraint
determinará qué sucede en las tablas relacionadas.
• Las restricciones se aplican cuando la propiedad
System.Data.DataSet.EnforceConstraints del DataSet es
true
• Las propiedades DeleteRule y UpdateRule de
ForeignKeyConstraint definen la acción que se ha de
realizar cuando el usuario intente eliminar o actualizar una
fila en una tabla relacionada.
38. Restricciones en DataSet
Establecimiento de reglas Descripción
Cascade
Elimina o actualiza las filas
relacionadas.
SetNull
Establece los valores de las filas
relacionadas en DBNull.
SetDefault
Establece los valores de las filas
relacionadas en el valor
predeterminado.
None
No realiza ninguna acción en las filas
relacionadas. Este es el valor
predeterminado.
Estos valores se encuentran en la enumeración Rule
39. Restricciones en DataSet
• Crear una Restricción
ForeignKeyConstraint fkEmpleadosDeparatamento =
new ForeignKeyConstraint(
“fkEmpleados_Departamentos",
dtDepartamentos.Columns["depID"],
dtEmpleados.Columns["empDepto"]);
fkEmpleadosDeparatamento.DeleteRule = Rule.None;
fkEmpleadosDeparatamento.UpdateRule = Rule.Cascade;
dtEmpleados.Constraints.Add(fkEmpleadosDepartamento);
40. Ejercicio
• Complemente el Ejercicio anterior permitiendo
realizar actualizaciones a las claves y nombres
de departamento así como a las claves, nombres
de puesto y sueldo.
41. Ejercicio
• Al ejercicio Biblioteca agregue la posibilidad de
mantener un catalogo de usuarios, los cuales
deberán esta relacionados con los prestamos
realizados.
• Debiendo además contar con las opciones de
suspender usuario, activar y eliminar usuario
siempre y cuando no cuente con libros
prestados.
43. Acceso base de datos de SQL Server
• Utilizar espacios de nombre
– System.Data.SqlClient
– System.Data.SqlTypes
44. Crear una conexión con SQL Server
• Uso de SqlConnection
Establecer los parámetros de la cadena de
conexión
– data source
– initial catalog
– uid
– pwd
string strCon = @“Data Source = miservidor.net;
Initial Catalog=inventario; UID=userdb; PWD=123;";
SqlConnection conexion = new SqlConnection(strCon);
conexion.Open();
45. Crear una conexión con SQL Server
• Otro uso de SqlConnection
Establecer los parámetros de la cadena de
conexión
– Server
– DataBase
– uid
– pwd
string strCon =
@“Server=miservidor.net;
DataBase=clientes; UID=userdb; PWD=123;";
SqlConnection conexion = new SqlConnection(strCon);
conexion.Open();
46. Creación de Base de Datos y tablas en SQL
Server
• CREATE DATABASE clientes;
• USE clientes;
• CREATE TABLE cuentas (numcta INT PRIMARY
KEY IDENTITY(1,1), nombre VARCHAR(40),
saldo DECIMAL);
47. DataSet con inserción en SQL Server
// Define cadena de conexión
string cadenaConexion = @"server=db.gerardobeltran.net;
DataBase=clientes;uid=techsoft;
pwd=12AB34cd";
// Establece Objeto de Conexión
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
//Abre Conexión con el servidor
conexionSql .Open();
// Crea objeto de Comando Select
SqlCommand comandoSelect = conexionSql.CreateCommand();
//Define Tipo de Instruccion a ejecutar (SQL)
comandoSelect.CommandType = CommandType.Text;
// Define Cadena Sql de consulta
string cadenaSql = @"SELECT * FROM cuentas";
// Establece cadena Sql para el comando Select
comandoSelect.CommandText = cadenaSql;
48. DataSet con inserción en SQL Server
// Crea objeto adaptador de datos
SqlDataAdapter daClientes = new SqlDataAdapter(comandoSelect);
// Crea Comando de construccion de intrucciones SQL
SqlCommandBuilder cbClientes = new SqlCommandBuilder(daClientes);
// Crea Data ser para contener los datos de la consulta
DataSet dsClientes = new DataSet("Clientes");
// Obtiene el esquema de la tabla cuentas desde el servidor
daClientes.FillSchema(dsClientes, SchemaType.Source, "Cuentas");
// Obtiene los datos de la tabla cuentas desde el servidor
daClientes.Fill(dsClientes, "Cuentas");
// Crea una instancia de una nuevo registro
DataRow drCliente = dsClientes.Tables["Cuentas"].NewRow();
// Captura los nuevos datos
Console.Write("Nombre: "); drCliente["nombre"] = Console.ReadLine();
Console.Write("Saldo: ");drCliente["saldo"] =
Convert.ToDouble(Console.ReadLine());
49. DataSet insertando en SQL Server
// Agrega el nuevo registro la tabla del DataSet
dsClientes.Tables["Cuentas"].Rows.Add(drCliente);
Console.WriteLine("El numero de cuenta asignado es: {0}",
drCliente["numcta"]);
Envia los datos al servidor SQL
daClientes.Update(dsClientes, "Cuentas");
// Libera el DataSet
daClientes.Dispose();
//Libera el adaptador de datos
daClientes.Dispose();
// Cierra la conexion con el servidor
conexionSql.Close();
50. DataSet seleccionando desde SQL Server
// Define cadena de conexión
string cadenaConexion = @"server=db.gerardobeltran.net;
DataBase=clientes;uid=techsoft;
pwd=12AB34cd";
// Establece Objeto de Conexión
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
//Abre Conexión con el servidor
conexionSql .Open();
// Crea objeto de Comando Select
SqlCommand comandoSelect = conexionSql.CreateCommand();
//Define Tipo de Instruccion a ejecutar (SQL)
comandoSelect.CommandType = CommandType.Text;
// Define Cadena Sql de consulta
string cadenaSql = @"SELECT * FROM cuentas";
// Establece cadena Sql para el comando Select
comandoSelect.CommandText = cadenaSql;= cadenaSql;
51. DataSet seleccionando desde SQL Server
// Crea objeto adaptador de datos
SqlDataAdapter daClientes = new SqlDataAdapter(comandoSelect);
// Crea Comando de construccion de intrucciones SQL
SqlCommandBuilder cbClientes= new SqlCommandBuilder(daClientes);
// Crea Data ser para contener los datos de la consulta
DataSet dsClientes = new DataSet("Clientes");
// Obtiene el esquema de la tabla cuentas desde el servidor
daClientes.FillSchema(dsClientes, SchemaType.Source, "Cuentas");
// Obtiene los datos de la tabla cuentas desde el servidor
daClientes.Fill(dsClientes, "Cuentas");
// Crea una instancia del DataTable Clientes
DataTable dtClientes = dsClientes.Tables["Cuentas"];
for (int i=0; i<dtClientes.Rows.Count; i++){
Console.WriteLine("{0} {1} {2}", dtClientes.Rows[i]["numcta"],
dtClientes.Rows[i]["nombre"], dtClientes.Rows[i]["saldo"]);
}
52. Acceso base de datos de MySql
• Instalar Proveedor de acceso a datos de Mysql.
– Descargar de www.mysql.com
• Agregar referencia a biblioteca de MySql en
Visual Studio desde la pestaña .NET
• Utilizar espacios de nombre
– MySql.Data.MySqlClient
– MySql.Data.Types
– MySql.Data.Common
53. Crear una conexión con MySQL
• Uso de MySqlConnection
Establecer los parámetros de la cadena de
conexión
– Server
– DataBase
– uid
– pwd
string strCon =
@"server=miservidor.net;
DataBase=clientes;uid=userdb; pwd=123;";
MySqlConnection conexion = new MySqlConnection(strCon);
conexion.Open();
54. Crear una conexión con MySQL
• Otro uso de MySqlConnection
Establecer los parámetros de la cadena de
conexión
– data source
– initial catalog
– uid
– pwd
string strCon = @"data source = miservidor.net;
initial catalog=inventario; uid=userdb; pwd=123;";
MySqlConnection conexion = new MySqlConnection(strCon);
conexion.Open();
55. Creación de Base de Datos y tablas en
MySQL
• CREATE DATABASE clientes;
• USE clientes;
• CREATE TABLE cuentas (numcta INT PRIMARY
KEY AUTO_INCREMENT, nombre
VARCHAR(40), saldo DECIMAL);
56. Acceso a Productos de Office
• Para el caso de acceso a productos (Access y
Excel) de Office 2007 y 2010, se requiere de
proveedores actualizados por lo que es
necesario descargarlos gratuitos de
http://www.microsoft.com/es-
es/download/details.aspx?id=13255
• El espacio de nombres requerido son:
– System.Data.OleDb;
57. Crear una conexión con ACCESS
• Uso de OleDbConnection
Establecer los parámetros de la cadena de
conexión
– data source
– Provider
– Password
string strCon = @"Data Source=
c:usersgerardoarchdb.accdb;
Provider=Microsoft.ACE.OLEDB.12.0;
Jet OLEDB:Database Password=123;";
OleDbConnection conexion = new OleDbConnection(strCon);
conexion.Open();
58. Crear una conexión con EXCEL
• Uso de OleDbConnection
Establecer los parámetros de la cadena de
conexión
– data source
– Provider
– Extended Properties
string strCon = @"Data Source=
c:basededatosarchdb.xlsx;
Provider=Microsoft.ACE.OLEDB.12.0;
Extended Properties=Excel 12.0;";
OleDbConnection conexion = new OleDbConnection(strCon);
conexion.Open();
59. Relaciones entre tablas
En SQL Server
create table cuentas (
numcta int IDENTITY(100,1) PRIMARY KEY,
nombre varchar(40)
);
create table movimientos (
nummov int identity(1000,1) PRIMARY KEY,
tipo int,
cantidad decimal ,
movcta int references cuentas(numcta)
) ;
60. Relaciones entre tablas
string cadenaConexion = @"Data Source=servidordb.net;
Initial catalog=clientes;uid=sa;
pwd=12345678";
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
conexionSql.Open();
// Crea adaptador para cada tabla
SqlDataAdapter daCuentas =
new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql);
SqlDataAdapter daMovimientos =
new SqlDataAdapter(@"SELECT * FROM movimientos", conexionSql);
// Crea DataSet
DataSet dsClientes = new DataSet("Clientes");
// Recupera información de la tabla cuentas desde la base de datos
daCuentas.FillSchema(dsClientes, SchemaType.Source, "Cuentas");
daCuentas.Fill(dsClientes, "Cuentas");
// Recupera información de la tabla movimientos desde la base de datos
daMovimientos.FillSchema(dsClientes, SchemaType.Source, "Movimientos");
daMovimientos.Fill(dsClientes, "Movimientos");
61. Relaciones entre tablas
// Agrega Una relacion Cliente-Movimientos
dsClientes.Relations.Add("Cliente_Movimientos",
dsClientes.Tables["cuentas"].Columns["numcta"],
dsClientes.Tables["movimientos"].Columns["movcta"]
false);
// Crea una instancia para cada tabla
DataTable dtClientes = dsClientes.Tables["Cuentas"];
DataTable dtMovimientos = dsClientes.Tables["Movimientos"];
// Muestra los clientes con sus movimientos
for (int i = 0; i < dtClientes.Rows.Count; i++){
Console.WriteLine("{0} {1} {2}", dtClientes.Rows[i]["numcta"],
dtClientes.Rows[i]["nombre"]);
DataRow[] Movs = dtClientes.Rows[i].GetChildRows("Cliente_Movimientos");
foreach (DataRow reg in Movs){
Console.WriteLine("{0} {1} {2}", reg["nummov"],
Convert.ToInt32(reg["tipo"]) == 1) ? "Deposito" : "Retiro",
reg["cantidad"]);
}
}
62. Creando Comandos insert, update y delete
con ComandBuilder
string cadenaConexion = @"Data Source=servidordb.net;
Initial catalog=clientes;uid=sa;
pwd=12345678";
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
conexionSql.Open();
// Crea adaptador para tabla cuentas
SqlDataAdapter daCuentas =
new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql);
// Crea comandos insert, update y delete
SqlCommandBuilder cbClientes = new SqlCommandBuilder(daCuentas);
63. Creando Comandos insert
string cadenaConexion = @"Data Source=servidordb.net;
Initial catalog=clientes;uid=sa;
pwd=12345678";
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
conexionSql.Open();
// Crea adaptador para tabla cuentas
SqlDataAdapter daCuentas =
new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql);
// Crea comando insert
daCuentas.InsertCommand = new SqlCommand(@"insert into cuentas
(nombre, saldo) values (@nombre, @saldo)",conexionSql);
// Define parametros con el nombre de la columnas
daCuentas.InsertCommand.Parameters.Add(
new SqlParameter("@nombre", SqlDbType.VarChar,40, "nombre"));
daCuentas.InsertCommand.Parameters.Add(
new SqlParameter("@saldo", SqlDbType.Decimal,10, "saldo"));
64. Creando Comandos Update
string cadenaConexion = @"Data Source=servidordb.net;
Initial catalog=clientes;uid=sa;
pwd=12345678";
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
conexionSql.Open();
// Crea adaptador para tabla cuentas
SqlDataAdapter daCuentas =
new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql);
// Crea comando update
daCuentas.InsertCommand = new SqlCommand(@"update cuentas set
nombre=@nombre, saldo=@saldo where numcta=@numcta", conexionSql);
// Define parametros con el nombre de la columnas
daCuentas.UpdateCommand = new SqlCommand(@"update cuentas set
nombre=@nombre, saldo=@saldo where numcta=@numcta", conexionSql);
daCuentas.UpdateCommand.Parameters.Add(
new SqlParameter("@nombre", SqlDbType.VarChar, 40, "nombre"));
daCuentas.UpdateCommand.Parameters.Add(
new SqlParameter("@saldo", SqlDbType.Decimal, 10, "saldo"));
daCuentas.UpdateCommand.Parameters.Add(
new SqlParameter("@numcta", SqlDbType.Int, 10, "numcta"));
65. Creando Comandos Delete
string cadenaConexion = @"Data Source=servidordb.net;
Initial catalog=clientes;uid=sa;
pwd=12345678";
SqlConnection conexionSql = new SqlConnection(cadenaConexion);
conexionSql.Open();
// Crea adaptador para tabla cuentas
SqlDataAdapter daCuentas =
new SqlDataAdapter(@"SELECT * FROM cuentas",conexionSql);
// Crea comando update
daCuentas.InsertCommand = new SqlCommand(
@"delete from cuentas where numcta=@numcta", conexionSql);
// Define parametros con el nombre de la columnas
daCuentas.DeleteCommand.Parameters.Add(
new SqlParameter("@numcta", SqlDbType.Int, 10, "numcta"));