gpt4 book ai didi

c# - 如何在 C# 中以编程方式读取日志文件信息的 sql server mdf header

转载 作者:行者123 更新时间:2023-11-30 16:27:06 28 4
gpt4 key购买 nike

我需要以编程方式附加数据库,但日志文件命名约定似乎不同。

例如:
database1.mdfdatabase1.ldfdatabase2.mdfdatabase2_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];
}
}

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

问题已更新:

  1. 我的应用安装了 sql express
  2. 磁盘上有许多 .mdf 和 .ldf 文件
  3. app复制所有数据库和日志文件到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);

最佳答案

您不必知道日志文件名就可以附加数据库和日志文件到该数据库。这将意味着大量的数据硬编码。使用 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

关于c# - 如何在 C# 中以编程方式读取日志文件信息的 sql server mdf header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com