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

标签 c# sql-server

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

例如:
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/

相关文章:

sql - 如何使用 sql 检测错误的序列列?

c# - GC 和 IDispose 在 C# 中如何工作?

c# - 在Silverlight中显示播放媒体文件的波形?

sql-server - SQL Server 将科学记数法(指数记数法)字符串转换为数字

c# - 如何将参数传递给 C# 中的直通查询?

c# - 使用非参数化查询避免 SQL 注入(inject)

SQL Server 以用户身份执行过程

c# - 在序列化之前获取 POST 或 PUT 请求正文(.NET、C#)

c# - WinForms 程序员的 WPF 是什么?

c# - SignalR 广播消息在停止/启动后重复