Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Events Binding / 14 сообщений из 14, страница 1 из 1
29.09.2003, 19:52
    #32278852
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Здравствуйте!

Хотел немного украсить приложение с использованием событий.

Задача простая: из VFP 6.0(SP5) зацепиться за событие RowsCopied из SQLDMO.BulkCopy.
Нижеприведённый код
Код: 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.
oSQLServer = CreateObject( "SQLDMO.SQLServer" )

oSQLServer.Connect( "Server" , "user" , "pwd" )
if !oSQLServer.VerifyConnection( 2 )	&& Is Connected
       return
endif

oDatabase = oSQLServer.Databases( "Northwind" )	&& Select Database
oTable = oDatabase.Tables( "Customers" )	&& Select Table

*oBulkCopy = CreateObject( "SQLDMO.BulkCopy" )	
oBulkCopy = CreateObjectEx( "SQLDMO.BulkCopy" , "")	

oBulkCopy.ImportRowsPerBatch = 1000 	&& Rows per batch/transaction
oBulkCopy.DataFilePath  = "c:\customers.txt "	&& Output file name
oBulkCopy.DataFileType = 3 			&& Column/Row Delimiter file type
oBulkCopy.ColumnDelimiter = "|*| "					
oBulkCopy.RowDelimiter = " |*| "+chr(13 )+chr( 10 )
oBulkCopy.SetCodePage( 0 )			&& Use  1252 

oVFPCOM = CreateObject("VFPCOM.COMUTIL ")			
oBulkCopyEvents = CreateObject(" BulkCopySink ")
oVFPCOM.BindEvents(oBulkCopy,oBulkCopyEvents)

oTable.ExportData(oBulkCopy)

oVFPCOM.UnBindEvents(oBulkCopy,oBulkCopyEvents)

DEFINE CLASS BulkCopySink AS custom
	PROCEDURE BatchImported(Message)
		wait window " Batch " nowait
	ENDPROC
	PROCEDURE RowsCopied(Message, Rows)
		wait window " Rows" nowait
	ENDPROC
ENDDEFINE

ругается
OLE IDispatch exception code 5 from Microsoft SQL-DMO:
Code execution exception:
EXCEPTION_ACCESS_VIOLATION

Помогите понять в чём проблема.


VFPCOM - последний.

Если выполнить
oVFPCOM.ExportEvents(oBulkCopy,"BulkCopy_Events.prg"), то полученный файл никаких методов не содержит. Help говорит, что процедуры должны быть private. Может проблема в этом?

Оба события BatchImported и RowsCopied объявлены как методы VTABLE интерфейса BulkCopySink. Может в VFP как в интерпретаторе раннее связывание не возможно?

Спасибо
...
Рейтинг: 0 / 0
30.09.2003, 13:10
    #32279412
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
В VFP7,8 все это без проблем.
В VFP6 действительно надо как-то выкручиваться через VFPCOM, но как это сделать не знаю , потому что давно не работаю с шестеркой.
...
Рейтинг: 0 / 0
02.10.2003, 08:46
    #32281405
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Установил VFP8.0

Ситуация "улучшилась". Сообщение об ошибке исчезло, но EventHandler() возвращает .F. и, естественно, никакие события не отлавливаются.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
....
oBulkCopyEvents = CreateObject( "BulkCopySink" )
?EventHandler(oBulkCopy,oBulkCopyEvents)

oTable.ExportData(oBulkCopy)

?EventHandler(oBulkCopy,oBulkCopyEvents,.t.)

DEFINE CLASS BulkCopySink AS custom 
implements BulkCopySink IN  "SQLDMO.BulkCopy" 

PROCEDURE BulkCopySink_RowsCopied(Message AS STRING, Rows AS Number) AS VOID;
       HELPSTRING  "Message notifying of every 1000  rows copied"
       wait window  "Rows"  nowait
ENDPROC

PROCEDURE BulkCopySink_BatchImported(Message AS STRING) AS VOID;
       HELPSTRING  "Message notifying of every import batch committed" 
       wait window  "Batch"  nowait
ENDPROC
ENDDEFINE

