2009-07-27 15 views
6

Chcę uruchomić mój plik skryptu .sql przy użyciu mojej witryny ASP.NET za pośrednictwem ADO.NET. Jak to możliwe, że nie działa?Jak uruchomić plik skryptu .sql za pośrednictwem ADO.NET?

Kiedy próbuję

'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 

otrzymuję wyjątki gdy oświadczenie GO wykonywane w skrypcie. Jak mogę rozwiązać ten problem?

Odpowiedz

13

Patrz mój post na blogu o Handling GO Separators in SQL - The Easy Way. Sztuką jest użycie metody SMO's ExecuteNonQuery(). Na przykład, oto niektóre kod, który będzie uruchomić wszystkie skrypty w katalogu, niezależnie od separatorów 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

Należy jednak pamiętać, że uzależnienie od SMO będzie wymagało od aplikacji wstępnej instalacji redystrybucji SMO, co stanowi niewielką niedogodność. Ale prawdziwym zabójcą transakcji jest to, że SMO jest specyficzne dla wersji i będzie się z niej zgadzać odmawia połączenia się z wyższymi wersjami SQL: aplikacja opracowana przy użyciu SMO z SQL 2k5 nie połączy się z serwerem SQL 2k8, co wymaga od dewelopera wydania nowego wersja aplikacji korzystającej z SMO 2k8. –

+0

Remus, dobre punkty. Nie są to aż tak wielkie sprawy, gdy uruchamiasz skrypty na własnej stronie internetowej, o które pyta Mahomet. –

+0

Dzięki za pomoc. Mam nadzieję, że wkrótce uda się znaleźć ogólne i niezależne od platformy rozwiązanie. jeśli robisz pls udostępnij tutaj. Jeszcze raz dziękuję –

7

GO nie jest instrukcją języka Transact-SQL, jest ogranicznikiem partii narzędzi. Serwer słusznie skarży się na błąd składni, gdy GO jest napotykany w pakiecie. Musisz podzielić plik na partie, a następnie wykonać poszczególne partie. Użyj wyrażenia regularnego, które dzieli plik inot i rozpoznaje wielkość liter w urządzeniu GO w jednym wierszu.

2

To dlatego, że GO nie jest natywną instrukcją TSQL, jest używane w Management Studio/Enterprise Manager do dzielenia skryptu na partie.

albo trzeba:
1) podzielić ją na wielu indywidualnych skryptów na każdy GO oświadczenie
2) użyć klasy serwera w ciągu SQL Management Przedmioty, jako przykładowa here

3

Jest jeden drobny problem z wykorzystaniem metody dzielenia wykonanie partii. Problemem są komentarze. Powiedzmy, że nie masz władzy nad zawartością plików. Po prostu musisz go wykonać. GO w komentarzu wieloliniowym będzie problemem w każdym przykładzie rozwiązania, który dzieli kod sql za pomocą "GO" jako separatora. Przykład:

[some sql code] 
GO 

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

[some sql code] 
GO 

Będzie to wymagało nieco bardziej skomplikowanej analizy niż podział. To nie zadziała:

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

Ten kod również ignoruje, że spacje mogą prowadzić GO.

0

Będziesz musiał wykonać dwie analizy składniowe. Pierwsze przejście to usunięcie wszystkich komentarzy i utworzenie nowego ciągu. Drugie przejście polega na użyciu podziału REGEX na podstawie słowa kluczowego GO.

Powiązane problemy