[ Foro de C# ]

Incertidumbre con nuevo proyecto

08-Aug-2014 13:21
Jose Valdes Sirvent
19 Respuestas

Hola muchachada!
Un cliente me ha pedido un programa "pequeño" en winforms (algo que no domino para nada.. pero bueno, habrá que ponerse!) para llevar las estadísticas de compras de proveedores y demás.
Como es una empresa de flores (con varias tiendas y tal), quiere llevar el control de proveedores, productos, color (de las flores), fecha, cantidades, precios.. Y sobretodo, hacer todo tipo de búsquedas y medias y tal, para hacerse su propio estudio.. en fin! lo que es una base de datos detoalavida! Pero claro, el tío la quiere en plan "programa de windows".
En principio le he dicho que sí (al toro!), pero realmente, ahora me pongo a pensarlo.. y.. cómo lo hago?? con linq?? (otra cosa de la que no estoy nada familiarizado!! :P).
Yo le había propuesto hacerlo en formato web con php y sql, para tenerlo todo centralizado (y podría reutilizar muchísimo código), pero él dice que no, que lo quiere en plan ventanitas..

Se supone que no necesita tener la información en ningún servidor, que con tenerla guardada en modo local, es suficiente.. Pero creo que al tener un volumen de información relativamente grande, no será suficiente con "un par de arrays o arraylist y tirar de ficheros o serializar..". Creo que hará falta sql.

Se puede trabajar con sql y c#? cómo? por dónde empiezo?! :'(

Como veis.. no tengo miedo de meterme en cosas que no conozco demasiado puesto que me gusta experimentar y soy bastante tozudo y hasta que no me sale algo, no paro.

En fin.. cómo me recomendarías hacerlo? la verdad es que no se ni por dónde empezar.. se os ocurre alguna alternativa mejor a lo que os he comentado??

Un saludo y muchísimas gracias por todo!!! :D


08-Aug-2014 14:33
Luis Torres (+18)

Si el cliente tiene varias tiendas, necesitará un servidor e internet para poder accesar desde cada una de las tiendas a la base de datos con toda la información sobre los proveedores, la flores y de más. ¿Lo más adecuado no sería php?


08-Aug-2014 14:35
Jose Valdes Sirvent

Es lo que yo le dije, pero dice que es una aplicación para uso suya, que no quiere tenerla en todas partes. Solo quiere tener los datos en su pc. Es solo para llevar un control de sus propias estadísticas de compra (la venta irá en otro programa aparte)


08-Aug-2014 17:35
Luis Torres (+18)

Está bien, pero la base de datos debería ser la misma, porque entonces se corre el riesgo de que se produzcan inconsistencias entre los datos, además habrá mayor trabajo en llevar dos bases de datos. Es mejor una sola base de datos e implementar restricciones, de manera que solo él tenga el permiso de accesar a los datos de los proveedores, productos y características de los mismos. Lo que sí va a variar es que la manera de obtener todos estos datos será con una aplicación aparte, tal como la describiste anteriormente. Ojalá el prof. Nacho pueda dar su opinión.


08-Aug-2014 18:16
Jose Valdes Sirvent

No no. Solo necesita una base de datos ese programa. El otro programa va totalmente aparte. No tienen por qué comunicarse entre sí.

Mi pregunta es: Puedo hacer que mi programa en winforms y C# tenga una base de datos? Cómo? Por dónde empiezo..?

Muchísimas gracias por la ayuda!! :D


08-Aug-2014 20:50
Luis Torres (+18)

Como lenguaje moderno que es, con C# se puede manejar bases de datos, pero esto se hace creando clases, tal como lo indica la Programación Orientada a Objeto. Por cierto, los pasos a seguir son parecidos a cuando te conectas a MySQL con PHP, por lo que no creo que tengas muchos problemas.

Saludos.


09-Aug-2014 01:04
Nacho Cabanes (+84)

Unas pocas pinceladas breves:

a) Puedes hacer una aplicación "local" con PHP y MySQL si usas XAMPP o Uniform Server. Si además usas un "framework" como bootstrap, que permita (entre otras cosas) mostrar "ventanas de diálogo" al estilo del escritorio, la diferencia visual con un programa nativo no será exagerada y tú podrás reutilizar código.

