Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Fox Pro 6 + ADO + triggers / 15 сообщений из 15, страница 1 из 1
30.10.2006, 23:16
    #34092580
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Дано:
- БД на Fox Pro 6 с несколькими таблицами, на которые навешены триггеры на Insert, Update, Delete (для ведения журнала)
- XML файл с записями для таблиц, которые нужно загрузить в БД
- Программа на VB, которая это делает с помощью ADO

Уточнение:
Программе на VB триггеры не нужны, т.к. она сама делает записи в журнал, поэтому я их отключаю, с помощью переменной в настроечной таблице, и они работают в холостую, т.е. сразу RETURN.

Проблема:
Оказалось, что если эти триггеры прикреплены к таблице, то при загрузке больших объемов данных (см. пример кода) начинается жуткое пожирание процессора, как следствие ADO все медленнее и медленнее вставляет записи и весь этот процесс идет по нарастающей до полного калапса (ощущается уже при 1000 записях 8_( ).
Если же их отключить из дизайнера, т.к. в run time это невозможно, то все идет очень быстро (проверял на 10000 записях)

Вопрос:
Как поступить в этом случае не пойму, прогу на Fox Pro переписывать не охота, т.к. не моя она, но делать что-то надо. Как эти триггеры отключить????

Пример кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Private Sub cmdConnect_Click()
    Dim l_objConnection As New ADODB.Connection
    Dim l_objXMLDoc   As New DOMDocument

    l_objConnection.Open "Driver=Microsoft Visual FoxPro Driver;Server=;UID=;PWD=;SourceType=DBC;Exclusive=No;" & _
                         "SourceDB=D:\base.dbc;"
                         
                         
    If l_objConnection.State =  1  Then
                
        l_objXMLDoc.Load "D:\test.xml"
    
        If (l_objXMLDoc.parseError.errorCode <>  0 ) Then
            GoTo LABEL_ERROR_HANDLER
        End If
        
        Dim l_XMLRootNode As IXMLDOMElement
        
        Set l_XMLRootNode = l_objXMLDoc.selectSingleNode("package")
        If (l_XMLRootNode Is Nothing) Then
            GoTo LABEL_ERROR_HANDLER
        End If
        
       
        Dim l_objRst As New ADODB.Recordset
        l_objRst.Open "SELECT * FROM temp", l_objConnection, adOpenStatic, adLockOptimistic
        
        If (l_objRst.State = adStateOpen) Then
                    
            Dim l_XMLRecNode   As IXMLDOMElement
            Dim l_XMLAttribute As IXMLDOMAttribute

            l_objConnection.BeginTrans

            For Each l_XMLRecNode In l_XMLRootNode.childNodes
                
                l_objRst.AddNew
            
                For Each l_XMLAttribute In l_XMLRecNode.Attributes
                    l_objRst.Fields(l_XMLAttribute.Name).Value = l_XMLAttribute.Value
                Next
                
                l_objRst.Update
                
            Next
            
            l_objConnection.CommitTrans
            l_objRst.Close
        End If
     
        Set l_objRst = Nothing

    End If
 
LABEL_ERROR_HANDLER:
    Set l_objXMLDoc = Nothing
    Set l_objConnection = Nothing

End Sub


P.S. Последний крик утопающего. Хелп!!!
...
Рейтинг: 0 / 0
30.10.2006, 23:31
    #34092594
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Вот этот кусок написан очень плохо:
автор l_objRst.AddNew

For Each l_XMLAttribute In l_XMLRecNode.Attributes
l_objRst.Fields(l_XMLAttribute.Name).Value = l_XMLAttribute.Value
Next

l_objRst.Update

Нельзя ли его заменить чем-то более современным - типа INSERT SQL?
...
Рейтинг: 0 / 0
30.10.2006, 23:33
    #34092598
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Pr0teus ...Программе на VB триггеры не нужны, ... поэтому я их отключаю...

.... Как эти триггеры отключить????
Вот эти места как-то противоречат друг-другу...
...
Рейтинг: 0 / 0
30.10.2006, 23:34
    #34092599
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
От этого скорость не увеличиться, в моем случае, т.к. записей не много (да и код будет менее читабельным). Самая главная проблема в триггере.
...
Рейтинг: 0 / 0
30.10.2006, 23:38
    #34092603
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Вот эти места как-то противоречат друг-другу...

В чем?
Просто есть две программы на Fox'е и VB. Обеим нужно записывать в журнал изменений нужные записи. Программе на Fox'е это делают триггеры, т.к. прога уже была сделана до журналирования, а VB это делает сама, т.к. из ADO с ними (триггерами) вообще не понимаю как работать.
...
Рейтинг: 0 / 0
30.10.2006, 23:41
    #34092609
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Pr0teusОт этого скорость не увеличиться, в моем случае, т.к. записей не много (да и код будет менее читабельным). Самая главная проблема в триггере.
В этом случае Вам не надо будет
Код: plaintext
1.
l_objRst.Open "SELECT * FROM temp", l_objConnection, adOpenStatic, adLockOptimistic
тащить все данные на клиента...

Триггеры в FoxPro отключить нельзя, кроме указанными Вами способами... Нет аналога BulkCopy...
...
Рейтинг: 0 / 0
30.10.2006, 23:44
    #34092613
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Pr0teus т.к. из ADO с ними (триггерами) вообще не понимаю как работать.А зачем понимать? Достаточно как я написал выше - использовать Insert SQL и триггеры сами добавят записи куда надо согласно их логики работы... Вы пытаетесь нарушить одно из главных правил баз данных - обойти правила добавления в базу данных, которые до Вас определил другой программист...
...
Рейтинг: 0 / 0
30.10.2006, 23:59
    #34092630
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Этот программист я 8) А с триггерами через ADO гемор, не правильно они работают, во всяком случае я пробовал через них, но не получилось.
Другой вопрос, как правильно проверить флаг в таблице из триггера. Делал выборку, но именно она и есть этот краеугольный камень.
...
Рейтинг: 0 / 0
31.10.2006, 08:51
    #34092867
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Пока остановился на таком решении. Т.е. до выборки дело не доходит, а следовательно и утечки нет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
FUNCTION MainTrigger

  IF(USED(nastr_table)) THEN
   * значит из Fox'а, а не из ADO
  ENDIF
  
  RETURN .T.

