Aplicacion cliente servidor

18/07/2008 - 16:28 por Luis B | Informe spam
Hola a todos, alguien sabe de alguna aplicacion cliente servidor de ejemplo
o que este libre, donde se muestre en la practica el uso de las capas:
-Origen de datos: BD SQL, MySql, etc.
-Logica de negocios: DataSet, DataAdapter, Command, Connection, etc
-Interfaz: Formularios Windows

En general o mas bien el uso ya en la practica de Ado.Net
De verdad agradezco cualquier comentario

________________________
Lic. Luis Ballinas
Movil: 55-2878-9003 Mex, DF.
kikeballinas(arroba)yahoo.com.mx

Preguntas similare

Leer las respuestas

#1 Bernardino Vega
19/07/2008 - 02:33 | Informe spam
Que tal Luis, por que no te bajas la aplicación MSDN Video disponible en el
siguiente enlace. Existe la versión 2003 y la 2008, hay videos explicativos,
el código de la aplicación, etc. Está muy completa te la recomiendo.

http://www.desarrollaconmsdn.com


Un saludo desde la Ciudad de México.
Bernardino Vega

"Luis B" escribió en el mensaje
news:
Hola a todos, alguien sabe de alguna aplicacion cliente servidor de
ejemplo o que este libre, donde se muestre en la practica el uso de las
capas:
-Origen de datos: BD SQL, MySql, etc.
-Logica de negocios: DataSet, DataAdapter, Command, Connection, etc
-Interfaz: Formularios Windows

En general o mas bien el uso ya en la practica de Ado.Net
De verdad agradezco cualquier comentario

________________________
Lic. Luis Ballinas
Movil: 55-2878-9003 Mex, DF.
kikeballinas(arroba)yahoo.com.mx


Respuesta Responder a este mensaje
#2 Juanato
19/07/2008 - 20:59 | Informe spam
Aquís os propongo el modelo que uso, fusilado de cuando hace 14 años,
programaba en Xbase, y aislé la capa de negocio de la capa de datos (por
aquel entonces, tablas de datos locales, sin necesitar capa propiamente
cliente-servidor).

Mi modelo actual es:


MODELO ORIENTADO A OBJETOS EN C# DE CAPA NEGOCIO y CLIENTE-SERVIDOR



CAPA CLIENTE-SERVIDOR

Subcapa SESION ADO.-

Necesitaremos un objeto que mantenga la conexión ADO con la base de
datos, e incluso que las posibilidades de que sean tablas locales como
ACCESS o SQL embebido (SQL COMPACT EDITION) o conexiones a SERVIDOR
(Express, SqlClient ó producto comercial basado en Microsoft o terceros).


using negocio; // Capa de negocio de EUROCPS




Métodos de la clase CONEXIONADO



namespace sesion
/*

Sesión de la conexion ADO al servidor de datos


*/

