我需要以编程方式附加数据库,但日志文件命名约定似乎不同。
例如:
database1.mdf
有database1.ldf
,database2.mdf
有database2_log.ldf
等等……
所以,我的猜测是有关日志文件的信息会在 mdf 文件的 header 数据中,但我不确定如何读取它。
我用谷歌搜索得到了这段代码,但它是用来读取版本信息的。
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 文件
- app复制所有数据库和日志文件到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);
最佳答案
您不必知道日志文件名就可以附加数据库和日志文件到该数据库。这将意味着大量的数据硬编码。使用 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 文件和日志文件的指针。它避免了对文件名进行硬编码。
关于c# - 如何在 C# 中以编程方式读取日志文件信息的 sql server mdf header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172763/