我需要从.dbf文件中提取数据并将其转换为xml.我写了一个例程,它做得很好.但是现在我们遇到了非常大的.dbf文件 – 比如2GB.此代码会对这些文件抛出OutOfMemoryException.
Public Function GetData() As DataTable Dim dt As New DataTable(Name) Dim sqlcommand As String= "Select * From MyTable" Dim cn As New OleDbConnection(myconnectionstring) Try cn.Open() Dim cmd As New OleDbCommand(sqlcommand,cn) dt.Load(cmd.ExecuteReader()) Catch ex As Exception Throw ex Finally dt.Dispose() cn.Close() cn.Dispose() End Try Return dt
问题是 – 如果我在我的计算机上通过Visual Studio在调试模式下针对相同的2GB .dbf文件运行相同的代码,则不会抛出任何异常.这几乎就像Visual Studio以不同的方式管理内存而应用程序单独执行.
反正有没有解决内存问题?我尝试过使用类似结果的DataAdapter.我在Visual Studio预期/设计中看到的这种行为是什么?
解决方法
数据表位于内存中,因此在大文件上会失败,或者根据文件的大小变慢.
您需要使用sqlDataReader按记录读取数据记录,并使用XmlWriter创建XML文件.
像这样的东西(未检查代码)
Public Sub WriteToXml(Dim xmlFileName As String,Dim connectionString) Dim writer As XmlWriter writer = XmlWriter.Create(xmlFileName) Dim commandText As String= "Select * From MyTable" Dim connection As New OleDbConnection(connectionString) Try connection.Open() Dim command As New OleDbCommand(commandText,connection) Dim reader As sqlDataReader reader = myCommand.ExecuteReader() While reader.Read() write.WriteRaw("xml") End While Catch ex As Exception Throw ex Finally connection.Close() connection.Dispose() End Try End Sub