Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с курсорадаптером. / 7 сообщений из 7, страница 1 из 1
09.04.2007, 15:37
    #34447670
dmitryx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Обрисую в кратце ситуацию. Клиент на VFP9SP1, сервер - Oracle 10g, подключение через оракловский odbc. На сервере есть справочник, одно из полей которого типа blob и в нем хранятся картинки (gif). На форме редактирования этого справочника есть 2 вкладки, одна для редактирования атрибутов, 2я - для просмотра этой самой картинки. Чтобы уменьшить количество передаваемых между сервером и клиентом данных, я решил в "основном" курсорадаптере исключить blob поле и сделать для него отдельный курсорадаптер, который будет "наполнятся" по требованию клиента (в моем случае - по клику на pageframe).

В классе приложения создается разделяемое подключение, с помощью комманды:
Код: plaintext
This.nHandle = SQLSTRINGCONNECT(lcConnString, .T.)

Для формы описан dataenvironment, который использует это подключение.
Код: 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.
61.
62.
63.
64.
65.
66.
67.
DEFINE CLASS test1 AS Dataenvironment
	Name = "test1"
	Width =  155 
	Height =  84 
	*InitialSelectedAlias = "curkam"
	DataSourceType = "ODBC"

	ADD OBJECT cashem AS _cashem
	ADD OBJECT casprkam AS _casprkam

	PROCEDURE BeforeOpenTables
		*** Select connection code: DO NOT REMOVE
		***<DataSource>
		This.DataSource = goApp.nHandle
		***</DataSource>
		*** End of Select connection code: DO NOT REMOVE
	ENDPROC
ENDDEFINE

**************************************************
DEFINE CLASS _casprkam AS cursoradapter

  Name = "_casprkam"
	UseDeDataSource = .T.
	AllowSimultaneousFetch = .T.
	SelectCmd = "select FLAGPROV, OBJID, NKAM, RN, MAG, KW,  DATE_P, DATE_R from SPR_KAM"
	CursorSchema = "FLAGPROV N(1, 0), OBJID N(9, 0), NKAM V(50), RN N(2, 0), MAG V(4), KW V(4), DATE_P D, DATE_R D"
	Alias = "curkam"
	BufferModeOverride =  5 
	Flags =  0 
	FetchAsNeeded = .T.
	FetchMemo = .F.
	FetchSize =  30 
	KeyFieldList = "OBJID"
	Tables = "SPR_KAM"
	UpdatableFieldList = "FLAGPROV, OBJID, NKAM, RN, MAG, KW, DATE_P, DATE_R"
	UpdateNameList = "FLAGPROV SPR_KAM.FLAGPROV, OBJID SPR_KAM.OBJID, NKAM SPR_KAM.NKAM, RN SPR_KAM.RN, MAG SPR_KAM.MAG, KW SPR_KAM.KW, DATE_P SPR_KAM.DATE_P, DATE_R SPR_KAM.DATE_R"
	MapVarchar = .T.
	MapBinary = .T.
	UseCursorSchema = .T.
	AllowSimultaneousFetch = .T.
	NoData = .F.
	
ENDDEFINE

**************************************************
DEFINE CLASS _cashem AS cursoradapter
	
	nObjID =  0 
	Name = "_cashem"
	
	UseDeDataSource = .T.
	AllowSimultaneousFetch = .T.
	CursorSchema = "OBJID N(9, 0), TKSHEM W"
	SelectCmd = "select OBJID, TKSHEM from SPR_KAM where objid=?This.nObjID"
	Alias = "curshem"
	Flags =  0 
	KeyFieldList = "OBJID"
	Tables = "SPR_KAM"
	UpdatableFieldList = "TKSHEM"
	UpdateNameList = "OBJID SPR_KAM.OBJID, TKSHEM SPR_KAM.TKSHEM"
	UseCursorSchema = .T.
	MapVarchar = .T.
	MapBinary = .T.
	NoData = .T.
	
ENDDEFINE

Форма нормально запускается, грид наполняется данными из casprkam, но при попытке вызвать метод CursorFill для cashem выдается сообщение: "Connection ... is busy."
Собственно сам метод с CursorFill:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#DEFINE CR CHR( 13 )
LOCAL loObj as Object
LOCAL lcOldRecordSource as String 
LOCAL lnCounter, lnColumnCount, lnOrderByPos
This.objid = curkam.objid
lcOldRecordSource = "curshem"
loObj = GETCURSORADAPTER( UPPER(lcOldRecordSource) )