В чём проблема?
Спасибо
...
Рейтинг: 0 / 0
02.10.2003, 10:13
    #32281486
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Должно быть
IMPLEMENTS BulkCopySink IN "c:\program files\microsoft sql server\80\tools\binn\sqldmo.dll"
Так как интерфейс BulkCopySink объявлен не в соклассе SQLDMO.BulkCopy
Класс BulkCopySink должен быть объявлен не как custom , а как session.
oBulkCopy должно быть создано командой CreateObject , а не CreateObjectEx
(oBulkCopy = CreateObject("SQLDMO.BulkCopy"))
Попробуйте это. Если не поможет, тогда надо серьезней разбираться...
...
Рейтинг: 0 / 0
02.10.2003, 18:53
    #32282541
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Опробовал все предложенные варианты плюс
IMPLEMENTS BulkCopySink IN {10010001-E260-11CF-AE68-00AA004A34D5}#8.0

Результат тот же - методы BulkCopySink_RowsCopied и BulkCopySink_BatchImported не вызываются.

Также заметил, что имена методов интерфейса BulkCopySink определяются правильно: если в классе не определить один из методов, то VFP ругается и требует его определения. При этом не важно, как ищется информация об интерфейсе- через TypeLib, TypeLibGUID или ProgID.

В чем проблема?
Можно ли узнать причину по которой EventHandler() возвращает .F.?

2Crip
Я так понимаю, на Вашем компьютере этот простой пример работает без проблем?

Спасибо.
...
Рейтинг: 0 / 0
03.10.2003, 11:22
    #32282963
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Проверил. Не ваяется каменный цветок...
Кстати все объявления implements были правильными и как ни странно CreateObjectEx работает. А вот EventHandler ни в какую...:(((
А что в VB все работает?
...
Рейтинг: 0 / 0
03.10.2003, 12:09
    #32283055
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
На VB я не проверял. Help обещает, что должно работать.
...
Рейтинг: 0 / 0
06.10.2003, 11:57
    #32284762
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Вообщем выяснили в фоксклубе, что это баг с ранним связыванием.
Могу предложить помощь в написании IDispatсh обертки на C++ или VB
...
Рейтинг: 0 / 0
06.10.2003, 19:17
    #32285578
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
2Crip
Не уверен, что это баг.
VFP7.0,VFP7.0(SP1),VFP8.0 - длинный список.
За помощь - спасибо.
...
Рейтинг: 0 / 0
07.10.2003, 10:27
    #32285861
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
2vklepko
На фоксклабе я уже писал, что глюк нестабилен. С некоторыми интерфейсам все тип-топ...
...
Рейтинг: 0 / 0
10.09.2004, 15:06
    #32689856
Dushes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
2crip
cripВообщем выяснили в фоксклубе, что это баг с ранним связыванием.
Могу предложить помощь в написании IDispatсh обертки на C++ или VB


Сам столкнулся точно с такой же проблемой - описание проблемы на foxclub - если есть возможность обернуть интерфейс SQLDMO.ServerSink в IDispatch - то буду очень благодарен в рамках возможного ;).

С уважением
duШes
...
Рейтинг: 0 / 0
12.09.2004, 23:05
    #32691063
Гость_xxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
А сами, ручками, не пробовали ? У меня получилось, только для этого нужно
работать через СOM написанным на VFP. Подробности тут
/topic/96944&pg=-1
А Events Binding глючил и будет, по ходу, глючить еще долго.
...
Рейтинг: 0 / 0
13.09.2004, 11:25
    #32691400
Dushes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
Гость_xxx А сами, ручками, не пробовали ? У меня получилось, только для этого нужно
работать через СOM написанным на VFP. Подробности тут
/topic/96944&pg=-1

А Events Binding глючил и будет, по ходу, глючить еще долго.

Если можно - объясните неграмотному, из указанного обсуждения мало что понял....интересует больше последовательность действий
С уважением
duШes
...
Рейтинг: 0 / 0
13.09.2004, 19:08
    #32692665
Гость_xxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Events Binding
А что тут пояснять ? Как получить ссылку на интерфейс объекта и связать его посредством Implements с Вашим объектом фокса ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Events Binding / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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