VB.NET:如何将DataTable数据正确写入XML文件?
VB.NET DataTable写入XML为空的问题修复
问题根源
- DriveNumber未重置:第一个遍历驱动器的循环结束后,
DriveNumber的数值已等于系统驱动器总数,第二个循环中该变量继续累加,导致所有DriveNumber = N的判断条件都无法触发,没有任何数据行被添加到DataTable。 - 错误的列添加逻辑:每个条件分支内重复添加相同的DataColumn,即使条件触发也会抛出重复列名异常。
- 冗余变量:代码中定义的
DR1至DR5系列变量未实际使用,属于无效代码。
修复后的代码
Imports System.IO Imports System.Net Public Class Test Public Shared Sub Main() Dim allDrives() As DriveInfo = DriveInfo.GetDrives() Dim dt As New DataTable("DriveInformation") ' 一次性添加所有列,避免重复添加 dt.Columns.Add(New DataColumn("Date/Time")) dt.Columns.Add(New DataColumn("Server")) dt.Columns.Add(New DataColumn("Drive")) dt.Columns.Add(New DataColumn("TotalSpace")) dt.Columns.Add(New DataColumn("UsedSpace")) dt.Columns.Add(New DataColumn("RemainingSpace")) dt.Columns.Add(New DataColumn("Status")) ' 输出控制台信息 Console.WriteLine("Server Name: {0}", Dns.GetHostName) Console.WriteLine("Date: {0}", DateTime.Now.ToString("yyyy/MM/dd")) Console.WriteLine("") For Each d In allDrives Console.WriteLine("Drive {0}", d.Name) Console.WriteLine(" Drive type: {0}", d.DriveType) If d.IsReady Then Console.WriteLine(" Volume label: {0}", d.VolumeLabel) Console.WriteLine(" File system: {0}", d.DriveFormat) ' 处理总容量显示 If d.TotalSize < 1099511627776 Then Console.WriteLine(" Total size of drive: {0, 15} GB ", FormatNumber(d.TotalSize / 1024 / 1024 / 1024)) Else Console.WriteLine(" Total size of drive: {0, 15} TB ", FormatNumber(d.TotalSize / 1024 / 1024 / 1024 / 1024)) End If ' 处理已用空间显示 Dim usedSpace = d.TotalSize - d.TotalFreeSpace If usedSpace < 1099511627776 Then Console.WriteLine(" Total used space: {0, 15} GB", FormatNumber(usedSpace / 1024 / 1024 / 1024)) Else Console.WriteLine(" Total used space: {0, 15} TB", FormatNumber(usedSpace / 1024 / 1024 / 1024 / 1024)) End If ' 处理剩余空间显示 If d.TotalFreeSpace < 1099511627776 Then Console.WriteLine(" Total available space: {0, 15} GB", FormatNumber(d.TotalFreeSpace / 1024 / 1024 / 1024)) Else Console.WriteLine(" Total available space: {0, 15} TB", FormatNumber(d.TotalFreeSpace / 1024 / 1024 / 1024 / 1024)) End If Console.WriteLine("") ' 添加数据行到DataTable Dim drow As DataRow = dt.NewRow drow("Date/Time") = DateTime.Now.ToString("yyyy/MM/dd") drow("Server") = Dns.GetHostName drow("Drive") = d.Name drow("TotalSpace") = d.TotalSize drow("UsedSpace") = usedSpace drow("RemainingSpace") = d.TotalFreeSpace drow("Status") = d.IsReady dt.Rows.Add(drow) End If Next ' 生成XML文件 Dim xmlPath = $"c:/temp/ServerDriveInformation_{DateTime.Now.ToString("yyyy MM dd h mm ss tt")}.xml" dt.WriteXml(xmlPath) Console.WriteLine($"XML文件已生成:{xmlPath}") End Sub End Class
修复说明
- 提前一次性添加所有DataColumn,避免重复添加导致的异常。
- 移除冗余的
DR1至DR5变量,简化代码结构。 - 合并遍历逻辑,在同一个循环中完成控制台输出和DataTable数据添加,避免DriveNumber变量的问题。
- 优化判断逻辑,将
d.IsReady的判断提至外层,减少重复判断。
内容的提问来源于stack exchange,提问作者dpresnell90
相关产品推荐
相关产品推荐

