powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Fox Pro 6 + ADO + triggers
15 сообщений из 15, страница 1 из 1
Fox Pro 6 + ADO + triggers
    #34092580
Pr0teus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дано:
- БД на 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
Fox Pro 6 + ADO + triggers
    #34092594
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот кусок написан очень плохо:
автор 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
Fox Pro 6 + ADO + triggers
    #34092598
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pr0teus ...Программе на VB триггеры не нужны, ... поэтому я их отключаю...

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

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

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

Код: 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
Fox Pro 6 + ADO + triggers
    #34092893
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pr0teusА с триггерами через ADO гемор, не правильно они работают, во всяком случае я пробовал через них, но не получилось...
Это странно... А если попробовать последнюю версию OLE DB Provider VFP 9.1 ? Вам не обязательно использовать для VB старый драйвер FoxPro...

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

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

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

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

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

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

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

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


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