b) Con lo que conoces de C# y de Visual Studio, en un par de horas tendrás una soltura básica con Windows Forms. El entorno básico es simple. Algún elemento que tendrás que usar, como los DataGrid, es un poco más engorroso, pero nada que sea insalvable.

c) Desde C# puedes acceder a muchos gestores de bases de datos distintos: Sql Server (que se te instala en las junto con Visual Studio), Sqlite (si quieres algo ligero), MySQL, Oracle, etc.

Yo te diría de olvidar esas dos últimas (y todas las exóticas, como FireBird, PostgreSQL, etc) y escoger una de las dos primeras: o bien SQLite si quieres algo que funcione en cuanto "copies y pegues" la DLL junto con tu ejecutable, o bien Sql Server Express si estás dispuesto a instalar parte de Visual Studio en el equipo del cliente o a aprender a crear "instaladores" para tu aplicación finalizada (en un proyecto pequeño a medida, para mí suele ser más práctico lo primero).


09-Aug-2014 01:11
Jose Valdes Sirvent

Muchísimas gracias Nacho! Voy a informarme sobre bootstrap y sqlite! creo que son lo más factible!!

En unos días os cuento qué tal lo llevo..!! :D


09-Aug-2014 05:05
Luis Torres (+18)

Prof. Nacho: ¿dónde puedo aprender a crear instaladores?

Jose Valdes Sirvent, ¿podrías explicar tu experiencia sobre cómo conseguiste al cliente que te mandó a hacer la aplicación? Comenta un poco. Supongo que vives en España y me gustaría conocer el mercado de trabajo allá.

Saludos.


09-Aug-2014 07:58
Jose Valdes Sirvent

Sí, vivo en España.  Pues mi experiencia fue pura casualidad. Una amiga que conoce al dueño de una pequeña empresa que necesita un programador y le habla de mi.. Pura suerte y casualidad. Lo cierto es que la siuación laboral en España es penosa, y más concreramente en mi ciudad, no hay mercado para la programación.. Como te digo, fue pura casualidad..


11-Aug-2014 11:02
Jose Valdes Sirvent

Me uno a la pregunta de Luis Torres, e intento contestarla..
Para crear un instalador "ultrasencillo" para un programa similar al mío.. Básicamente podría crear un segundo programa (que sería el instalador) que hiciese lo siguiente:
- Crear una carpeta en Archivos de Programa con el nombre de mi programa.
- Mover el ejecutable de mi programa a esa carpeta.
- Mover la dll de sqlite a esa carpeta, o bien a una carpeta llamada dll (y ya me habré ocupado yo de utilizar las rutas relativas necesarias).
- Crear una carpeta llamada "DataBases" que será donde se guarden por defecto las diferentes bases de datos con las que pueda trabajar mi cliente (de nuevo, ya me habré encargado de usar rutas relativas).
- Crear un acceso directo en el escritorio.

Y me surgen dos dudas:
- Es posible que mi programa y la dll se integre dentro de ese mismo ejecutable instalador? y que no sean tres archivos distintos en una primera instancia?
- Tendré permisos de escritura por defecto de la carpeta "Archivos de programa" sin hacer nada o tendré que hacer alguna historia rara?

Ambas dudas son fácilmente solucionables.. La primera metiendo los archivos en un zip y solo teniendo a la vista el setup.. y la segunda, utilizando alguna otra carpeta..

En fin.. un saludo y muchas gracias a todos!!


11-Aug-2014 11:08
Jose Valdes Sirvent

Por cierto.. he estado viendo el tema del bootstrap.. pero no le veo la forma de hacerlo "en plan ventanitas". O bien me estoy saltando algo.. o bien voy a tener que tirar de WinForms sí o sí..
No obstante volveré a hablar con el cliente para dejarle claro las limitaciones que tendrá su proyecto si es que realmente lo quiere así..

