2015-03-20 6 views
0

У меня есть веб-приложение C#, которое должно читать переменные имени базы данных из текстового файла и обрабатывать восстановление. Я хочу, чтобы приложение восстанавливало базы данных один за другим, потому что процесс чувствителен. Текстовый файл может иметь до 10 баз данных для восстановления за одну ночь. Каков наилучший способ прочитать переменные имени базы данных по отдельности и обработать восстановление для каждого? У меня есть значительное количество кода для восстановления, поэтому я хотел бы запустить мое приложение один раз для одной базы данных, затем снова для другой базы данных, затем снова для другой базы данных и т. Д. И т. Д. Мне не нужен мой код для запуска быстро, так как у меня есть часы, чтобы завершить восстановление.Получение переменных из текстового файла и восстановление базы данных mulitple

переменные в текстовый файл выглядит примерно так:

dbName:"dbName" 
ServerToRestoreTo:"Server/instance" 

dbName:"dbName2" 
ServerToRestoreTo:"Server/instance2" 

... 
... 
... 
... up to 10 dbName and ServerToRestoreTo 

Кроме того, я до сих пор работает на структуре текстового файла, так что я открыт для предложений с этой частью.

+0

Я добавил очень длинный ответ, но, надеюсь, это поможет здесь ... –

ответ

0

Вот один из способов: сохранить отдельный файл, чтобы отслеживать базы данных, которые вы уже восстановили. Затем просто выберите первую базу данных из главного списка, который не имеет записи в файле «RestoredDatabases.txt».

UPDATE

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

Во-первых, вот класс для представления базы данных, которая может быть прочитана или записана в файл. Примечание: Я перепробовал метод ToString(), поэтому он пишет текст в той же файловой структуре, о которой вы упомянули, и я внедрил Equals, чтобы упростить сравнение между списками этого объекта.

private class LogFileDatabase 
{ 
    public const string NamePrefix = "dbName:"; 
    public const string ServerPrefix = "ServerToRestoreTo:"; 

    public string DbName { get; set; } 
    public string Server { get; set; } 

    public override string ToString() 
    { 
     return string.Format("{0}\"{1}\"{2}{3}\"{4}\"", 
      NamePrefix, DbName, Environment.NewLine, ServerPrefix, Server); 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != this.GetType()) return false; 
     return Equals((LogFileDatabase) obj); 
    } 

    private bool Equals(LogFileDatabase other) 
    { 
     return (string.Equals(DbName, other.DbName) && 
      string.Equals(Server, other.Server)); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return ((DbName != null ? DbName.GetHashCode() : 0) * 397)^
        (Server != null ? Server.GetHashCode() : 0); 
     } 
    } 
} 

Далее я написал метод, который будет читать текстовый файл, разобрать его для имен баз данных и серверов, и возвращает список выше LogFileDatabase объектов:

private static IEnumerable<LogFileDatabase> GetDatabasesFromLog(string logPath) 
{ 
    if (logPath == null) throw new ArgumentNullException("logPath"); 

    if (!File.Exists(logPath)) 
    { 
     throw new FileNotFoundException(
      string.Format("logPath does not exist: {0}", logPath)); 
    } 

    var databasesFromLog = new List<LogFileDatabase>(); 

    var fileLines = File.ReadAllLines(logPath) 
     .Where(line => !string.IsNullOrWhiteSpace(line)); 

    var logFileDb = new LogFileDatabase(); 

    foreach (var fileLine in fileLines) 
    { 
     var dbNameIndex = fileLine.IndexOf(LogFileDatabase.NamePrefix); 
     if (dbNameIndex > -1) 
     { 
      logFileDb.DbName = fileLine.Substring(
       dbNameIndex + LogFileDatabase.NamePrefix.Length).Replace("\"", ""); 

      continue; 
     } 

     var serverIndex = fileLine.IndexOf(LogFileDatabase.ServerPrefix); 
     if (serverIndex == -1) continue; 

     logFileDb.Server = fileLine.Substring(
      serverIndex + LogFileDatabase.ServerPrefix.Length).Replace("\"", ""); 

     databasesFromLog.Add(logFileDb); 
     logFileDb = new LogFileDatabase(); 
    } 

    return databasesFromLog; 
} 

Наконец, вот пример использования класса и метода для чтения файла базы данных и восстановления первой базы данных, которая не существует в восстановленном файле базы данных, а затем записывает имя восстановленной базы данных в новый файл:

public static void Main() 
{ 
    // The file containing all databases to restore 
    string databasesToRestore = "c:\\program\\settings\\DatabasesToRestore.txt"; 

    // A file that will contain the names of databases that have already been restored 
    string restoredDatabases = "c:\\program\\workingDir\\RestoredDatabases.txt"; 

    if (File.Exists(databasesToRestore)) 
    { 
     // Ensure restored databases file exists 
     if (!File.Exists(restoredDatabases)) 
     { using (var tmp = File.Create(restoredDatabases)) { } } 

     LogFileDatabase databaseToRestore = 
      GetDatabasesFromLog(databasesToRestore) 
       .Except(GetDatabasesFromLog(restoredDatabases)) 
       .FirstOrDefault(); 

     if (databaseToRestore != null) 
     { 
      // Call retore database code here, restoring `databaseToRestore` 
      RestoreDbToServer(databaseToRestore.DbName, databaseToRestore.Server); 

      // Write the name of the database we just restored 
      // to our 'restoredDatabases` file  
      File.AppendAllLines(restoredDatabases, 
       new List<string> {databaseToRestore.ToString()}); 
     } 
     else 
     { 
      // There are no databases left to restore, 
      // so we can delete our `restoredDatabases` file now. 
      // But be careful - this means when you run the program again, 
      // it will start restoring the first database. 
      File.Delete(restoredDatabases); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^