Я создаю консольное приложение C#, которое восстанавливает базу данных SQL Server с предварительно определенными параметрами, которые могут быть изменены в меню коммутатора. Основное внимание в этом приложении простота. Он предназначен для всех, кто сможет восстановить базу данных SQL Server нажатием одной кнопки. Да, должен быть кто-то, кто может выполнить эту задачу грамотно, но есть много способов сделать вещи ... Независимо от того, что я построил логику, чтобы прокрутить резервные каталоги и выбрать правильные файлы резервных копий на основе точки во время. Все работает, кроме фактической части восстановления.C# - Восстановление базы данных SQL Server с помощью Inline SQL
Из других вопросов, которые я прочитал, я боюсь, что невозможно запустить SQL из C#, который таким образом модифицирует сервер. Я не хочу использовать объекты SMO, потому что это связано с дополнительными сложностями, которые я хочу избежать, но если это единственный способ сделать это, то это то, что я буду делать.
Всякий раз, когда я пытаюсь запустить этот код, он жалуется, что значение @dbName
недействительно.
public static void RestoreDatabase(string Server_Name, string Instance_Name, string DB_Name, FileInfo BakFile, FileInfo DiffFile, FileInfo TrnFile, DateTime Point_In_Time)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=" + Server_Name + "\\" + Instance_Name + ";Initial Catalog=master;Integrated Security=True";
string SqlQuery = @"ALTER DATABASE @dbName
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE @dbName
FROM DISK = @BakFilePath
WITH NORECOVERY, REPLACE;
RESTORE DATABASE @dbName
FROM DISK = @DiffFilePath
WITH NORECOVERY;
RESTORE DATABASE @dbName
FROM DISK = @TrnFilePath
WITH RECOVERY, STOPAT = @RecoveryTime;
ALTER DATABASE @dbName
SET MULTI_USER;";
SqlCommand cmd = new SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = conn;
cmd.CommandText = SqlQuery;
try
{
cmd.Parameters.Add(new SqlParameter("@dbName", SqlDbType.NVarChar, 30));
cmd.Parameters.Add(new SqlParameter("@BakFilePath", SqlDbType.NVarChar, 255));
cmd.Parameters.Add(new SqlParameter("@DiffFilePath", SqlDbType.NVarChar, 255));
cmd.Parameters.Add(new SqlParameter("@TrnFilePath", SqlDbType.NVarChar, 255));
cmd.Parameters.Add(new SqlParameter("@RecoveryTime", SqlDbType.DateTime));
cmd.Parameters["@dbName"].Value = DB_Name;
cmd.Parameters["@BakFilePath"].Value = BakFile.FullName;
cmd.Parameters["@DiffFilePath"].Value = DiffFile.FullName;
cmd.Parameters["@TrnFilePath"].Value = TrnFile.FullName;
cmd.Parameters["@RecoveryTime"].Value = Point_In_Time;
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadLine();
}
try
{
Console.WriteLine("Restoring {0}...", DB_Name);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
Console.WriteLine("Restore Complete!");
Console.ReadLine();
}
catch (SqlException ex)
{
Console.WriteLine("Connection could not open. Error: {0}", ex);
Console.ReadLine();
}
}
8/15/2016 10:38
Основываясь на некоторые из ответов, вы, ребята, рекомендуя динамический SQL. Я был обеспокоен внедрением SQL, но только администраторы будут иметь доступ к этой программе. Несмотря на это, я все равно добавлю более строгую проверку, потому что кто не любит вводить мусорный вход для ударов.
Я попытался создать динамический SQL. Это был мой код, однако я не тратил много времени на проверку ошибок, поэтому я снова заберу этот маршрут и попытаюсь устранить любые ошибки.
string SqlQuery = string.Format(@"DECLARE @dbName NVARCHAR(MAX), @strSQL NVarchar(MAX)=N'';
SET @dbName = {0};
SELECT
@strSQL += 'DECLARE @BakFilePath nvarchar(255) = N''{1}'','
+ N' @DiffFilePath nvarchar(255) = N''{2}'','
+ N' @TrnFilePath nvarchar(255) = N''{3}'','
+ N' @RecoveryTime DateTime = N''{4}'''
+ N' ALTER DATABASE '+ @dbName
+ N' SET SINGLE_USER'
+ N' WITH ROLLBACK IMMEDIATE;'
+ N' RESTORE DATABASE ' + @dbName
+ N' FROM DISK = @BakFilePath'
+ N' WITH NORECOVERY, REPLACE;'
+ N' RESTORE DATABASE ' + @dbName
+ N' FROM DISK = @DiffFilePath'
+ N' WITH NORECOVERY;'
+ N' RESTORE DATABASE ' + @dbName
+ N' FROM DISK = @TrnFilePath'
+ N' WITH RECOVERY, STOPAT = @RecoveryTime;'
+ N' ALTER DATABASE ' + @dbName
+ N' SET MULTI_USER;
'
EXEC sp_executesql @strSQL",DB_Name, BakFile.FullName, DiffFile.FullName, TrnFile.FullName, Point_In_Time);
Не могли бы вы показать весь вывод «жалобы» на значение dbName? –
В настоящее время вы пытаетесь выяснить, как вывести выход моей программы на экран и файл ... очень легко сделать на Linux ха-ха. –
C# консольная программа? console.writeline(), и если вы импортируете system.windows.forms, вы можете использовать messagebox.show(), system.file.io вы можете использовать File.WriteAllText (путь к файлу). вы также можете при запуске вашей программы использовать синтаксис командной строки, такой как c: \ program.exe> results.txt, чтобы сохранить его в файле. – Matt