2009-07-27 12 views
6

Voglio eseguire il mio file di script .sql utilizzando il mio sito Web ASP.NET tramite ADO.NET. Come potrebbe essere che non funzioni?Come posso eseguire il mio file di script .sql tramite ADO.NET?

Quando provo

'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 

ottengo eccezioni quando dell'istruzione GO eseguito nello script. Come posso risolvere questo problema?

risposta

13

Vedere il mio blog post su Handling GO Separators in SQL - The Easy Way. Il trucco è usare il metodo SMO's ExecuteNonQuery(). Ad esempio, ecco un po 'di codice che verrà eseguito tutti gli script in una directory, indipendentemente separatori 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

Nota che l'assunzione di una dipendenza da SMO richiederà all'applicazione di preinstallare SMO ridistribuibile, un piccolo inconveniente. Ma il vero killer è che SMO è specifico per la versione e rifiuta categoricamente di connettersi alle versioni superiori di SQL: un'applicazione sviluppata usando SMO da SQL 2k5 non si connetterà a SQL Server 2k8, richiedendo allo sviluppatore di rilasciare un nuovo versione della sua app che utilizza SMO 2k8. –

+0

Remus, buoni punti. Questi non sono un grosso problema quando si eseguono script sul proprio sito Web che Muhammad sta chiedendo. –

+0

Grazie per il vostro aiuto. spero di trovare presto una soluzione generica e indipendente dalla piattaforma. se fai pls condividi qui. grazie ancora –

7

GO non è un'istruzione Transact-SQL, è un delimitatore del lotto di strumenti. Il server si lamenta correttamente di un errore di sintassi quando GO viene rilevato in un batch. È necessario dividere il file in batch e quindi eseguire singoli batch. Utilizzare un'espressione regolare che suddivide il file inot batch e riconosce GO case insensitive su una singola riga.

2

È perché GO non è in realtà un'istruzione TSQL nativa, è utilizzato in Management Studio/Enterprise Manager per dividere lo script in batch.

vi sia bisogno di:
1) dividerlo in più script individuali su ciascun GO dichiarazione
2) utilizzare la classe di server all'interno di SQL Management Objects, come exampled here

3

C'è un piccolo problema con l'utilizzo di metodo splitting per l'esecuzione batch. Il problema sono i commenti. Di 'che non hai alcun potere sul contenuto dei file. Hai solo bisogno di eseguirlo. GO all'interno di un commento su più righe sarà il problema in ogni esempio di soluzione qui che divide il codice SQL utilizzando "GO" come separatore. Esempio:

[some sql code] 
GO 

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

[some sql code] 
GO 

Ciò richiederà un parsing più complicato di una semplice divisione. Questo non funzionerà più:

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

Questo codice ignora anche che gli spazi possono portare il GO.

0

È necessario eseguire due passaggi di analisi. La prima volta che passa è rimuovere tutti i commenti e creare una nuova stringa. Il secondo passaggio consiste nell'utilizzare lo split REGEX basato sulla parola chiave GO.

Problemi correlati