Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> заполнение БД, большое количество данных 
V
    Опции темы
neiron
  Дата 11.2.2008, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Необходимо информацию из текстовика добавить в БД. С малыми файлами работает отлично. Но с большими возникают трудности.

Собственно код:

Код

    'заполнение таблицы
    For i = 1 To (KolDan / KolLine)
        ZagStr = "insert into " & mdGlob.nameData & " values ("
        For j = 1 To KolLine
            temp = CStr(ArrDan(i, j))
            If InStr(1, temp, ",") > 0 Then
                temp = Mid$(temp, 1, InStr(1, temp, ",") - 1) & "." & Mid$(temp, InStr(1, temp, ",") + 1, Len(temp) - InStr(1, temp, ","))
            End If
            If mdGlob.ArrType(j) = "date" Or mdGlob.ArrType(j) = "text" Then
                ZagStr = ZagStr & "'" & temp & "'"
            Else
                ZagStr = ZagStr + temp
            End If
            If j = KolLine Then
                ZagStr = ZagStr & ")"
            Else
                ZagStr = ZagStr & " , "
            End If
        Next j
        mdDB.execute (ZagStr)
    Next i


Обновление БД:
Код

Public Sub execute(ComStr As String)
    conn.execute (ComStr)
End Sub


Сначала маленький вопросик по 2й строке. Что лучше использовать:
For i = 1 To (KolDan / KolLine) 
или
for i=1 to ubound(arrdan)? Что быстрее? Или koldan/kolline в переменную вынести?


Теперь собственно проблема. При загрузке файлов, где количество данных более 1*4000 (примерно), т.е. 2 и более рядов данных и в каждом более чем по 4000 значений, возникают непонятные проблемы с заполнением БД. 
Примерно до 4000й строки всё нормально пишется, затем строки непонятным образом переставляются (зависимости не нашёл). Именно переставляются, а не заменяются неизвестными значениями. При этом концовка может получиться какой угодно - последние записи в БД могут даже совпадать с исходными. 
Массив ArrDan смотрел, все переменные тоже отслеживал. На выполнение подаётся правильная строка. Что интересно, при пошаговом выполнении строки пишутся нормально, в автомате сбой. Причём сбой всё время повторяется, т.е. начинает менять на определённой строке. 

Пока это писал ещё заметил. Для экспорта из екселя используется точно такой же код. Он работает прекрасно, хотя точно так же использует массив.

Код

    For i = stCol To row
        ZagStr = "insert into " & mdGlob.nameData & " values ("
        For j = 1 To col
            temp = CStr(ArrDan(i, j))
            If InStr(1, temp, ",") > 0 Then
                temp = Mid$(temp, 1, InStr(1, temp, ",") - 1) & "." & Mid$(temp, InStr(1, temp, ",") + 1, Len(temp) - InStr(1, temp, ","))
            End If
            If mdGlob.ArrType(j) = "date" Or mdGlob.ArrType(j) = "text" Then
                ZagStr = ZagStr & "'" & temp & "'"
            Else
                ZagStr = ZagStr + temp
            End If
            If j = col Then
                ZagStr = ZagStr & ")"
            Else
                ZagStr = ZagStr & " , "
            End If
        Next j
        mdDB.execute (ZagStr)
    Next i
    Unload Me

что называется - найдите 5 отличий. При этом во втором куске использовался строковый массив, в первом числовой. Изменил везде на строковый - теперь строки начинают меняться ещё раньше. 

В чём же может быть дело? Почему в первом примере строки пишутся коряво, а во втором всё работает? Типы данных везде одинаковы. 

Это сообщение отредактировал(а) neiron - 11.2.2008, 05:04
PM MAIL   Вверх
Akina
Дата 11.2.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neiron @  11.2.2008,  06:03 Найти цитируемый пост)
Что лучше использовать:
For i = 1 To (KolDan / KolLine) 
или
for i=1 to ubound(arrdan)? Что быстрее? Или koldan/kolline в переменную вынести?

Совершенно очевидно, что если данные содержатся в массиве, то ни то, ни другое.
Код

For i = lbound(arrdan) to ubound(arrdan)

Либо 
Код

lsize = lbound(arrdan) 
usize = ubound(arrdan)
' .....
For i = lsize to usize

Второй вариант предпочтительнее для статических данных.
Если же данные лежат в коллекции - то ForEach без вариантов.

Цитата(neiron @  11.2.2008,  06:03 Найти цитируемый пост)
Примерно до 4000й строки всё нормально пишется, затем строки непонятным образом переставляются (зависимости не нашёл). Именно переставляются, а не заменяются неизвестными значениями. При этом концовка может получиться какой угодно - последние записи в БД могут даже совпадать с исходными. 

Ну очень невнятно... я, например, пока не понял что происходит.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 11.2.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Добавил counter поле. Всё нормально теперь. Видимо, отображение появлялось не в порядке заполнения БД, а как-то иначе, что меня и пугало. 


Akina, спасибо, но не понимаю принципа. Т.е. пределы счётчика автоматом запоминаются где-то в памяти и при каждой проверке i не происходит высчитывание пределов, а происходит только сравнение? Иначе зачем использовать в объявлении цикла функции?
PM MAIL   Вверх
Akina
Дата 11.2.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neiron @  11.2.2008,  18:23 Найти цитируемый пост)
отображение появлялось не в порядке заполнения БД, а как-то иначе

О господи!!! еще один адепт файловых баз данных...

Цитата(neiron @  11.2.2008,  18:23 Найти цитируемый пост)
спасибо, но не понимаю принципа. Т.е. пределы счётчика автоматом запоминаются где-то в памяти и при каждой проверке i не происходит высчитывание пределов, а происходит только сравнение? Иначе зачем использовать в объявлении цикла функции? 

а а каком языке вы понимаете принцип работы цикла? они абсолютно везде одинаковы...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 11.2.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Akina, принцип как таковой я понимаю. Не понимаю одного - при каждой иттерации счётчик сравнивается с пределами. Пределы эти высчитываются непосредственно во время сравнения или хранятся в памяти в течении всего выполнения цикла? Я спрашиваю что эффективнее с точки зрения оптимизации по скорости? 
Сделал маленькую тулзу. Проверил - разницы в скорости вообще не заметил.
PM MAIL   Вверх
Akina
Дата 11.2.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neiron @  11.2.2008,  19:18 Найти цитируемый пост)
Проверил - разницы в скорости вообще не заметил. 

То есть экспериментально установили, что пределы вычисляются ДО начала выполнения цикла и в дальнейшем не пересчитываются. Хотя нагляднее было в качестве одного из пределов использовать то, что вернет InputBox:
Код

Private Sub Command1_Click()
Dim i As Integer
For i = 0 To Abs(CInt(InputBox("Верхний предел (0 или больше) = ", "Ввод данных", 0)))
    Debug.Print i
Next i
End Sub



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 11.2.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Akina, угу, теперь понятно. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.