Abrar Kazi Ответов: 2

Как передать 60 тысяч + записей набора данных в виде XML в хранимую процедуру с помощью stringwriter и writetoxml ?


Я создал строку, которая представляет собой строку формата xml, сгенерированную с помощью StringWriter и WriteToXml с использованием dataset .. теперь она работает для меньшего количества записей в dataset, но когда записи превышают 60k +, что будет сценарием реального времени, она выбрасывает память из исключения при хранении XML-сгенерированного strj g в строковой переменной. Пожалуйста, проводите .

Код:

StringWriter sw = new StringWriter();
dataSet.WriteXml(sw);
string result = sw.ToString();


Что я уже пробовал:

Я сохранил его в строковой переменной, как упоминалось выше, но он вызывает исключение памяти. Пожалуйста, предоставьте код, если это возможно. Я загружаю файл Excel преобразуя его в набор данных а затем преобразуя его в формат строки xml чтобы передать его в хранимую процедуру

Maciej Los

Звучит как плохой дизайн... Поделитесь своим кодом. Мы не можем помочь вам, не видя этого.

Abrar Kazi

StringWriter sw = новый StringWriter();
набор данных.Метода writexml(ео);
результат строка = ув.Метод toString();


Вот код, который я использую

Dave Kreskowiak

Я подозреваю, что ваше поколение XML-это создание XML-строку, которая является чрезвычайно большой. Вы не можете сгенерировать это в памяти. Вам придется записать этот XML-файл непосредственно в файл, а затем вернуть его вызывающему объекту.

Но поскольку мы ничего не знаем ни о вашем коде, ни о структуре и репрезентативных примерах данных для одного из типичных объектов, которые вы отправляете в XML, невозможно сказать что-либо полезное для решения этой проблемы.

Abrar Kazi

StringWriter sw = новый StringWriter();
набор данных.Метода writexml(ео);
результат строка = ув.Метод toString();


Вот код, который я использую

Dave Kreskowiak

Ладно, ну и что? Без сведения, это довольно много, чтобы tourbleshoot это невозможно.

Предоставленный вами код является очень простым кодом для записи набора данных в XML-строку в памяти. Ошибка говорит вам о том, что вы генерируете такой огромный XML-файл, что он превышает пределы памяти строки. Ни один объект в .NET не может быть больше 2 ГБ.

Таким образом, вам действительно не нужно отправлять более 60 000 записей обратно в одной XML-строке. Вам нужно вернуться назад и переоценить проблему и то, как вы ее решаете. Вместо того чтобы возвращать один монолитный блок данных, отправляйте записи наборами по сотне. Вы решаете подобную проблему, "подкачивая" данные.

Dave Kreskowiak

И нет, это не срочно. Это может быть срочно для вас, но это не для кучки людей, которые добровольно предоставляют все свободное время, чтобы ответить на вопросы на этом сайте.

2 Ответов

Рейтинг:
7

Patrice T

Цитата:
Как передать 60 тысяч + записей набора данных в виде XML в хранимую процедуру с помощью stringwriter и writetoxml ?
В маленьких кусках!
Хитрость заключается в том, чтобы уменьшить объем памяти. Это просто способ избежать ограничения памяти, это не улучшит дизайн.
Используйте цикл, в котором вы создаете небольшой набор данных из следующих 100 записей, загружаете его в базу данных и повторяете цикл для следующего набора до конца.

Я согласен с Мацей лосем, это звучит как плохой дизайн и злоупотребление возможностями, предоставляемыми языком.
Только если вы объясните, что вы делаете и почему, мы сможем помочь больше.


Maciej Los

хороший Совет.
Спасибо, что упомянули о моем комментарии к этому вопросу.
Овации,
Мацей

Patrice T

Добро пожаловать, это нормально.

Maciej Los

;) [РЕДАКТИРОВАТЬ]
Кстати: вы видели мой ответ?

Abrar Kazi

StringWriter sw = новый StringWriter();
набор данных.Метода writexml(ео);
результат строка = ув.Метод toString();


Вот код, который я использую

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Рейтинг:
1

Maciej Los

Мой совет: забудьте об этом. Stringwriter не[^].

У вас есть 2 варианта. В зависимости от метода, используемого для манипулирования данными, вы можете использовать :


  1. Класс XmlWriter (System.Xml)[^]
  2. XmlSerialization[^] или даже лучше Datacontractserialization; данные[^].


Но вы уже упоминали об этом:
Абрар Кази[^] писанное:
Я загружаю файл Excel преобразуя его в набор данных а затем преобразуя его в формат строки xml чтобы передать его в хранимую процедуру


В этом случае ваш первый шаг-ОК (Excel to dataset). Следующие шаги должны быть:

  1. подключение к базе данных (серверу)
  2. использовать SqlBulkCopy[^] класс для сброса (заполнения) данных в целевую таблицу
  3. путем передачи объекта DataTable (в Excel) в Метод WriteToServer[^].
  4. тесная связь(с)
  5. высвобождение ресурсов


Пожалуйста, смотрите мои прошлые ответы для получения более подробной информации:
Загрузка excel в VB net[^]
импорт excel в БД с указанием пути к файлу[^]
Как импортировать большой файл excel в datatable[^]