Страница: 1 |
Вопрос: asp.net + Access = LOVE | Добавлено: 12.08.10 09:28 |
Автор вопроса: ![]() |
Дано:
Dim (001.mdb) As БАЗА Dim (002.asp) As ФайлЗагрузки ФайлЗагрузки заполняет Базу построчно из файла xml, вынимая данные из тега <date>. Проблема: На 220 строке происходит "вылет". При этом 220 строк уже в файле БАЗА. Вылет происходит по причине переполнения памяти. Если строк в xml-файле меньше 220 - вылет не происходит. Вопрос: 1.Как разбить процесс заливки на этапы, с очисткой памяти? 2.Как в процессе заливки, после чтения-заполнения 50 строк, очищать память? |
Ответы | Всего ответов: 13 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #1 | Добавлено: 12.08.10 10:10 |
нет способа очиститьпамять одной срокой, к тому же то что ты пишешь похоже на проблему с драйвером oledb, нужно код смотреть чтоб сказать что за проблема в твоем случае |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #2 | Добавлено: 12.08.10 10:55 |
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() zzz = x.ReadElementContentAsString s = s + 1 If zzz = Nothing Then zzz = 0 If s = 1 Then p1 = zzz If s = 2 Then p2 = zzz If s = 3 Then p3 = zzz If s = 4 Then p4 = zzz If s = 5 Then p5 = zzz If s = 6 Then p6 = zzz If s = 7 Then p7 = zzz If s = 8 Then p8 = zzz If s = 8 Then AccessDataSource1.InsertCommand = "INSERT INTO остатки(код, название, марка, производитель, НомКаталог, ЕдИзм, КолВо, цена) VALUES ('" & p1 & "', '" & p2 & "', '" & p3 & "', '" & p4 & "', '" & p5 & "', '" & p6 & "', '" & p7 & "','" & p8 & "')" AccessDataSource1.Insert() s = 0 End If Loop End Sub |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #3 | Добавлено: 12.08.10 14:11 |
1) Вставь в тег code, чтоб смайлов не было.
2) Передавать таким образом строки для вставки в БД нельзя, так как в xml файле можно вставить вредоносный SQL код и он напрямую отправится в БД 3) Сделай вставку не через AccessDataSource, а через обычный OledbCommand, Какое исключение происходит, когда, как ты говоришь, кончается память? |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #4 | Добавлено: 12.08.10 14:59 |
OleDbException не отработано пользовательским кодом.
"Размер поля недостаточен, чтобы принять добавляемые данные. Попробуйте вставить меньшее количество данных." |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #5 | Добавлено: 12.08.10 15:00 |
про вредоностный код - согласен.
Но, загружающий данные на сайт, не заинтересован в загрузке такого кода. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #6 | Добавлено: 12.08.10 15:26 |
andrey-ny пишет:
Но, загружающий данные на сайт, не заинтересован в загрузке такого кода. ха ха ха andrey-ny пишет:
OleDbException не отработано пользовательским кодом. "Размер поля недостаточен, чтобы принять добавляемые данные. Попробуйте вставить меньшее количество данных." И где ты тут нашел нехватку памямти? У тебя банально какая-то строка не вмещается туда куда ты ее хочешь вставить. Например, в столбце максимальная длина 50 символов, ты пытаешься вставить 55 символов, вот что значит эта ошибка. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #7 | Добавлено: 12.08.10 17:09 |
"У тебя банально какая-то строка не вмещается туда куда ты ее хочешь вставить."
Если, у файла больше 220 строк - вылет! Если 220 и менее - всё работает. Вариант, вылета из-за "более 50 символов" - исключён! Проверенно. Вылет, из-за переполнения. Надо каким-то образом разбить поток данных на блоки по 220 строк. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #8 | Добавлено: 12.08.10 20:21 |
Ты понимаешь сколько примерно данных нужно загрузить в память что возникла нехватка памяти (это называется нехватка, а не "переполнение", переполнение это другое). И при этом происходит OutOfMemoryException.
Та ошибка что у тебя говорит именно о том о чем сказал тебе я. Подключи отладчик, дождись когда упадет исключение и посмотри, в какой строчке лежат лишние данные, и получишь ответ на свой вопрос. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #9 | Добавлено: 12.08.10 20:29 |
Кстати покажи пример xml файла.
Через XmlReader работают только с большими XML файлами, которые нельзя загрузить в память (речь идет о нескольких сотнях МБ). Если файл небольшой, намного проще будет считать через XLinQ |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #10 | Добавлено: 12.08.10 20:37 |
Мда, только сейчас увидел что за каша с типами... |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #11 | Добавлено: 12.08.10 22:57 |
файл с 1 800 записей.
тег <data> - такой вариант записи xml файла делает Excel. Mdb-фаил, все поля строковые. Данные, не превышают 20 знаков. ... Что ты подразумеваешь под "Мда, только сейчас увидел что за каша с типами..."? |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 1 Ответов: 6 |
Профиль | Цитата | #12 | Добавлено: 12.08.10 23:00 |
а вылет происходит ещё, когда не делишь данные на 8 строк, а пишешь просто в столбик |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #13 | Добавлено: 13.08.10 00:09 |
Под кашей с типами я понимаю именно кашу с типами.
Добавь в самом верху файла строчку Option Strict On, нажми F5 и увидишь где она. 1800 записей это ерунда, можно через XLinQ считать. andrey-ny пишет:
Вариант, вылета из-за "более 50 символов" - исключён! Проверенно. Сори, но если ты используешь строковые переменные для хранения чисел, то нет никаких оснований считать что этот вариант исключен. Если есть необходимость, можешь стукнуть мне в скайп (artyom_kr), я могу проконсультировать по этому вопросу. |
Страница: 1 |
|