Otra duda que me surge.
Sería posible, si utilizo mysql que el programa busque la base de datos en internet? de esa forma quizá sería la mejor opción, puesto que así por lo menos la base de datos sería la misma en todos los ordenadores, limitándole el uso del programa a ordenadores con conexión a internet, eso sí.

Como última y cutre opción.. ya sería cuestión de instalarle el programa dentro de dropbox o similar.. pero la verdad es que esa opción no la barajo por "cutre". Si quiere una bdd centralizada, que sea en un servidor, y si la quiere local, que sea local..


12-Aug-2014 20:42
Nacho Cabanes (+84)

No es que bootstrap lo haga por ti "en plan ventanitas", sino que simplifica ciertas tareas que son simples en escritorio y pesadas en web como las ventanas emergentes para avisos o introducción de (pocos) datos.

Tu programa puede usar MySQL en local y conectar a Internet, pero, como tú mismo has visto como conclusión: si es local, local; si es centralizado, la forma más simple es un servidor al que conectar terminales que no tienen datos en local; si no, la sincronización es un trabajazo enorme (y por el que no te van a pagar ni las horas que se lleva ni los quebraderos de cabeza posteriores). En teoría es algo tan simple como que cada registro de la BBDD tenga un campo de "ya se ha volcado al servidor". En la práctica, la situación se va complicando con inconsistencias, posibles duplicados, accesos simultáneos... esquívalo.


12-Aug-2014 20:53
Jose Valdes Sirvent

Estoy empezando con sqlite. De momento ya estoy empezando a hacer cosillas.. pero he visto que sqlite a diferencia de mysql.. tiene algunas diferencias:

Pros de mysql:
- mysql es un motor de base de datos como dios manda y puedes hacer absolutamente todo con ella.
- Pueden trabajar con ella miles de usuarios a la vez sin ningún tipo de problema.

Contras de mysql:
- Necesitas instalar xamp y cosas así para funcionar en local.
- Exportar una bdd es más difícil que con sqlite

Pros de Sqlite:
- No requiere ninguna instalación adicional más que agregar el dll como referencia en el proyecto.
- Al crear una bdd se crea un archivo, y ese es tu base de datos. Para exportarla es tan fácil como copiarla y pegarla.

Contras:
- Tiene ciertas limitaciones en comparación con mysql debido a su simplicidad.
- Se supone que es monousuario. Si más de un usuario trabaja a la vez con la misma bdd puede crear problemas...

Al final me estoy tirando con sqlite porque quiero que mi programa sea simple. Pinchar y a funcionar.. sin tener que instalar programas aparte ni nada. Que el cliente, si quiere formatear, solo tenga que llevar cuidado de guardar el archivo de la bdd y nada más.

Obviamente, tendré que avisarle de las limitaciones que tendrá.. pero es que él me las ha exigido así..


12-Aug-2014 21:26
Nacho Cabanes (+84)

Buena síntesis. Sólo dos matizaciones:

- No hace falta instalar XAMPP, puedes instalar sólo el propio MySQL desde el paquete oficial, si vas a usarlo desde lenguajes como C# o Java.

- Para exportar desde MySQL puedes usar PhpMyAdmin, que lo hace en dos clics. Para hacer copia de seguridad, puedes comprimir la carpeta "data", como alternativa rápida, aunque es arriesgado en caso de upgrade, por si de una versión a otra cambian internamente algún detalle sobre los formatos de datos y no se reconoce correctamente tu carpeta de datos original.


13-Aug-2014 15:10
Jose Valdes Sirvent

Y entonces el "servidor" sería el pc donde instalase mysql? Y para conectarme a esa BD desde otro pc en la misma red local.. cómo lo haría?
La verdad es que el tema de ip's, y mapear puertos y demás historias lo llevo bastante mal... Sería posible? Quizá aún estoy a tiempo de usar mysql..


14-Aug-2014 00:34
Nacho Cabanes (+84)