IF TYPE("loObj")=="O" AND UPPER(ALLTRIM(loObj.BaseClass)) = "CURSORADAPTER" AND UPPER(ALLTRIM(loObj.Alias)) = UPPER(lcOldRecordSource)
	loObj.nObjID = This.objid
	IF loObj.CursorFill(.T., .F.)
		This.Pageframe1.Page2.Image1.PictureVal = curshem.tkshem
	ELSE 
		= AERROR(laErrorArray)  && Data from most recent error
		MESSAGEBOX("Ошибка при получении данных."+CR+laErrorArray[ 2 ])
	ENDIF 
ENDIF 

Что я только не делал - ничего не получается, идеи иссякли... Надеюсь на вашу помощь, друзья.
...
Рейтинг: 0 / 0
10.04.2007, 10:29
    #34449115
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Сталкивался с чем-то похожим , правда на MS SQL
Поиграйся со свойствами "Fetch..."
У меня была проблема с тем , что стояла загрузка порциями FetchAsNeeded = .T.
И пока первая таблица не прогружалась полностью , все остальные не грузились.
Разрулил ситуевину добавлением еще одного "шарового" конекта
т.е. для одного CA для конекта используем nHandle
а для второго SQLCONNECT(nHandle)
...
Рейтинг: 0 / 0
10.04.2007, 10:31
    #34449128
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Сталкивался с чем-то похожим , правда на MS SQL
Поиграйся со свойствами "Fetch..."
У меня была проблема с тем , что стояла загрузка порциями FetchAsNeeded = .T.
И пока первая таблица не прогружалась полностью , все остальные не грузились.
Разрулил ситуевину добавлением еще одного "шарового" конекта
т.е. для одного CA для конекта используем nHandle
а для второго SQLCONNECT(nHandle)
...
Рейтинг: 0 / 0
10.04.2007, 11:35
    #34449397
dmitryx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Собственно, FetchAsNeeded = .T. и стоит. И весь смысл был в нем, т.к. справочник достаточно большой я не хочу загружать на клиента все записи. Думал поможет установка AllowSimultaneousFetch = .T., не помогло. А руками делать SQLCONNECT для второго курсорадаптера конечно можно, но если мне нужно открыть другую форму, использующую общий nHandle - опять "connection is busy" вылезет. Можно и форму перепроектировать, ограничивая объем выборки чтобы отпала необходимость в FetchAsNeeded, но мне кажется, что я все-таки что-то делаю неправильно.
...
Рейтинг: 0 / 0
10.04.2007, 11:51
    #34449478
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Пока вся таблица не прогрузиться - конект будет занят - тут уж ничего не поделаешь.
Сам с этим игрался.
Помогло именно создание отдельного конекта.
SQLCONNECT(nHandle) - создает конект "внутри" nHandle - т.е. сам nHandle остается свободен.
...
Рейтинг: 0 / 0
10.04.2007, 12:38
    #34449663
asp_fox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Не знаю на сколько это может помочь. Сейчас под рукой нет кода, как это делал (7 лет прошло). Проблема была та же, более того - для пользоваетеля интранета необходимо было давать дозированную информацию из базы Оракла со сотнями тысяч записей. И делал это стандартно:
1- ограничивал объем запроса соответсвующими параметрами. (максимум на 2 страницы)
2 -Открывал базу в режиме NODATA
3 - когда требовалось (пере)запросить информацию или двинуться дальше - изменял параметры
и вызывал Requery('myRemoteView') - все работало как часы.
Теперь ВАЖНО! Но когда надо было к одной и той же базе (таблице) одновременно коннектиться из разных представлений ( как в Вашем случае) для ускорения , то использовал второй ODBC источник к той же базе и они создавали иллюзию, будт-то я с разными таблицами работаю - без задержек. Сейчас возможно такие выкрутасы и не потребуются - надо проверять.
...
Рейтинг: 0 / 0
11.04.2007, 14:27
    #34453037
dmitryx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с курсорадаптером.
Собственно, поступил, как советовал -=AlexiS=- - каждый CA получает свой handle через SQLCONNECT и уже через него работает. Мне почему-то казалось, что AllowSimultaneousFetch = .T. должно было сказать CA самому разрешать такие ситуации.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите разобраться с курсорадаптером. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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