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