none
En vez de utilizar Batch utilizar C# RRS feed

  • Pregunta

  • Buenos días.

    Me ha surgido que estoy viendo muchos archivos Bat o batch.

    El caso es que la verdad no me es compresible.

    Me gustaría saber como puedo hacer lo equivalente de este Bat a C#

    @echo off
    REM: Archivo de comandos.[base_de_datos]
    
    if '%1' == '' goto usage
    if '%2' == '' goto usage
    
    if '%1' == '/?' goto usage
    if '%1' == '-?' goto usage
    if '%1' == '?' goto usage
    if '%1' == '/help' goto usage
    
    REM: Esquema
    sqlcmd -S %1 -d %2 -E -b -i "Mi archivo tipo.sql"
    if %ERRORLEVEL% NEQ 0 goto errors
    sqlcmd -S %1 -d %2 -E -b -i "Mi 2 archivo tipo.sql"
    if %ERRORLEVEL% NEQ 0 goto errors
    
    REM: Vistas
    
    REM: if '%2' == 'PRUEBA-DEV' sqlcmd -S %1 -d %2 -E -b -i "Mi 2 archivo tipo.sql"
    REM: if %ERRORLEVEL% NEQ 0 goto errors
    
    REM: Procedimientos
    
    REM: sqlcmd -S %1 -d %2 -E -b -Q "drop procedure MiPA"
    
    REM: Version
    sqlcmd -S %1 -d %2 -E -b -Q "insert Vehiculo(Matricula) values ('1234DGH')"
    
    goto finish
    
    REM: La pantalla
    :usage
    echo.
    echo Uso: Tirando voy
    echo.
    echo Ejemplo: MiCMD.cmd Servidor_principal Base_de_datos_principal
    echo.
    echo.
    goto done
    
    REM: Controlador de errores
    :errors
    echo.
    echo ADVERTENCIA: se detectaron errores
    echo --------------------------------
    echo Evalúe la situación y, si es necesario, reinicie
    echo este archivo de comandos. Puede que necesite
    echo proporcionar los parámetros de los comandos 
    echo al ejecutar este archivo de comandos.
    echo.
    goto done
    
    REM: Ejecución finalizada
    :finish
    echo.
    echo Ejecución de secuencia de comandos completada
    :done
    @echo on

    Puedo hacer lo mismo que en el bat, ¿Cuales son los equivalentes para?

    sqlcmd -S %1 -d %2 -E -b -i "Mi archivo tipo.sql"
    if %ERRORLEVEL% NEQ 0 goto errors
    sqlcmd -S %1 -d %2 -E -b -Q "drop procedure MiPA"
    sqlcmd -S %1 -d %2 -E -b -Q "insert Vehiculo(Matricula) values ('1234DGH')"

    Y si alguno de ellos me da error, ¿cómo hago para obtener el resultado?

    Saludos y gracias.


    • Editado El dubitativo jueves, 17 de mayo de 2018 16:01 Explicarme mejor
    jueves, 17 de mayo de 2018 16:00

