Не работает в других ПК - PullRequest
       13

Не работает в других ПК

0 голосов
/ 27 сентября 2011

Привет, у меня есть следующий код, который отлично работает на моей машине, но когда я даю свой установочный набор на других машинах, приложение вылетает и выдает ошибку.
И функциональность, которую я пытаюсь реализовать, заключается в том, что я сохраняю схему и данные для нескольких таблиц в выходной папке, и если пользователь проверяет флажок 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 (строковое значение, Int32 startIndex, длина Int32, емкость Int32)
at System.Text.StringBuilder.GetNewString (String currentString, Int32 requiredLength) в System.Text.StringBuilder.Append (строковое значение)
в 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)
at SqlDatabaseDataExport.MainForm.BackupScriptLocation ()

1 Ответ

1 голос
/ 27 сентября 2011

Если файл, который вы пытаетесь открыть, очень большой, вы можете достичь предела, когда вашей системе будет не хватать памяти. Я предлагаю вам открыть поток для чтения файла, а затем и другой поток для записи в другой файл с буфером (используйте StringBuilder). Таким образом, ваш newText не достигнет очень высокого уровня памяти, потому что вы будете контролировать размер с помощью StringBuilder. Кроме того, всегда лучше при объединении большого количества строк использовать StringBuilder вместо String, потому что String использует больше памяти. В конце моего предложения вам просто нужно удалить исходный файл и переименовать выходной файл с именем первого файла. Вот и все.

...