Выполнить файл SQL на SQL Server, используя C # - PullRequest
3 голосов
/ 26 января 2011

У меня много файлов для процедур, представлений, функций и т. Д.

Я хочу выполнить эти файлы (создание компонентов) в соответствующей базе данных на SQL Server 2005/2008.

ТакжеДело в том, что я хочу выполнить их, используя C #.

Еще один момент, который я хотел бы упомянуть, я хочу, чтобы приложение было таким, чтобы я мог выполнять эти файлы и на удаленном SQL Server.Также на клиентском компьютере может отсутствовать инструмент командной строки osql, sqlcmd.

Может кто-нибудь подсказать мне об этом.

Ответы [ 5 ]

7 голосов
/ 26 января 2011

Это зависит от того, какие они файлы. Если, например, они только содержат действительные команды T-SQL (и не являются пакетными файлами, которые вы запускаете, скажем, в SSMS, которые содержат разделитель пакетов, например GO), тогда вам просто нужно создать соединение, команду, затем прочитать содержимое файла и использовать его для заполнения свойства CommandText команды.

Например:

void ExecuteFile(string connectionString, string fileName)
{
    using(SqlConnection conn = new SqlConnection(connectionString))
    {
        string data = System.IO.File.ReadAllText(fileName);

        conn.Open();

        using(SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = data;
            cmd.ExecuteNonQuery();
        }
    }
}

Если это командный файл, вам нужно разделить файл на отдельные партии и обработать их по отдельности. Самый простой способ - просто использовать string.Split, но имейте в виду, что он не будет соблюдать правила синтаксического анализа SQL при его разбиении (например, если в операторе SQL появляется GO, он разделит команду на две части). партии, которые, очевидно, потерпят неудачу).

В целом, вы можете увидеть, что вам нужно сделать, изменив код следующим образом:

string[] batches = SplitBatches(System.IO.File.ReadAllText(fileName));

conn.Open();

using(SqlCommand cmd = conn.CreateCommand())
{
    foreach(string batch in batches)
    {
        cmd.CommandText = batch;
        cmd.ExecuteNonQuery();
    }
}

Реализация функции с именем SplitBatches зависит от вас.

3 голосов
/ 26 января 2011

Как правило, самый простой способ - разделить скрипт на операторе «GO» и выполнить каждый элемент отдельно. Это решение не будет работать, если скрипт содержит оператор GO в комментарии.

private readonly Regex _sqlScriptSplitRegEx = new Regex( @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled );
public void ExecuteSqlScript( string scriptText )
{
    if ( string.IsNullOrEmpty( scriptText ) )
        return;

    var scripts = _sqlScriptSplitRegEx.Split( scriptText );
    using ( var conn = new SqlConnection( "connection string" ) )
    {
        using ( var ts = new TransactionScope( TransactionScopeOption.Required, new TimeSpan( 0, 10, 0 ) ) )
        {
            foreach ( var scriptLet in scripts )
            {
                if ( scriptLet.Trim().Length == 0 )
                    continue;

                using ( var cmd = new SqlCommand( scriptLet, conn ) )
                {
                    cmd.CommandTimeout = this.CommandTimeout;
                    cmd.CommandType = CommandType.Text;
                    cmd.ExecuteNonQuery();
                }
            }

            ts.Complete();
        }
    }
}
2 голосов
/ 26 января 2011

Обычно все, что вам нужно сделать, это просто выполнить их с SqlCommand.ExecuteNonQuery , по одному пакету за раз. Это оставляет вам задачу разбивать сценарии на пакеты, используя текущий установленный разделитель пакетов (обычно GO). Бесплатная библиотека dbutilsqlcmd может использоваться для обработки сценариев SQL, поскольку она обрабатывает не только разделитель, но и расширения SQLCMD (:setvar, :connect и т. Д.).

0 голосов
/ 26 января 2011

Вы можете прочитать команды, используя TextReader, а затем использовать ExecuteNonQuery с результатами TextReader в качестве команды.

0 голосов
/ 26 января 2011

Использование стандартного ADO будет "работать" - SQL DDL может быть отправлен с использованием, например, SqlCommand.ExecuteNonQuery .

... но я бы порекомендовал использовать проект базы данных (с удаленным промежуточным развертыванием или VSDBCMD) или один из инструментов, таких как SQLCMD (возможно, в сочетании со сценарием PowerShell :-) или SQL Management Studio и т. Д. Они предназначены для такого рода вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...