2009-07-27 2 views
6

Я хочу запустить мой файл сценария .sql, используя мой сайт ASP.NET через ADO.NET. Как это могло быть, это не работает?Как запустить файл сценария .sql через ADO.NET?

Когда я пытаюсь

'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 

Я получаю исключения, когда GO оператор выполняется в сценарии. Как я могу исправить эту проблему?

ответ

13

Смотрите мой блог о Handling GO Separators in SQL - The Easy Way. Хитрость заключается в использовании метода SMO's ExecuteNonQuery(). Например, вот код, который будет выполнять все сценарии в каталоге, независимо от 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

Обратите внимание, что при использовании зависимости от SMO потребуется, чтобы ваше приложение предварительно устанавливало SMO, распространяемое, небольшое неудобство. Но реальный убийца сделок заключается в том, что SMO является специфичным для версии и отказывается отказываться от подключения к более высоким версиям SQL: приложение, разработанное с использованием SMO из SQL 2k5, не будет подключаться к SQL Server 2k8, требуя от разработчика выпуска нового версии своего приложения, которое использует SMO 2k8. –

+0

Ремус, хорошие моменты. Это не такая большая сделка, когда вы запускаете скрипты на своем собственном веб-сайте, о котором спрашивает Мухаммад. –

+0

Спасибо за помощь. надеемся вскоре найти общее и платформенное независимое решение. если вы делаете это. Еще раз спасибо –

7

GO не является оператором Transact-SQL, является разделителем партий инструментов. Сервер справедливо жалуется на синтаксическую ошибку, когда GO встречается в пакете. Вам нужно разбить файл на партии, а затем выполнить отдельные партии. Используйте регулярное выражение, которое разбивает файл в партиях и распознает регистр GO незаметно для одной строки.

2

Это потому, что GO на самом деле не является родным инструктором TSQL, он используется в Management Studio/Enterprise Manager для разделения скрипта на партии.

Вы либо должны:
1) разбить его на несколько отдельных сценариев на каждом GO заявление
2) использовать класс сервера в среде SQL Objects, а exampled here

3

Существует одна небольшая проблема, с использованием метода расщепления для выполнения пакетов. Проблема заключается в комментариях. Скажем, у вас нет полномочий над содержимым файлов. Вам просто нужно выполнить его. GO в многострочном комментарии будет проблемой в каждом примере решения здесь, который разбивает код sql, используя «GO» в качестве разделителя. Пример:

[some sql code] 
GO 

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

[some sql code] 
GO 

Для этого потребуется несколько более сложный синтаксический анализ, чем просто сплит. Это больше не будет работать:

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

Этот код также игнорирует, что пробелы могут привести к GO.

0

Вам нужно было бы провести парсинг с двумя проходами. Первый проход - удалить все комментарии и построить новую строку. Второй проход - использовать разделение REGEX на основе ключевого слова GO.

Смежные вопросы