Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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
        ;Dim p1 As String = 0
        ;Dim p2 As String = 0
        ;Dim p3 As String = 0
        ;Dim p4 As String = 0
        ;Dim p5 As String = 0
        ;Dim p6 As String = 0
        ;Dim p7 As String = 0
        ;Dim p8 As String = 0

        ;Dim zzz As String = 0
        ;Dim s As String = 0

        ;Dim x As System.Xml.XmlReader = System.Xml.XmlReader.Create(";D:\045\DATA\Остатки.xml";)
        ;Do While x.ReadToFollowing(";Data";)
            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
andrey-ny пишет:
Но, загружающий данные на сайт, не заинтересован в загрузке такого кода.

ха ха ха

andrey-ny пишет:
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 считать.

andrey-ny пишет:
Вариант, вылета из-за "более 50 символов" - исключён! Проверенно.

Сори, но если ты используешь строковые переменные для хранения чисел, то нет никаких оснований считать что этот вариант исключен.

Если есть необходимость, можешь стукнуть мне в скайп (artyom_kr), я могу проконсультировать по этому вопросу.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам