141 votos

Cómo ejecutar un .Archivo de script de SQL usando c#

Estoy seguro de que esta pregunta ha sido respondida ya, sin embargo, era incapaz de encontrar una respuesta utilizando la herramienta de búsqueda.

El uso de c# me gustaría ejecutar un .archivo sql. El archivo sql que contiene varias instrucciones sql, algunos de los cuales se divide en varias líneas. Traté de lectura en el archivo y trató de ejecutar el archivo con ODP.NET ... sin embargo no creo que ExecuteNonQuery está realmente diseñado para ello.

Así que he intentado utilizar sqlplus a través de un proceso de desove ... sin embargo, a menos que me generó el proceso con UseShellExecute establece en true sqlplus se cuelgan y no salga nunca. Aquí está el código que NO funciona.

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;

bool started = p.Start();
p.WaitForExit();

WaitForExit nunca vuelve.... A menos que me puse UseShellExecute a la verdad. Un efecto secundario de UseShellExecute es que usted no puede capturar el redirige la salida.

Esta debe ser una cosa común a hacer, tengo la esperanza de que alguien tiene una solución para esto.

Gracias Rica

109voto

Hacko Puntos 431

He probado esta solución de Microsoft.SqlServer.La gestión pero no funciona bien con el .NET 4.0 así que me escribió otra solución utilizando .RED de bibliotecas marco solo.

  string script = File.ReadAllText(@"E:\someSqlScript.sql");

  // split script on GO command
  IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$", 
                           RegexOptions.Multiline | RegexOptions.IgnoreCase);

  Connection.Open();
  foreach (string commandString in commandStrings)
  {
    if (commandString.Trim() != "")
    {
      new SqlCommand(commandString, Connection).ExecuteNonQuery();
    }
  }     
  Connection.Close();

8voto

Binoj Antony Puntos 7519

Poner el comando para ejecutar la secuencia de comandos sql en un archivo de proceso por lotes, a continuación, ejecute el siguiente código

string batchFileName = @"c:\batosql.bat";
string sqlFileName = @"c:\MySqlScripts.sql";
Process proc = new Process();
proc.StartInfo.FileName = batchFileName;
proc.StartInfo.Arguments = sqlFileName;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.ErrorDialog = false;
proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(batchFileName);
proc.Start();
proc.WaitForExit();
if ( proc.ExitCode!= 0 )

en el archivo de proceso por lotes escribir algo como esto (muestra de sql server)

osql -E -i %1

4voto

Rich Puntos 1123

Me las arreglé para obtener la respuesta por leer el manual :)

Este extracto de la MSDN

El ejemplo de código, se evita el interbloqueo condición llamando p.StandardOutput.ReadToEnd antes de p.WaitForExit. Una condición de interbloqueo si el proceso padre de las llamadas de p.WaitForExit antes de p.StandardOutput.ReadToEnd y la proceso hijo escribe el texto suficiente para rellenar la secuencia redirigida. El padre proceso de esperar indefinidamente para el proceso hijo para salir. El niño proceso de esperar indefinidamente para el padre leer completo Secuencia de StandardOutput.

Existe un problema similar cuando se lee todos los textos, tanto en la salida estándar y el error estándar de los arroyos. Para ejemplo, el siguiente código de C# realiza una operación de lectura en ambos los arroyos.

Convierte el código en este;

                    Process p = new Process();
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.FileName = "sqlplus";
                    p.StartInfo.Arguments = string.Format("xxx/xxx@{0} @{1}", in_database, s);

                    bool started = p.Start();
                    // important ... read stream input before waiting for exit.
                    // this avoids deadlock.
                    string output = p.StandardOutput.ReadToEnd();

                    p.WaitForExit();

                    Console.WriteLine(output);

                    if (p.ExitCode != 0)
                    {
                        Console.WriteLine( string.Format("*** Failed : {0} - {1}",s,p.ExitCode));
                        break;
                    }

Que ahora sale correctamente.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X