Ошибка нехватки памяти в C#
Я получаю исключение OutOfMemoryException, когда запускаю приведенный ниже блок кода.. Это запись данных из таблицы sql server в другую таблицу sql server. Количество записей-500 тысяч. Любая помощь, пожалуйста.
public void TempCopyIdentityToTest() { try { //IdentityUtility.AddToLogFile("Start Deletion previous exported details from -" + strSource); IMSIdenityDM IndExpDm = new IMSIdenityDM(); //Console.WriteLine("Start clearing IMS table"); //IndExpDm.TruncateNonIMSIdentity("IMS"); //Console.WriteLine("End clearing IMS table"); IndExpDm.TempCopyIdentityToTest(); //Console.WriteLine("End Copy IMS table process"); //IdentityUtility.AddToLogFile("Successfully completed Deletion previous exported details from -" + strSource); IndExpDm = null; } catch (Exception e) { IdentityUtility.AddToLogFile("IMSIdentityBM-TempCopyIdentityToTest " + e.Message); } }
Ниже приведено определение класса IMSIdenityDM.
public class IMSIdenityDM { SqlConnection cn; SqlCommand cmd; SqlDataAdapter daTransations; public IMSIdenityDM() { //ConfigurationEntity.FetchIMSConfiguration(); } public SqlDataAdapter ExportIMSIdentityDetails() { try { cn = UtilityDM.CreateSQLConnection(); cmd = cn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "usp_IMS_Identity_Export"; cmd.CommandTimeout = 900; daTransations = new SqlDataAdapter(cmd); UtilityDM.CloseSQLConnection(cn); return daTransations; } catch (SqlException ex) { UtilityDM.CloseSQLConnection(cn); IdentityUtility.AddToLogFile("IMSIdenityDM - ExportIdenityTable" + ex.Message); return null; } catch (Exception e) { IdentityUtility.AddToLogFile("IMSIdenityDM - ExportIdenityTable" + e.Message); return null; } }
Добавлена трассировка стека
Stack Trace at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) at System.Data.SqlClient.SqlDataReader.Read() at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) at ManageIdentityDM.IMSIdenityDM.CopyIMSIdentityDetails() 6/22/2020 4:12:25 PM
Что я уже пробовал:
У меня нет знаний по C#. Этот код был написан моим коллегой, который давно ушел.
F-ES Sitecore
Если вы используете SqlDataAdapter для "заполнения" набора данных, который затем обрабатываете строка за строкой, попробуйте вместо этого использовать SqlDataReader, чтобы читать данные SQL строка за строкой, а не помещать их все сразу в память.
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader
Pavan Mand
Я добавил трассировку стека.Похоже, что он использует SQL data reader