{
public class ConexionAdo
{
internal string cCadena = "Data Source=JUANATO\\SQLEXPRESS;"+
"Initial Catalog=eurocps;"+"Integrated Security=True";
// Recogemos la apertura del programa
internal StreamWriter oGraba;

internal SqlConnection oConexion;

internal lErrorConexion = false;


public void ConexionADO()
{
try
{
default lErrorConexion = false; // Para recoger errores
ocurridos solo en esta capa
SqlConnection oConexion = new SqlConnection( cCadena);
StreamWriter oGraba = new StreamWriter(new
FileStream("\\eurocps.err", FileMode.Append));

}
catch (exception e)
{
// De momento, se depuran errores
VerError("ERROR DE ACCESO A DATOS EN CONEXIONADO " + e.Message );
GrabaError(e.Message);
}
}

public void Nueva()
{
// para proximas versiones
set{ this.cCadena = value;}

}
/*
Falta el método que realiza una comprobación de la existencia en el
path de la aplicación del fichero EUROCPS.INI
Contiene cadena de conexion y otros parámetros

Si no existe el fichero, se crea con la cadena de conexión OLEDB-ACCESS
Si existe el fichero, se lee y se sobreescribe la cadena de
conexión usando el método .Nueva()

File.Exists(path2)

*/
public void Abrir()
{

if (oConexion.State == ConnectionState.Closed)
{ oConexion.Open(); }


// Suponemos que comprueba que esté abierta la conexión

//get{ this.oConexion};
//Abre la conexión ADO, y se asegura
}
// Método llamado cuando se CIERRA el form principal
public void Cerrar()
{
// Se sale de la conexión
// Cierra la sesión ADO
if (oConexion.State == ConnectionState.Open)
{ oConexion.Close(); }

// Buffer cerrado
oGraba.Close();
oConexion.Dispose();
oGraba.Dispose();

}
// Accedemos desde la capa negocio a una instancia de la SesionADo
public void instanciar()
{

{ get this.oConexion;}
}


public void GrabaError( string cTexto)
// Gestión de errores fichero/pantalla
// Se va a usar por extensión para grabar la entradasalida de
procesos y eventos
{
// Provoca la instancia del objeto en caso de que la excepcion
haya llegado por oConexion
if (oGraba = null)
{ StreamWriter oGraba = new StreamWriter(new
FileStream("\\eurocps.err", FileMode.Append))};


oGraba.WriteLine("Fecha: " + DateTime.Now.Day + "/" +
DateTime.Now.Month + "/" + DateTime.Now.Year + "; Hora: " +
DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second);
oGraba.WriteLine(cTexto);
oGraba.WriteLine("**********************************
**************************************");

}

// Muestra la excepción que ha producido la grabación en
fichero.
public void VerError( string cTexto)
{

MessageBox.Show(cTexto, “Vale”, MessageBoxButtons.OK,
MessageBoxIcon.Error);


}


// Atiende una consulta sobre el Dataset dado

public bool LanzaConsulta( string cExpresion, object
oCliente, object oServidor)
{
// Inicia el sqlcommand para recoger el dataset

private sqlcommand oVistaSQL; // Nos permite filtrar
la tabla para búsqueda
private bool lValido = false


try
{
// Llamada al método de ConexionADO que mantiene la
conexión
oVistaSQL = new SqlCommand( cExpresion, oConexion);
oVistaSQL.CommandType = CommandType.Text;
oServidor.SelectCommand = oVistaSQL;
oServidor.fill( oCliente);
lValido = true; //Podemos rellenar el dataset
}

catch (exception e)
{
oSesionAdo.GrabaError( "SE HA PRODUCIDO UN ERROR AL
BUSCAR DATOS. CAPA CLIENTE-SERVIDOR-SESION");
oSesionAdo.VerError("SE HA PRODUCIDO UN ERROR AL BUSCAR
DATOS. CAPA CLIENTE-SERVIDOR.SESION");
lValido = false;
}
} // Fin LanzaConsulta





}// Fin namespace sesion






Sesion es la capa que nos permite tener oSesion instanciado. Así mismo
los miembros son:

lErrorConexion, cCadena, oGraba, oConexion

Aunque la variable lErrorConexion aún no se gestiona, pretende ser pila
del retorno de otras capas de un error por booleano, dejando constancia
para poder leer lo que genera el objeto oGraba a fichero.

Los métodos que usa la clase:

Nueva.- SETTER de cCadena. Permite alterar la cadena de conexión antes
de instancia oConexion.
Abrir.- Genera una conexión ADO.NET con instancia de oConexion.
Cerrar.- Comprueba si está aún abierta la conexión en una instancia de
oConexion, y la cierra.
Instanciar.- Recoge en la capa que llama al método una nueva instancia
de oConexion, para poder ser usado en el futuro para realizar consultas
sql y poder expresarla sobre capa cliente-servidor.
GrabarError y VerError. Para depuración de errores, el programa siempre
generará un fichero log, y el usuario verá esa actividad a través de
mensajes en pantalla. Dependiendo de la gravedad de lo ocurrido, el
programa no entrará en procesos vitales, quedando la ejecución limitada
al menú principal. Todo ellos se podrá comprobar observando el fichero
eurocps.err, presente en la unidad donde ejecuta el binario en el nodo raíz.
CAPA CLIENTE-SERVIDOR

using negocio;

namespace cliente-servidor

// capa conectada a la de negocio

{
/* tableadapters -> capa servidor
y datasets -> capa cliente
*/

// Personas Fisicas MAESTRO

class pfmae
{
// Instancias de tableadapters y datasets

private SqlDataAdapter servidor;
private dataset cliente;
private negocio oNegocio;
// Usamos el objeto de nuestra capa de negocio

public void pfmae()
{
// Instancias de objetos procedentes capa negocio y capa servidor

try
{
servidor = new sqlDataAdapter();
cliente = new dataset();
oNegocio = new negocio();
servidor.TableMappings.Add("Table", "pfmae");
}
catch (exception e)
{
// está instanciada oSesionAdo desde capa negocio
oSesionAdo.GrabaError(e.Message);
oSesionAdo.VerError();
oSesionAdo.HayError(); // Setter de lError
}

}

// capa servidor a capa cliente
public bool Srv2Cli()
{
default bool lValido = false;

try
{
servidor.Fill(cliente); // Se
entiende que es monotabla, por comodidad
}
catch (exception e)
{
/*
Ni nos preocupamos por la excepcion
lo atiende la capa anterior
*/

oSesionAdo.GrabaError( "SE HA PRODUCIDO UN ERROR AL ACTUALIZAR
DATOS. CAPA CLIENTE");
oSesionAdo.VerError("SE HA PRODUCIDO UN ERROR AL ACTUALIZAR DATOS.
CAPA CLIENTE.SRV2CLI");
lValido = false;

}

}
// capa cliente a capa servidor
public bool Cli2Srv()
{
default bool lValido = false;

try
{
servidor.Update(cliente); // Se entiende
que es monotabla, por comodidad
}
catch (exception e)
{
/*
Ni nos preocupamos por la excepcion
lo atiende la capa anterior
*/

oSesionAdo.GrabaError( "SE HA PRODUCIDO UN ERROR AL ACTUALIZAR DATOS.
CAPA SERVIDOR");
SesionAdo.VerError("SE HA PRODUCIDO UN ERROR AL ACTUALIZAR DATOS. CAPA
SERVIDOR.CLI2SRV");
lValido = false;

}



}

public bool NuevoPF( array aRegistro )

{
// Bajamos a la capa negocio, para recoger nuestras variables

default bool lValido = false;

try
{
oNegocio.Mem2Reg( cliente.PFMAE.row,
aRegistro );

}
catch (exception e)
{
/*
Ni nos preocupamos por la excepcion
lo atiende la capa anterior
*/

oSesionAdo.GrabaError( "SE HA PRODUCIDO UN ERROR AL
ACTUALIZAR DATOS. CAPA NEGOCIO");
oSesionAdo.VerError("SE HA PRODUCIDO UN ERROR AL ACTUALIZAR DATOS.
CAPA NEGOCIO.ALTA PFMAE.NUEVOPF");
lValido = false;

}



}
public bool BorraPF( array aRegistro )

{
// Capa negocio -> capa cliente-servidor

default bool lValido = false;

try
{
// Se usa .find porque se accede para borrar por clave primaria
SIEMPRE
cliente.Row oRowBuscar = cliente.PFMAE.Rows.Find(aRegistro[0]);
oRowBuscar.Delete();
lValido = true;


}
catch (exception e)
{
/*
Ni nos preocupamos por la excepcion
lo atiende la capa anterior
*/

oSesionAdo.GrabaError( "SE HA PRODUCIDO UN ERROR AL ELIMINAR
DATOS. CAPA NEGOCIO");
oSesionAdo.VerError("SE HA PRODUCIDO UN ERROR AL ELIMINAR DATOS.
CAPA NEGOCIO.PFMAE.BORRAPF");
lValido = false;

}


}


// Recordar que se maneja desde array a registro y viceversa en
capa negocio


Explicación:

Cada entidad que se mantiene a nivel de tabla en este programa, a parte
de nombrarse por los prefijos que hemos establecido, se mantendrá por el
siguiente tipado de objetos, miembros y métodos.

NOTA.- Se ha omitido heredar de la clase eurocps-tabla, que tendria los
métodos básicos, por falta de tiempo.



CLASE PFMAE

Mantenimiento de la tabla MAESTRO DE PERSONAS FISICAS

Variables miembros:

servidor, instancia de un tablesqladapter que luego se le hace un
binding con la tabla. En este caso, pfmae.

cliente, instancia de un dataset monotabla, usado en este caso para pfmae.

Onegocio, instancia de la capa negocio, clase conexionado, namespace
sesion. Es usada para mantener la conexió Ado abierta y disponible para
la capa cliente-servidor.
METODOS DE LA CLASE

Srv2Cli().- Permite dejar rellenado el (cliente)dataset para que la capa
negocio use los métodos REG2MEM y MEM2REG desde el sqldatadapter(servidor).

Cli2Srv().- Su antagonista.-

NuevoPF().- Método para hacer un alta









*LINQ, pendiente

public class pfmae : DataContext
{
public Table<pfmae> pfmaes;
public pfmaes(string cConexion) : base(oConexion) { }
}

[Table(Name = "pfmae")]
public class pfmae
{
[Column(IsPrimaryKey = true)]
public string DNINIFNIE;
[Column]
public string APELLIDOS;
::::::
::::::
}

Aún no he llegado a poder integrar en el modulo con sencillez la
definición de las tablas, para poder crearlas en el servidor cuando se
poduce la pimera ejecución en el lugar del cliente. Permitiria hacer
portable la versión, usando SQL embebido para poder garantizar versiones
Windows Mobile/Blackberry. Blackberry puede correr aplicaciones
realizadas con un pluging en Visual Studio:

http://www.xatakamovil.com/2007/05/...ual-studio

public void CreataBDeurocps()
{
if (db.DatabaseExists())

{ db.DeleteDatabase();
MyDVDs db = new MyDVDs("c:\\eurocps\\eurocps.mdf");
db.CreateDatabase();
}
}



Pd.- Ahora bien, como muchos estareis mirando el código, os agradeceria
enriquecer este post, porque seguro que hay más de uno, que ha
conseguido integrar LINQ para generar las tablas en el servidor cuando
se conecta y comprueba que no existen, pudiendo hacer la aplicación MAS
PORTABLE.



¿ ALGUIEN SE ANIMA ?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida