Как читать sql-сервер mdf-заголовок для информации файла журнала программно в С#

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

Например:  database1.mdf имеет database1.ldf, database2.mdf имеет database2_log.ldf и так далее...

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

Я сделал поиск в Google и получил этот код, но он должен прочитать информацию о версии.

using (FileStream fs = File.OpenRead(@"C:\database.mdf"))
{
 using (BinaryReader br = new BinaryReader(fs))
 {
 // Skip pages 0-8 (8 KB each) of the .mdf file,
 // plus the 96 byte header of page 9 and the
 // first 4 bytes of the body of page 9,
 // then read the next 2 bytes
 int position = 9 * 8192 + 96 + 4;
 br.ReadBytes(position);
 byte[] buffer = br.ReadBytes(2);
 dbiVersion = buffer[0] + 256 * buffer[1];
 }
}

=============================================== =======

обновлен вопрос:

  • Мои приложения устанавливают sql express
  • Имейте много файлов .mdf и .ldf на диске
  • приложение копирует все базы данных и файлы журналов в каталог данных sql Приложение
  • пытается программным образом прикрепить базы данных.

FileInfo mdf = new FileInfo (dbfile);

databasename = mdf.Name.ToLower().Replace(@".mdf", @"");
StringCollection databasefiles = new StringCollection();
databasefiles.Add(mdf.FullName);
databasefiles.Add(mdf.FullName.ToLower().Replace(@".ldf", @""));

//это то, что я имею. Очевидно, я не могу предположить, что имя файла журнала будет таким же, как имя файла mdf с расширением ldf. Thats, когда я думал, что будет способ прочитать информацию заголовка из файла mdf, и это будет иметь ldf информацию.

Server sqlServer = new Server(textServer.Text);
sqlServer.AttachDatabase(databasename, databasefiles);
1 ответ

Вам не нужно знать имя файла журнала, чтобы прикрепить базу данных и файл журнала к этой базе данных. Это будет означать много жесткого кодирования данных. Использовать объекты SMO:

Microsoft.SqlServer.Management.Smo.Server server = new ServerConnection("enter server name");
 Microsoft.SqlServer.Management.Smo.Database db = server.Databases("enter db name");
 Console.WriteLine(db.FileGroups[0].Files[0].FileName); 'the mdf file
 Console.WriteLine(db.LogFiles[0].FileName); 'the log file

Используя SMO, у вас будет не только дескриптор вашего экземпляра сервера sql, но и каждая отдельная база данных экземпляра. Но приятная вещь - это дескриптор, который у вас есть для экземпляра базы данных, содержащий указатели на файл mdf и файл журнала. Это позволяет избежать жестких кодовых имен файлов.

Здесь MSDN для SMO

licensed under cc by-sa 3.0 with attribution.