嗨我有以下代码在我的机器上工作正常但是当我在其他机器上给我的安装设置应用程序崩溃并给我错误。
我试图实现的功能是我将几个表的模式和数据支持到输出文件夹中,如果用户检查Schema_checkbox,那么备份文件应该删除直到模式的行,然后保留数据位。所以最后它将包含数据但不包含模式。这个位在我的机器上正常工作,但没有安装我的exe的支持服务台。
我的代码:
if (Schema_checkbox.Checked)
{
DisplayMainWindow("Schema not required selected");
Logger.Log("Schema not required selected " + DateTime.Now);
FileHelper.CopyFileContent(outputFileName);
DisplayMainWindow(" Only table data is backup excluding schema");
Logger.Log(" Only table data is backup excluding schema" + DateTime.Now);
}
public void CopyFileContent(string filePath)
{
try
{
StringBuilder sb = new StringBuilder();
string newText = null;
using (StreamReader tsr = new StreamReader(filePath))
{
do
{
string textLine = tsr.ReadLine() + "\r\n";
{
if (textLine.StartsWith("INSERT INTO"))
{
newText += textLine + Environment.NewLine;
}
}
}
while (tsr.Peek() != -1);
tsr.Close();
}
File.WriteAllText(filePath, newText);
}
catch (Exception ex)
{
Logger.Log("Exception" + ex);
MessageBox.Show("Error Occured" + ex);
}
}
错误讯息:
27/09/2011 14:46:34开始支持表格数据
27/09/2011 14:46:54异常是:System.OutOfMemoryException:
抛出了类型'System.OutOfMemoryException'的异常 在System.String.GetStringForStringBuilder(String value,Int32 startIndex,Int32长度,Int32容量)
在System.Text.StringBuilder.GetNewString(String currentString,Int32 System.Text.StringBuilder.Append(String value)的requiredLength 在ErikEJ.SqlCeScripting.Generator.GenerateTableContent(String tableName, Boolean saveImageFiles)
在ErikEJ.SqlCeScripting.Generator.GenerateTableData(String tableName, Boolean saveImageFiles)
在ErikEJ.SqlCeScripting.Generator.GenerateTableScript(String tableName, String outputFolder,Boolean isBackupReq)
在ErikEJ.SqlCeScripting.Generator.GenerateSchemaGraph(String connectionString,List`1表,String outputFolderPath,Boolean isDataBackupReq)
在SqlDatabaseDataExport.MainForm.BackupScriptLocation()
答案 0 :(得分:1)
如果您尝试打开的文件非常大,则可以达到系统内存不足的限制。我建议你打开流来读取文件,然后和其他流一起用缓冲区写入另一个文件(使用StringBuilder)。这样,您的newText
将无法达到非常高的内存级别,因为您将使用StringBuilder控制大小。此外,连接大量字符串以使用StringBuilder而不是String时总是更好,因为String使用更多内存。在我的建议结束时,您只需删除原始文件并使用第一个文件的名称重命名输出文件。就是这样。