El servidor de bases de datos puede ser el mismo equipo (imitando lo que harías con SqLite), y así simplificas la estructura. Tendrías un aviso del cortafuegos de Windows para confirmar que no quieres bloquear a MySQL y ya está. Hacerlo por red es ligeramente más complicado (ya son dos los programas que debes desbloquear), hace más incómodas las copias de seguridad y ralentiza el funcionamiento general, así que yo descartaría esa opción en una instalación local.

Necesitarías instalar también el "connector" de MySQL para .Net:

http://dev.mysql.com/downloads/connector/net/



19-Aug-2014 13:35
Jose Valdes Sirvent

Hola Nacho.
Pues al final estoy haciéndolo con winforms y sqlite. Y llevando cuidado de abrir y cerrar la conexión en cada operación.. en principio para trabajar uno o dos usuarios a la vez.. no debería darme demasiados problemas (todo con try catch, de forma que en caso de que el fichero esté bloqueado simplemente avise con un "inténtalo de nuevo").

No obstante tengo una duda con uno de tus tutoriales..
Más constantemente con este bloque de código:


private void ActualizarListaCiudades()
{

             conexion =
               new SQLiteConnection
               ("Data Source=personal.sqlite;Version=3;New=False;Compress=True;");

             conexion.Open();
 
             lstCiudades.Items.Clear();

 
             // Lanzamos la consulta y preparamos la estructura para leer datos
             string consulta = "select * from ciudad";
             SQLiteCommand cmd = new SQLiteCommand(consulta, conexion);

             SQLiteDataReader datos = cmd.ExecuteReader();
             // Leemos los datos de forma repetitiva
             while (datos.Read())

             {
                 string codigo = Convert.ToString(datos[0]);

                 string nombre = Convert.ToString(datos[1]);
                 // Y los mostramos

                 ListViewItem item = new ListViewItem(codigo);
                 item.SubItems.Add(nombre);

                 lstCiudades.Items.Add(item);
             }
             conexion.Close();

         }


Esa es la forma más básica de recorrer con un while los datos obtenidos de una select, pero mi duda es.. en este caso, no habría que cerrar la variables datos con un datos.Close() ? O puede que en este caso no sea necesario y en otros casos sí?

Lo digo porque he tenido problemas de que se me quedaba bloqueada la base de datos por no cerrar los SQLiteDataReader.. y después de asegurarme de cerrarlos todos tras cada operación, se acabaron los problemas..
Es esto un pequeño error del manual, o es que después de leerlo entero con un while se cierra solo?

Un saludo Nacho!!

PD: aunque no venga al caso.. las clases empiezan el 3 con una presentación.. o empezamos ya el 3 a saco? Es que me voy de viaje a Asturias.. no contaba con empezar tan pronto!! :(


21-Aug-2014 12:55
Nacho Cabanes (+84)

Efectivamente, deberías cerrar la conexión tras cada consulta (o reutilizarla después en vez de volverla a abrir, lo que prefieras).

Y sí, las clases comienzan este año el día 3 (para segundo curso), pero supongo que ese día serán las presentaciones y tendrás un poco de margen si no llegas justo ese día.


21-Aug-2014 13:26
Jose Valdes Sirvent

El caso es que no cerrar la conexion no me da problemas. Es decir, yo puedo hacer...
enlace.Open();
consulta1;
consulta2;
consulta3;
enlace.Close();

Sin ningún tipo de problema.

Lo que me da problemas es el SQLiteDataReader. Es decir, no puedo hacer:

enlace.Open();

SQLiteDataReader datos = comando1.ExecuteReader();
while(datos.Read());
{}

datos = comando2.ExecuteReader();
while(datos.Read());
{}
datos.Close();

enlace.Close();

El código superior me bloque la BDD. La forma correcta de usarlo es así:

enlace.Open();
SQLiteDataReader datos = comando1.ExecuteReader();
while(datos.Read());
{}
datos.Close();

datos = comando2.ExecuteReader();
while(datos.Read());
{}
datos.Close();

enlace.Close();






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)