Рекомендации по выполнению сценариев SQL Server из приложения .NET? - PullRequest
4 голосов
/ 17 февраля 2009

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 17 февраля 2009

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

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

1 голос
/ 17 февраля 2009

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

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

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

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

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

1 голос
/ 17 февраля 2009

У меня были согласованные результаты при использовании 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...