Как я могу использовать C # для применения патча к базе данных? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть командный файл, который содержит команды для восстановления базы данных с использованием исправлений из папки. Я хочу создать приложение с графическим интерфейсом, которое может выполнять команды SQL, но не применять все исправления в папке.

В настоящее время у меня есть следующий sqlcmd в командном файле:

sqlcmd -E -S(local) -i "c:\temp\MergedPatchFiles.sql"

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

Как я могу выполнить команду SQL 'apply patch' с использованием C # в указанной базе данных?

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

Мне нужен способ найти текущий номер патча базы данных ...

Для начала, как вы храните в базе данных ревизионную базу, в которой вы сейчас находитесь? Я сталкивался с 3 различными схемами отслеживания изменений:

  1. таблица аудита DDL,
  2. таблица с 1 строкой с номером версии,
  3. «Ничего» - где вы должны угадать, основываясь на том, какие столбцы, таблицы, представления и хранимые процедуры - это ревизия базы данных.

Таблица аудита может быть такой же простой, как столбец для номера исправления, столбец, когда он был завершен, или более сложной , как в этом примере .

Таблица версий - это иногда максимум, с чем я могу справиться в компаниях, в которых я работаю. Как минимум, ему просто нужно 2 или 3 столбца и 1 строка. Структура этой таблицы никогда не должна изменяться, чтобы приложение версии 51 могло открыть базу данных, созданную версией 2.

Большинство компаний, в которых я работал, не имеют схемы для отслеживания, какая версия базы данных, кроме детективной работы, выясняют, что table_Q был добавлен в версии 17, но view_P был добавлен в версии 19 и удален в версии 21, так что эта база данных, вероятно, версии 19 или 20.

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

1 голос
/ 08 ноября 2011

Вы можете сделать это несколькими способами:

  • Используйте Process.Start для непосредственного выполнения sqlcmd (или даже непосредственно для пакетного файла ...)
  • Загрузите SQL и выполните его, используя ADO.NET
1 голос
/ 08 ноября 2011

Вы можете столкнуться с проблемами, если в вашем файле есть операторы GO, поэтому вы можете использовать этот подход :

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);
}
1 голос
/ 08 ноября 2011

Загрузить файл sql в строку и использовать метод SqlCommand.ExecuteNonQuery http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

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