ENDFUNC
...
Рейтинг: 0 / 0
31.10.2006, 09:08
    #34092893
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Pr0teusА с триггерами через ADO гемор, не правильно они работают, во всяком случае я пробовал через них, но не получилось...
Это странно... А если попробовать последнюю версию OLE DB Provider VFP 9.1 ? Вам не обязательно использовать для VB старый драйвер FoxPro...

Хотя я почти никогда не применял триггеры с базами данных FoxPro по нескольким причинам... Я обычно применяю хранимые процедуры, которые уже пишут журнал, если надо (но проверял на широкой практике это только на FoxPro начиная с 8 версии)...
...
Рейтинг: 0 / 0
31.10.2006, 09:21
    #34092923
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Конечно надо 8) Хотя бы в целях самообучения. Скинь на mikerub@yandex.ru. Посмотрим как на шестерке будут похать.

А вариант с USED('nastr_table') нормальный или... ???

Просто, если да, то по скорости меня это устраивает.
...
Рейтинг: 0 / 0
31.10.2006, 10:11
    #34093083
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Pr0teus Скинь на mikerub_yandex.ru. Посмотрим как на шестерке будут похать...Вот этого сделать не могу, так как противоречит правилам форума :(
...
Рейтинг: 0 / 0
01.11.2006, 08:44
    #34096159
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Сорри за повтор. Но очень хочется услышать мнение по поводу использования в триггере такой конструкции для определения источника поступления данных - из Fox'а или же из ADO.

Код: plaintext
1.
2.
3.
IF(USED('nastr_table')) THEN
ENDIF

...
Рейтинг: 0 / 0
01.11.2006, 10:10
    #34096348
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Сам себе отвечаю ))) Неправильно. Почему-то на разных машинах дает разный ответ.

И вообще, что видно из области триггера. Попробовал в проге на Fox Pro создавать курсор cur_stub_ триггер его видит. Может так делать проверку?
...
Рейтинг: 0 / 0
07.11.2006, 15:01
    #34109284
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 6 + ADO + triggers
Окончательно остановился на такой конструкции в триггере

Код: plaintext
1.
2.
3.
4.
5.
IF(USED('cur_nastr_')) THEN
 * работаем из Fox'а
ELSE
 * работаем из ADO
ENDIF

Скорость при этом увеличилась на порядок, да и утечка памяти прекратилась 8) И каждая запись обрабатывается за фиксированное время.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Fox Pro 6 + ADO + triggers / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]