Исключение памяти при загрузке данных в таблицу данных - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь получить данные из хранимой процедуры и пытаюсь загрузить эти данные в таблицу данных с помощью метода Load.Ниже приведен мой код

     using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            DataTable addDataTable;
            using (SqlCommand orgCommand = new SqlCommand("dbo.GetTable", sqlConnection))
            {
                orgCommand.CommandType = CommandType.StoredProcedure;

                orgCommand.CommandTimeout = 0;
                sqlConnection.Open();
                using (SqlDataReader reader = orgCommand.ExecuteReader())
                {
                    addDataTable = new DataTable();
                    addDataTable.TableName = "TableName";
                    addDataTable.Load(reader);
                    dataSet.Tables.Add(addDataTable);
                }
            }
            dataGridView1.DataSource = addDataTable;

Этот сохраненный процесс возвращает много строк, и при попытке загрузки в таблицу данных код addDataTable.Load (reader) 'исключает указанную ниже память.Есть ли другие альтернативные или какие-либо методы оптимизации для загрузки этого огромного количества данных в таблицу данных?

System.OutOfMemoryException was unhandled
HResult=-2147024882
Message=Exception of type 'System.OutOfMemoryException' was thrown.
StackTrace:
   at System.Data.RBTree`1.TreePage..ctor(Int32 size)
   at System.Data.RBTree`1.AllocPage(Int32 size)
   at System.Data.RBTree`1.GetNewNode(K key)
   at System.Data.Index.InitRecords(IFilter filter)
   at System.Data.Index..ctor(DataTable table, IndexField[] indexFields, Comparison`1 comparison, DataViewRowState recordStates, IFilter rowFilter)
   at System.Data.DataTable.GetIndex(IndexField[] indexDesc, DataViewRowState recordStates, IFilter rowFilter)
   at System.Data.DataColumn.get_SortIndex()
   at System.Data.DataColumn.IsNotAllowDBNullViolated()
   at System.Data.DataTable.EnableConstraints()
   at System.Data.DataTable.set_EnforceConstraints(Boolean value)
   at System.Data.DataTable.EndLoadData()
   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(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
   at System.Data.DataTable.Load(IDataReader reader)
   at WindowsFormsApplication4.Form1..ctor() in C:\Users\Anish George\Documents\Visual Studio 2015\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Form1.cs:line 35
   at WindowsFormsApplication4.Program.Main() in C:\Users\Anish George\Documents\Visual Studio 2015\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Program.cs:line 19
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Заранее спасибо.

С уважением, Аниш

1 Ответ

0 голосов
/ 04 июня 2018

Как уже отмечали @SlapY и @Barry O'Kane, вам, вероятно, следует реализовать какую-то подкачку и / или ленивую загрузку новых данных, поскольку пользователю требуется все больше и больше.Не пытайтесь загрузить все сразу, когда вы имеете дело со списками элементов, вместо этого загружайте группы из элементов X, где X - это число, которое имеет смысл для вашего варианта использования.

При работе со списками элементов всегда естьИмейте в виду, что в большинстве случаев эти списки могут быть огромными.Под потенциалом я имею в виду, что в большинстве случаев нет жестких ограничений на списки вещей, которые вы пытаетесь представить ... (то есть количество пользователей, количество выполненных входов и т. Д.)

Например, если высоздавая таблицу данных / сетку данных для пользователей вашего приложения, вам придется загружать пользователей по страницам, по X за раз (может быть, 10, может быть, 50, возможно, пользователь может выбирать между некоторым диапазоном размеров страниц).Если у вас не было страниц, и вместо этого вы хотели ленивую загрузку, когда пользователь прокручивал страницу, вам снова пришлось бы вводить новые данные в строки элементов X, чтобы поддерживать производительность и масштабируемость

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...