Рекомендации по выполнению сценариев SQL Server из приложения .NET?

Каков рекомендуемый метод для выполнения сценария SQL Server из приложения .NET и почему?

Я нахожусь в процессе создания приложения, которое мы можем запустить из нашего установщика для обновления нашей базы данных, когда установлена ​​предыдущая версия нашего приложения. В базе данных есть таблица версий, к которой я могу получить программный доступ и определить, какие сценарии обновления нужно запустить для обновления базы данных. Для меня имеет смысл встроить это в приложение, которое наш установщик может просто вызвать для обновления.

Я ищу, как лучше всего выполнить соответствующие сценарии обновления. При поиске в Интернете я видел рекомендации по разбиению скрипта по операторам "GO" и использованию SqlCommand.ExecuteNonQuery () . Я также видел рекомендации по использованию объектов управления SQL Server (SMO) .

Я ищу советы о плюсах и минусах различных способов выполнения этих скриптов из приложения .NET.

16.02.2009 22:31:30
3 ОТВЕТА
РЕШЕНИЕ

Лучшим методом будет любой метод, который отвечает всем функциональным и нефункциональным ограничениям.

Какая скорость вам нужна, есть ли проблемы с текущей ситуацией? Какова ваша стратегия резервного копирования / сбоя?

Я бы, вероятно, использовал SqlCommand.ExecuteNonQuery (), потому что он является частью среды выполнения .net, которая не требует дополнительной установки приложений, которые могут не понадобиться пользователю.

От вашего вопроса я предполагаю, что существует существующее приложение с большим количеством встроенных строк запроса. Я хотел бы попытаться получить в какой-либо репозиторий, который автоматически размещает их на сервере (в виде хранимой процедуры) и внутри вашего кода.

Не бойтесь простых текстовых файлов или других файлов конфигурации с запросами.

1
17.02.2009 15:23:35
Я склоняюсь к SqlCommand.ExecuteNonQuery (). У нас есть таблица версий в БД, и мы определим сценарии для обновления между версиями, которые будут находиться под контролем исходного кода. Приложение, для которого оно предназначено, имеет собственный ORM, я специально работаю над установщиком приложения.
Steve Wranovsky 17.02.2009 17:34:52
Этот метод кажется вам лучшим выбором, вы даже можете обернуть операторы SQL в набор транзакций и получить пошаговые подтверждения правильности его применения, отката при сбое и т. Д.
Brian Lyttle 17.02.2009 19:59:47

У меня были последовательные результаты с использованием System.Diagnostics.Process и вызова OSQL.exe. это сделано для файла sql ....

Я создал временный файл, где я написал свой встроенный файл sql, заставил OSQL его выполнить, а затем очистил его.

    process.StartInfo = new System.Diagnostics.ProcessStartInfo();
    process.StartInfo.FileName = OSQLpath;
    process.StartInfo.UseShellExecute = false;
    ...
    if (!System.IO.Directory.Exists(workingDirectory))
                        System.IO.Directory.CreateDirectory(workingDirectory);
    ...
    StringBuilder sbArgs = new StringBuilder();

    sbArgs.Append("-S ").Append(_serverName);
    sbArgs.Append(" -d ").Append(_databaseName);
    sbArgs.Append(" -E");
    sbArgs.Append(" -i ").Append("\"").Append(inputSQLFilePath).Append("\""); // input file
    sbArgs.Append(" -o ").Append("\"").Append(System.IO.Path.Combine(workingDirectory, String.Format("osqloutput_{1}_{0}.txt", fileUnique, fileName))).Append("\""); // output file

    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;

    process.StartInfo.Arguments = sbArgs.ToString();
    process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    process.StartInfo.CreateNoWindow = true;

...

    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
    process.Start();
    process.WaitForExit();
1
16.02.2009 23:00:45
Есть проблемы с этой техникой в ​​том, что вы должны анализировать ввод-вывод из внешнего исполняемого файла. Использование .NET API имеет смысл.
Brian Lyttle 17.02.2009 19:58:09

Хотя он может не совсем соответствовать вашим требованиям для запуска из приложения .NET, sqlcmd хорошо подходит (и предназначен) для этого процесса. Реализуя возможность анализа и запуска сценария SQL, вы дублируете функциональность инструмента. sqlcmd доступен в виде автономного установщика, который может быть связан с вашим приложением.

Если вы решите использовать связанное решение SqlCommand.ExecuteNonQuery (), для больших сценариев будет более эффективно использовать память для чтения сценария в меньший буфер при поиске оператора «GO» вместо «все-сразу».

2
16.02.2009 23:01:55