Todas las respuestas

  • Nunca utilizo sqlcmd así que no conozco.  Su pregunta tal vez iría mejor en el foro de SQL Server, al menos la parte de qué significa cada comando.

    Una vez que sepa qué significa cada cosa, pues seguramente que en el foro de C# o mejor aún, en el ADO.Net, podríamos ayudar.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    jueves, 17 de mayo de 2018 19:31
    Moderador
  • Hola El dubitativo:

    Tu bat lo único que hace es en función de los parametros que le llegan ejecutar en modo comandos las sentencias sql que contienen los archivos "Mi archivo.sql", "Mi archivo2.sql"....

    y las sentencias DROP PROCEDURE MIPA="eliminar procedimiento almacenado mipa" y Insert into Matricula ="insertar un registro en la tabla matricula"....

    Lo que contienen los archivos, lo puedes ejecutar seguramente en el entorno sql, por tanto desde C# si abres una conexion a la base de datos tambien. (Si alguno no te funciona, es mirar la sintaxis de lo que pone).

    Y las sentencias, del mismo modo.

    Un ejemplo, aunque hay millones.

    https://msdn.microsoft.com/es-es/library/fksx3b4f.aspx

    Un ejemplo más completo

    http://www.elguille.info/NET/ADONET/sql_instrucciones_codigo_cs.aspx

    Un saludo

    viernes, 18 de mayo de 2018 6:55
  • Lo que quiero es hacer una aplicación que en vez de funcionar por bat funcione en C#.

    Y quiero que lea los archivos que lee el bat. Es decir los *.sql (NO LOS VOY A EJECUTAR EN SQL UNO A UNO) Ya que el bat de verdad es inmensamente mas largo y no tenía sentido mostrar ese absurdo. Cuando solo quieres dar una pequeña referencia

    Obviamente no quiero ejecutarlos 1 a 1 sino agregarlos al código de C# como una lista o así y que se vaya ejecutando. Pero para mi eso es irrelevante, ahora solo me interesa saber que instrucciones utilizar para hacer la equivalencia. Indicando el nombre del archivo como se hace en bat.

    He mirado los enlaces que me has pasado NO SIRVEN. Ya lo descarte al igual que otros tanto MILLONES. Ya que me interesa indicar el archivo sql a ejecutar y luego manejar la respuesta tal y como lo hace la instrucción en el BAT.

    Saludos

    viernes, 18 de mayo de 2018 9:53
  • No me interesan las instrucciones en SQL, ya que lo que se está haciendo con las instrucciones bat es ejecutar archivos *.sql 

    Me interesa saber el equivalente a esas Instrucciones en C#.

    No sé si ADO.Net me servirá mientras sea C# me da igual.

    viernes, 18 de mayo de 2018 9:56
  • Si puedes ejecutar sentencias sql

    Fijate que en el enlace de el guille, por ejemplo en todos los metodos hay un string que invoca a una sql desde el código de C#

    public int Insertar(string nombre, 
                string apellidos, string email, 
                DateTime fecha, string descripcion)
            {
                string sCon = CadenaConexion();
                string sel;
    /*sentencia sql a ejecutar invocada desde el codigo de c# */
                sel = "INSERT INTO " + NombreTabla + 
                    "(Nombre, Apellidos, Email, Fecha, Descripcion) " + 
                    "VALUES " + "(@Nombre, @Apellidos, @Email, @Fecha, @Descripcion) " + 
                    "SELECT @@Identity";
    
                using(SqlConnection con = new SqlConnection(sCon))
                {
                    SqlCommand cmd = new SqlCommand(sel, con);
                    cmd.Parameters.AddWithValue("@Nombre", nombre);
                    cmd.Parameters.AddWithValue("@Apellidos", apellidos);
                    cmd.Parameters.AddWithValue("@Email", email);
                    cmd.Parameters.AddWithValue("@Fecha", fecha);
                    cmd.Parameters.AddWithValue("@Descripcion", descripcion);
                    con.Open();
                    int t = Convert.ToInt32(cmd.ExecuteScalar());
                    con.Close();
                    return t;
                }
            }

    Un saludo

    viernes, 18 de mayo de 2018 10:18
  • Si me di cuenta, pero lo que parece que NO se observa es que NO voy a meter el contenido del fichero, sino solo su nombre, es por ello que estoy preguntado por el equivalente. Si fuera eso que me indicas no lo habría preguntado. Ya que lo que estoy buscando es configurar para ejecutar un archivo *.sql. NO QUIERO EJECUTAR: consulta EXPLICITAMENTE o un procedimiento EXPLICITO.
    lunes, 21 de mayo de 2018 10:18
  • Hola:

    Pero si lees el archivo sql, y lo asignas a una cadena.

    Ya dispones de la cadena con la sentencia a ejecutar.

    string line; 
    string contenido = ""; 
    
    // Read the file and display it line by line.  
    System.IO.StreamReader file =   
        new System.IO.StreamReader(@"c:\test.txt");  
    while((line = file.ReadLine()) != null)  
    {      
    contenido = contenido + line; 
    }  
    
    file.Close();  
    //contenido tiene la sentencia completa.

    Lo único que tienes que tener en cuenta es si la sentencia va a devolver datos, o es una inserccion u otra cosa.

    ExecuteNonQuery o ExecuteScalar....

    Un saludo

    lunes, 21 de mayo de 2018 10:27