Страница: 1 | 
		
		 
			   
			 
			 
			 
			 Страница: 1 | 
 
			
 
  
		
     
  
    
Вопрос: asp.net  + Access = LOVE
     
    
Добавлено: 12.08.10 09:28
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     andrey-ny
 andrey-ny
      
       
  
Дано:
 
    
Dim (001.mdb) As БАЗА 
Dim (002.asp) As ФайлЗагрузки
ФайлЗагрузки заполняет Базу построчно из файла xml, вынимая данные из тега <date>. 
Проблема:
На 220 строке происходит "вылет". При этом 220 строк уже в файле БАЗА. Вылет происходит по причине переполнения памяти. Если строк в xml-файле меньше 220 - вылет не происходит.
Вопрос:
1.Как разбить процесс заливки на этапы, с очисткой памяти?
2.Как в процессе заливки, после чтения-заполнения 50 строк, очищать память?
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 13
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #1
       
Добавлено:  12.08.10 10:10
       
    
       
  
нет способа очиститьпамять одной срокой, к тому же то что ты пишешь похоже на проблему с драйвером oledb, нужно код смотреть чтоб сказать что за проблема в твоем случае
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: andrey-ny
 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 p1 As String = 0
         im p2 As String = 0
im p2 As String = 0
         im p3 As String = 0
im p3 As String = 0
         im p4 As String = 0
im p4 As String = 0
         im p5 As String = 0
im p5 As String = 0
         im p6 As String = 0
im p6 As String = 0
         im p7 As String = 0
im p7 As String = 0
         im p8 As String = 0
im p8 As String = 0
         im zzz As String = 0
im zzz As String = 0
         im s As String = 0
im s As String = 0
         im x As System.Xml.XmlReader = System.Xml.XmlReader.Create("
im x As System.Xml.XmlReader = System.Xml.XmlReader.Create(" :\045\DATA\Остатки.xml"
:\045\DATA\Остатки.xml" 
         o While x.ReadToFollowing("
o While x.ReadToFollowing(" ata"
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
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #3
       
Добавлено:  12.08.10 14:11
       
    
       
  
1) Вставь в тег code, чтоб смайлов не было.
 
    
2) Передавать таким образом строки для вставки в БД нельзя, так как в xml файле можно вставить вредоносный SQL код и он напрямую отправится в БД
3) Сделай вставку не через AccessDataSource, а через обычный OledbCommand, 
Какое исключение происходит, когда, как ты говоришь, кончается память?
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа: andrey-ny
 andrey-ny






Вопросов: 1
Ответов: 6
      
 Профиль |  | #4
       
Добавлено:  12.08.10 14:59
       
    
       
  
OleDbException не отработано пользовательским кодом.
 
    
"Размер поля недостаточен, чтобы принять добавляемые данные.  Попробуйте вставить меньшее количество данных."
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа: andrey-ny
 andrey-ny






Вопросов: 1
Ответов: 6
      
 Профиль |  | #5
       
Добавлено:  12.08.10 15:00
       
    
       
  
про вредоностный код - согласен.
 
    
Но, загружающий данные на сайт, не заинтересован в загрузке такого кода.
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #6
       
Добавлено:  12.08.10 15:26
       
    
       
  
 
    
Но, загружающий данные на сайт, не заинтересован в загрузке такого кода.  
ха ха ха
OleDbException не отработано пользовательским кодом.
"Размер поля недостаточен, чтобы принять добавляемые данные. Попробуйте вставить меньшее количество данных."  
И где ты тут нашел нехватку памямти?
У тебя банально какая-то строка не вмещается туда куда ты ее хочешь вставить. Например, в столбце максимальная длина 50 символов, ты пытаешься вставить 55 символов, вот что значит эта ошибка.
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа: andrey-ny
 andrey-ny






Вопросов: 1
Ответов: 6
      
 Профиль |  | #7
       
Добавлено:  12.08.10 17:09
       
    
       
  
"У тебя банально какая-то строка не вмещается туда куда ты ее хочешь вставить."
 
    
Если, у файла больше 220 строк - вылет!
Если 220 и менее - всё работает.
Вариант, вылета из-за "более 50 символов" - исключён! Проверенно.
Вылет, из-за переполнения. Надо каким-то образом разбить поток данных на блоки по 220 строк.
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #8
       
Добавлено:  12.08.10 20:21
       
    
       
  
Ты понимаешь сколько примерно данных нужно загрузить в память что возникла нехватка памяти (это называется нехватка, а не "переполнение", переполнение это другое). И при этом происходит OutOfMemoryException.
 
    
Та ошибка что у тебя говорит именно о том о чем сказал тебе я. Подключи отладчик, дождись когда упадет исключение и посмотри, в какой строчке лежат лишние данные, и получишь ответ на свой вопрос.
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #9
       
Добавлено:  12.08.10 20:29
       
    
       
  
Кстати покажи пример xml файла.
 
    
Через XmlReader работают только с большими XML файлами, которые нельзя загрузить в память (речь идет о нескольких сотнях МБ). Если файл небольшой, намного проще будет считать через XLinQ
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #10
       
Добавлено:  12.08.10 20:37
       
    
       
  
Мда, только сейчас увидел что за каша с типами...
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа: andrey-ny
 andrey-ny






Вопросов: 1
Ответов: 6
      
 Профиль |  | #11
       
Добавлено:  12.08.10 22:57
       
    
       
  
файл с 1 800 записей.
 
    
тег <data> - такой вариант записи xml файла делает Excel.
Mdb-фаил, все поля строковые.
Данные, не превышают 20 знаков.
...
Что ты подразумеваешь под  "Мда, только сейчас увидел что за каша с типами..."?
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа: andrey-ny
 andrey-ny






Вопросов: 1
Ответов: 6
      
 Профиль |  | #12
       
Добавлено:  12.08.10 23:00
       
    
       
  
а вылет происходит ещё, когда не делишь данные на 8 строк, а пишешь просто в столбик
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #13
       
Добавлено:  13.08.10 00:09
       
    
       
  
Под кашей с типами я понимаю именно кашу с типами.
 
    
Добавь в самом верху файла строчку Option Strict On, нажми F5 и увидишь где она.
1800 записей это ерунда, можно через XLinQ считать.
Вариант, вылета из-за "более 50 символов" - исключён! Проверенно.  
Сори, но если ты используешь строковые переменные для хранения чисел, то нет никаких оснований считать что этот вариант исключен.
Если есть необходимость, можешь стукнуть мне в скайп (artyom_kr), я могу проконсультировать по этому вопросу.