none
Si se detiene el programa, al ejecutar de nuevo continuar donde se quedo actualizando el tipo de cambio en C# RRS feed

  • Pregunta

  • Buenos días, espero puedan ayudarme,

    Tengo unas dudas y realmente no se como hacerlo.

    Tengo que hacer un programa que actualice el tipo de cambio para 10 empresas en distintos servidores que son: 
    - server001
    - server002
    - server003 (en este se engloban 8 bases de datos.)

    Estoy trabajando con SQL SERVER 2008 y VS C# 2012.

    Necesito realizar en puros if anidados que si al ejecutar y actualiza las 3 primeras empresas y se detiene el programa (por error de red o se haya ido la luz, lo que sea) al volver a ejecutar el programa debe actualizar el tipo de cambio hasta la 4 empresa o donde se haya quedado el programa actualizando antes de suceder el error.

    No se si es hacer conexiones a la base de datos en if anidados

    Espero me haya dado a entender. Gracias


    • Editado Cashmere VM viernes, 27 de abril de 2018 17:13
    viernes, 27 de abril de 2018 17:12

Respuestas

  • ¿Es forzoso hacerlo necesariamente en C#? Lo digo porque ya que estás usando SQL SERVER 2008, podrías usar SQL Server Integration Services (SSIS) para realizar la actualización de datos. Y si lo configuras bien, SSIS ya tiene una opción que sirve precisamente para lo que quieres, es decir, que si se interrumpe la actualización continúe desde donde se interrumpió.

    Basta habilitar esa opción, y no tienes que hacer nada en tu programa, internamente ya lleva un registro de la última tarea que se ejecutó y continúa desde ahí al volverlo a lanzar.

    Y, por cierto, en SSIS se pueden incorporar tareas hechas en C#, así que si es necesario realizar algún cálculo complejo que no se pueda hacer directamente con las herramientas de SSIS, siempre puedes hacer una subrutina en C# e incorporarla en el paquete de SSIS.

    • Marcado como respuesta Cashmere VM sábado, 28 de abril de 2018 14:05
    sábado, 28 de abril de 2018 9:21
    Moderador
  • Puedes implementar algo manualmente. En lugar de hacer una enorme cantidad de IF-ELSE, que te va a quedar liadísimo y difícil de mantener, separa todos los pasos a ejecutar en subrutinas individuales, y haz una lista de todas las subrutinas y la secuencia en la que se tienen que ejecutar. Después haces un bucle que vaya tomando entradas de esa lista y las vaya mandando ejecutar. Cada vez que avances a la siguiente tarea, salvas en algún sitio (por ejemplo, un ficherito de texto en disco) cuál es el último paso que ejecutaste. Si el programa se interrumpe, al volverlo a iniciar lees desde disco ese número de paso y continúas ejecutando las tareas de la lista a partir de ese paso.

    Desde luego, si lo consideras conveniente, esto se puede refinar tanto como haga falta, por ejemplo, si alguna de las tareas consiste en ir leyendo registros desde algún sitio e insertándolos en una tabla, puedes llevar un contador que indique cuál es el número de registro por el que ibas, y si se interrumpe, continuar desde ese número (que también salvarías en el ficherito mencionado).

    • Marcado como respuesta Cashmere VM sábado, 28 de abril de 2018 15:46
    sábado, 28 de abril de 2018 15:27
    Moderador

Todas las respuestas

  • ¿Es forzoso hacerlo necesariamente en C#? Lo digo porque ya que estás usando SQL SERVER 2008, podrías usar SQL Server Integration Services (SSIS) para realizar la actualización de datos. Y si lo configuras bien, SSIS ya tiene una opción que sirve precisamente para lo que quieres, es decir, que si se interrumpe la actualización continúe desde donde se interrumpió.

    Basta habilitar esa opción, y no tienes que hacer nada en tu programa, internamente ya lleva un registro de la última tarea que se ejecutó y continúa desde ahí al volverlo a lanzar.

    Y, por cierto, en SSIS se pueden incorporar tareas hechas en C#, así que si es necesario realizar algún cálculo complejo que no se pueda hacer directamente con las herramientas de SSIS, siempre puedes hacer una subrutina en C# e incorporarla en el paquete de SSIS.

    • Marcado como respuesta Cashmere VM sábado, 28 de abril de 2018 14:05
    sábado, 28 de abril de 2018 9:21
    Moderador
  • Gracias por la respuesta pero si me lo pidieron necesariamente en C# espero haya una forma de hacerlo o me puedas orientar un poco al respecto, estaba pensando que podria hacerse con puros IF-ELSE para esta situación pero no se como realizarlo. De todos modos investigare sobre el SSIS

    Espero me puedas ayudar en eso. Gracias
    sábado, 28 de abril de 2018 14:07
  • Puedes implementar algo manualmente. En lugar de hacer una enorme cantidad de IF-ELSE, que te va a quedar liadísimo y difícil de mantener, separa todos los pasos a ejecutar en subrutinas individuales, y haz una lista de todas las subrutinas y la secuencia en la que se tienen que ejecutar. Después haces un bucle que vaya tomando entradas de esa lista y las vaya mandando ejecutar. Cada vez que avances a la siguiente tarea, salvas en algún sitio (por ejemplo, un ficherito de texto en disco) cuál es el último paso que ejecutaste. Si el programa se interrumpe, al volverlo a iniciar lees desde disco ese número de paso y continúas ejecutando las tareas de la lista a partir de ese paso.

    Desde luego, si lo consideras conveniente, esto se puede refinar tanto como haga falta, por ejemplo, si alguna de las tareas consiste en ir leyendo registros desde algún sitio e insertándolos en una tabla, puedes llevar un contador que indique cuál es el número de registro por el que ibas, y si se interrumpe, continuar desde ese número (que también salvarías en el ficherito mencionado).

    • Marcado como respuesta Cashmere VM sábado, 28 de abril de 2018 15:46
    sábado, 28 de abril de 2018 15:27
    Moderador
  • Gracias, y como dices por el SSIS, debo hacerlo para cada base de datos y solo llamarlo por mi btn en c# o como lo podría hacer, si tienes un ejemplo sobre lo que necesito podrías ayudarme por favor.
    sábado, 28 de abril de 2018 16:02
  • Si lo haces con SSIS, depende de lo bien que domines el SSIS. Es posible configurar en SSIS un bucle que vaya cambiando la cadena de conexión y se conecte a distintas bases de datos. O, si no son muchas, puedes copiar y pegar la tarea de transferencia de datos tantas veces como bases de datos tengas, y configurarlas una por una. Esto se hace gráficamente en el diseñador de SSIS arrastrando y soltando las distintas tareas y haciendo click encima y configurándoles las propiedades; no se me ocurre ninguna manera sencilla de poner un ejemplo.

    Una vez que hayas configurado el paquete de SSIS y lo hayas probado a mano, entonces sí, desde tu programa cliente en C# lo que harías desde el click del botón es enviarle una llamada al SQL Server para que ejecute el paquete. Una forma sencilla de hacerlo es llamar a Process.Start para ejecutar una llamada al dtexec con el nombre del paquete como parámetro. Otra forma es meter el paquete de ssis en un Job del Agente, y desde el botón llamar a un SP en SQL que lance el Job del Agente.

    domingo, 29 de abril de 2018 9:55
    Moderador