我需要以編程方式附加數據庫,但日誌文件命名約定看起來不一樣。如何以編程方式在c#中讀取sql server mdf標頭以獲取日誌文件信息
例如:
database1.mdf
有database1.ldf
,database2.mdf
有database2_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];
}
}
=========================================== ===========
問題更新:
- 我的應用程序安裝的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", @""));
//這是我有問題的地方。顯然,我不能認爲日誌文件名將與具有ldf擴展名的mdf文件名相同。那就是當我認爲有一種方法可以從mdf文件中讀取標題信息,並且這將有ldf信息。
Server sqlServer = new Server(textServer.Text);
sqlServer.AttachDatabase(databasename, databasefiles);
他們都結束.LDF ...你是如何確定的MDF文件的名字嗎? – NotMe
使用'SMO'(SQL管理對象)來抓取引用日誌文件和mdf的數據庫句柄。這將會更容易,而不是硬編碼名稱。記住dba或數據庫開發人員可以避免默認的日誌名稱並將其命名爲他們想要的任何東西。他們也可以改變這些名字,所以你的代碼很容易拋出異常。避免這種類型的編程,因爲它會導致異常/錯誤。 – JonH
我使用smo來附加數據庫,但那是問題所在。我更新了我的問題,因爲我不能在這裏放置任何可讀的代碼。 – gangt