2011-11-17 159 views
3

我需要以編程方式附加數據庫,但日誌文件命名約定看起來不一樣。如何以編程方式在c#中讀取sql server mdf標頭以獲取日誌文件信息

例如:
database1.mdfdatabase1.ldfdatabase2.mdfdatabase2_log.ldf 等等...

所以,我的猜測是,有關日誌文件中的信息將在MDF文件的文件頭數據,但我不確定如何閱讀。

我做了一個谷歌搜索,得到了這段代碼,但它是讀取版本信息。

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]; 
    } 
} 

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

問題更新:

  1. 我的應用程序安裝的SQL Express
  2. 有一個磁盤上的許多.mdf和.ldf文件
  3. 應用程序將所有數據庫和日誌文件到sql數據目錄
  4. 應用程序試圖在以編程方式測試數據庫。

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", @"")); 

//這是我有問題的地方。顯然,我不能認爲日誌文件名將與具有ldf擴展名的mdf文件名相同。那就是當我認爲有一種方法可以從mdf文件中讀取標題信息,並且這將有ldf信息。

Server sqlServer = new Server(textServer.Text); 
sqlServer.AttachDatabase(databasename, databasefiles); 
+0

他們都結束.LDF ...你是如何確定的MDF文件的名字嗎? – NotMe

+1

使用'SMO'(SQL管理對象)來抓取引用日誌文件和mdf的數據庫句柄。這將會更容易,而不是硬編碼名稱。記住dba或數據庫開發人員可以避免默認的日誌名稱並將其命名爲他們想要的任何東西。他們也可以改變這些名字,所以你的代碼很容易拋出異常。避免這種類型的編程,因爲它會導致異常/錯誤。 – JonH

+0

我使用smo來附加數據庫,但那是問題所在。我更新了我的問題,因爲我不能在這裏放置任何可讀的代碼。 – gangt

回答

3

您不應該知道日誌文件名以便將數據庫和日誌文件附加到該數據庫。這意味着很多數據的硬編碼。使用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 Server實例以及實例上的每一個數據庫。但好的是你有數據庫實例的句柄,包含指向mdf文件和日誌文件的指針。它避免了必須硬編碼文件名。

Here's the MSDN on SMO

+0

我使用smo來附加數據庫,但那是問題所在。我更新了我的問題,因爲我不能在這裏放置任何可讀的代碼。 – gangt

相關問題