2009-07-27 23 views
6

Quiero ejecutar mi archivo de script .sql utilizando mi sitio web ASP.NET a través de ADO.NET. ¿Cómo podría ser que no está funcionando?¿Cómo ejecuto mi archivo de script .sql a través de ADO.NET?

Cuando intento

'dbScript is a string and contains contents of the .sql file' 
Dim cmd As New SqlCommand(dbScript, con) 
Try 
    con.Open() 
    cmd.ExecuteNonQuery() 
Catch ex As Exception 
Finally 
    con.Close() 
    cmd.Dispose() 
End Try 

me sale excepciones cuando instrucción GO ejecutado en escritura. ¿Como puedo solucionar este problema?

Respuesta

13

Ver mi post sobre Handling GO Separators in SQL - The Easy Way. El truco es usar el método SMO's ExecuteNonQuery(). Por ejemplo, aquí hay un código que se ejecuta todos los scripts en un directorio, independientemente de separadores GO:

using System; 
    using System.IO; 
    using System.Data.SqlClient; 
    using System.Collections.Generic; 

    //Microsoft.SqlServer.Smo.dll 
    using Microsoft.SqlServer.Management.Smo; 
    //Microsoft.SqlServer.ConnectionInfo.dll 
    using Microsoft.SqlServer.Management.Common; 

    public class RunAllSqlSriptsInDirectory 
    { 
     public static void Main() 
     { 
      string scriptDirectory = "c:\\temp\\sqltest\\"; 
      string sqlConnectionString = "Integrated Security=SSPI;" + 
       "Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)"; 
      DirectoryInfo di = new DirectoryInfo(scriptDirectory); 
      FileInfo[] rgFiles = di.GetFiles("*.sql"); 
      foreach (FileInfo fi in rgFiles) 
      { 
       FileInfo fileInfo = new FileInfo(fi.FullName); 
       string script = fileInfo.OpenText().ReadToEnd(); 
       SqlConnection connection = new SqlConnection(sqlConnectionString); 
       Server server = new Server(new ServerConnection(connection)); 
       server.ConnectionContext.ExecuteNonQuery(script); 
      } 
     } 
    } 
+5

Tenga en cuenta que tomar una dependencia de SMO requerirá que su aplicación pre-instale el SMO redistribuible, un inconveniente menor. Pero el verdadero motivo de muerte es que SMO es específico de la versión y se negará rotundamente a conectarse a versiones superiores de SQL: una aplicación desarrollada utilizando SMO de SQL 2k5 no se conectará a SQL Server 2k8, lo que requerirá que el desarrollador lance una nueva versión de su aplicación que usa SMO 2k8. –

+0

Remus, buenos puntos. Estos no son tan importantes cuando estás ejecutando scripts en tu propio sitio web, pregunta Muhammad. –

+0

Gracias por su ayuda. Esperamos encontrar una solución genérica y independiente de la plataforma pronto. si lo haces, por favor comparte aquí. gracias de nuevo –

7

GO no es una instrucción de Transact-SQL, es un delimitador de lote de herramientas. El servidor se queja con razón de un error de sintaxis cuando se encuentra GO en un lote. Debe dividir el archivo en lotes y luego ejecutar lotes individuales. Use una expresión regular que divida el archivo en lotes y reconoce IR caso insensible en una sola línea.

2

Es porque GO no es realmente una declaración de TSQL nativa, se usa en Management Studio/Enterprise Manager para dividir la secuencia de comandos en lotes.

o hay que hacer:
1) dividirlo en varias secuencias de comandos individuales en cada declaración
2 GO) utilizar la clase Server dentro de SQL Management objetos, como ejemplificado here

3

Hay un pequeño problema con el uso de método de división para ejecutar lotes. El problema son los comentarios. Digamos que no tiene poder sobre el contenido de los archivos. Solo necesitas ejecutarlo. GO en un comentario de varias líneas será el problema en cada ejemplo de solución aquí que está dividiendo el código sql usando "GO" como separador. Ejemplo:

[some sql code] 
GO 

/* start of commented out sql code *********** 
[some sql code] 
GO 
end of commented out sql code ****************/ 

[some sql code] 
GO 

Esto requerirá un análisis más complicado que solo una división. Esto ya no funcionará:

Regex regex = new Regex("^GO", RegexOptions.IgnoreCase | RegexOptions.Multiline); 
string[] lines = regex.Split(sql); 

Este código también ignora que los espacios pueden conducir al GO.

0

Tendría que hacer un análisis de dos pasos. El primer pase es eliminar todos los comentarios y crear una nueva cadena. El segundo paso es usar la división REGEX basada en la palabra clave GO.

Cuestiones relacionadas