Переключение на Главную Страницу Страницы: 1 ... 7 8 [9] 10 11 ... 16 ОтправитьПечать
Очень популярная тема (более 25 ответов) Провайдер OLE DB для ТП (число прочтений - 69109 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #120 - 22. Октября 2007 :: 10:57
Печать  
kiruha писал(а) 22. Октября 2007 :: 10:49:
Там приведены 2 команды - я про предыдущую

А я говорил не про команды, а про EXECSCRIPT.

kiruha писал(а) 22. Октября 2007 :: 10:49:
По прежнему не понятно, зачем закрывать в цикле, если нет открытия.

Чтобы протестировать EXECSCRIPT, что тут непонятного?

kiruha писал(а) 22. Октября 2007 :: 10:49:
Про закрытие - я же сам привел этот код для очистки : http://www.1cpp.ru/forum/YaBB.pl?num=1191570663#7 (в конце), так что "наезд" непонятен.

А вот судя по твоему текущему выступлению, возникает впечатление, что либо читал документацию невнимально, либо забыл.

kiruha писал(а) 22. Октября 2007 :: 10:49:
До этого нигде не было написано что ты открываешь таблицы в одной области.
После IN может быть что угодно.

Ну здрасти. У меня же четко написано:
Код
Выбрать все
"EXECSCRIPT ('USE sc33 IN 2 INDEX sc33 ORDER TAG Descr')" 


Повторяю: USE ... IN 2. И все это цикле.

kiruha писал(а) 22. Октября 2007 :: 10:49:
P.S> Ладно , если обидел извини, не подумал, что мой вопрос заденет.

Это был не вопрос, это был наезд. Вопрос это что-то в стиле: "А вот мне кажется, что при выполнении этого запроса будет утечка из-за USE, а не из-за EXECSCRIPT. Может, это действительно так?" Или что-то в этом роде. Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #121 - 22. Октября 2007 :: 14:08
Печать  
Это нельзя использовать?

Цитата:
Для интеграции вашей программы с Visual FoxPro, вы можете вызывать процедуры Visual FoxPro API. Эти процедуры API представляют собой функции, которые вы можете вызвать из любой программы, написанной на C или C++, включая файл .ocx или .fll, который даст вам доступ к переменным, операциям управления базами данных и выполнения многих других характерных для Visual FoxPro задач

Цитата:
Процедура библиотеки API _DBSkip( )
_DBSkip( ) перемещает указатель записи в заданной рабочей области на заданное число записей

и т.п.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #122 - 22. Октября 2007 :: 14:36
Печать  
kiruha писал(а) 22. Октября 2007 :: 14:08:
Это нельзя использовать?

Это если prg-файлы окажутся слишком медленными. По моим прикидкам нужно два prg-файла: один для USE, а другой для получения списка ИД. Вроде больше не понадобится. Это во-первых.

Во-вторых, а разве для использования API не нужен установленный Fox? Вряд ли API будет работать через OLE DB. А Фокс же, как я понимаю, не бесплатен? Что делать борцунам за легальность? Ради провайдера Фокс покупать?  Смех

С другой стороны FoxAPI можно использовать для решения тех задач, что решает Орефков Улыбка Здесь у нас получается прямое взаимодействие с движком, как у Орефкова с SQLite. Возможно, тут создание памятных таблиц окажется не медленнее, чем с SQLite. Или даже быстрее.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #123 - 22. Октября 2007 :: 15:49
Печать  
Да и еще мыслЯ. У OLE DB провайдера свой контекст, а у FLL, слинкованного наверняка с другими либами, скорее всего, тоже свой контекст. Думаешь, FLL сможет нормально взаимодействовать с провайдером? Непонятно.

С другой стороны, а на фейхуа нам OLE DB (именно для доступа к 1С в ДБФ варианте), если есть возможность прямого взаимодействия с движком Фокса? Не получится ли так быстрее?

Тут, правда, технические вопросы встают: насколько работоспособна FLL без среды Фокспра, например. Т.е. хватит ли просто наличия некоторых DLL на компьютере? И, если хватит, какие DLL для этого нужны? Ну и так далее. (Но очень похоже, что среда окажется необходимой)

Если эти технические вопросы решаемы, то теоретически возможно написать ВК, типа 1foxpro Подмигивание Правда, будет ли она быстрее доступа через OLE DB - не ясно. Из того API, что я просмотрел, напрашивается такой путь выполнения запросов:
- _Execute - CREATE CURSOR НашКурсор для результата запроса.
- _Execute, сюда передаем SQL-запрос с добавленной строкой INTO НашКурсор
- _Execute - USE НашКурсор IN НекотораяОбласть
- _DBRewind - GO TOP для курсора
- _DBSkip + цикл _Load для полей + формирование, например, ТЗ в 1С.

Здесь отсутствуют некоторые детали, например, получение списка полей.
Что получим в результате - не известно. Будет ли такой способ выполнения запросов быстрее доступа через OLE DB - не знаю. Особенно напрягает перегруз результата в CURSOR. А как еще получить доступ к результату выполнения? С другой стороны OLE DB провайдер наверняка может работать с результатом выполнения запроса без промежуточных таблиц. Вот и думай здесь: возможные перспективы - некоторое ускорение выполнения запросов (но они и так довольно шустро выполняются), с другой стороны куча работы и, возможно, более худший результат по сравнению с OLE DB + неудобства распространения ВК (наверняка понадобится таскать несколько DLL или даже среду Фокса).

С третьей стороны, возможно, у кого-то есть опыт создания таких FLL или кто-нибудь знает, где о таком опыте можно почитать (желательно, чтобы там были скоростные характеристики полученного решения). Если из чьего-то положительного опыта вытекают потенциальные охренительные скоростные характеристики решения, сильно превосходящие возможности провайдера OLE DB, то тогда получается стимул в это дело влезать.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #124 - 22. Октября 2007 :: 19:49
Печать  
Я на живой базе активно использую курсоры уже второй месяц.
В основном они мне нужны, чтобы реализовать опцию "все вошедшие в запрос".
Часто нужно узнать заранее список складов, вошедших в запрос - и чтобы не делать лишний запрос -
базовый запрос сохраняю в курсор.

Никакого замедления не замечено(т.е. оно вообще отсутствует).
Видимо это связано с тем, что выполняя запрос (и даже подзапрос, и даже часть запроса) Fox
помещает промежуточные результаты в курсоры (точнее сказать "временная таблица", но для краткости пишу курсор).
Во время операций группировки или соединения таблиц Fox эти курсоры предварительно индексирует.
После возвращения результата - курсоры уничтожается.
Т.е. классический запрос - это много неявных операций над курсорами.

P.S> Возможно интересно
http://support.microsoft.com/kb/894012/en-us
Цитата:
New and updated features in the OLE DB Provider for Visual FoxPro 9.0
...
You can now return more than just a scalar value from a Visual FoxPro stored procedure. To enable this behavior, the following new functions have been added to the Visual FoxPro language:
•      SETRESULTSET
•      GETRESULTSET
•      CLEARRESULTSET
The SETRESULTSET function lets you retrieve a rowset that is created from a marked cursor or retrieve a table from a database container (DBC) stored procedure when the OLE DB Provider for Visual FoxPro finishes command execution.

т.е. в хранимой процедуре можно методами xBase сформировать курсор и его вернуть SETRESULTSET - должно быть быстрее чем строкой.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #125 - 23. Октября 2007 :: 22:16
Печать  
kiruha писал(а) 22. Октября 2007 :: 19:49:
т.е. в хранимой процедуре можно методами xBase сформировать курсор и его вернуть SETRESULTSET - должно быть быстрее чем строкой.

За SETRESULTSET спасибо.

Однако, зря ты думаешь, что возвращать курсор будет быстрее. Ты знаешь, сколько весит CValue? 84 байта. Плюс дополнительная память для CString в составе этого CValue. На каждое значение курсора. 20 ИДшников - создание 20 CValue. Так уж сделано взаимодействие между системой OLE DB и провайдером. Если переделывать на взаимодействие через простые типы, то придется писать свой аналог OLE DB, взяв за основу тот, что есть. Или серьезно усложнять протокол взаимодействия между OLE DB и провайдером. А когда возвращаем строку, достаточно одного CValue, которое все, что надо, содержит.

Правда, все равно пришлось возвращать курсор, потому что помимо ИДшников понадобились физические номера строк.  Смех
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #126 - 24. Октября 2007 :: 02:53
Печать  
В общем, получилась такая штука для выдирания ИДшников:
Код
Выбрать все
FUNCTION QueryRows (strTableName, strTagName, nRowFrom, nNumRows, strKeyField, fForward)
	CLOSE TABLES ALL
*	IF USED ("GridProviderIDS")
*		USE IN "GridProviderIDS"
*	ENDIF

	CREATE CURSOR GridProviderIDS (ID CHARACTER(9), RECN INTEGER(10))

	TableAlias = "_" + strTableName
*	IF USED ( (TableAlias) )
*	ELSE
		USE (strTableName) IN 0 ALIAS (TableAlias)
*	ENDIF

	SELECT (TableAlias)

*	IF (UPPER (CDX (1)) != UPPER (strTableName)) OR (UPPER (TAG ()) != UPPER (strTagName))
		SET ORDER TO TAG (strTagName) OF (strTableName)
*	ENDIF

	IF fForward = 1 THEN
		nStep = 1
	ELSE
		nStep = -1
	ENDIF

	IF nRowFrom = 0 THEN
		IF fForward = 1 THEN
			GO TOP
		ELSE
			GO BOTTOM
		ENDIF
	ELSE
		IF RECNO () != nRowFrom THEN
			GOTO nRowFrom
		ENDIF
		SKIP nStep
	ENDIF

	NumFields = AFIELDS (arrFields)
	UpKeyField = UPPER (strKeyField)
	KeyFieldNum = 0
	FOR CurField = 1 TO NumFields
		IF UPPER (arrFields(CurField, 1)) = UpKeyField
			KeyFieldNum = CurField
			EXIT
		ENDIF
	ENDFOR

	FOR Rec = 1 TO nNumRows
		SELECT (TableAlias)
		IF EOF ()
			EXIT
		ENDIF

		IF BOF ()
			EXIT
		ENDIF

		RN = RecNo ()
		SCATTER TO ValArr
		INSERT INTO GridProviderIDS ('ID','RECN') VALUES (ValArr(1,KeyFieldNum), RN)
		SELECT (TableAlias)
		SKIP nStep
	ENDFOR

*	SELECT (TableAlias)
*	USE
	RETURN SETRESULTSET ("GridProviderIDS")
ENDFUNC
 


* - звездочки - это однострочные комментарии - аналог "//" для 1С
При постоянном пейдждауне потребление процессора 30-40%. Память не съедается. Кое-что еще можно ускорить для уменьшения потребления CPU (например, цикл по полям можно сделать один раз, а не при каждом запросе ИДшников).

Напрягает одно: наличие CLOSE TABLES ALL. Без этой конструкции происходит слабая утечка памяти: 1-2 Мб за 2 года журнала. Вроде бы для утечки нет оснований. Курсор уничтожался командами:
Код
Выбрать все
*	IF USED ("GridProviderIDS")
*		USE IN "GridProviderIDS"
*	ENDIF
 


Основная таблица не переоткрывалась в цикле - вот это было раскомментарено:
Код
Выбрать все
*	IF USED ( (TableAlias) )
*	ELSE
		USE (strTableName) IN 0 ALIAS (TableAlias)
*	ENDIF
 


То ли я конкретно плаваю в Фоксе и что-то конкретно не так делаю, то ли в  OLE DB что-то не в порядке.

В принципе, с CLOSE TABLES ALL результат для локальной машине, ИМХО, достаточно приемлемый (особенно, если учесть, что я тестировал DEBUG-сборку провайдера). Однако, опасаюсь, что постоянные дерганья - закрытие/открытие таблиц может привести к тормозам при работе по сети...

Еще одно слабое место - SCATTER TO ValArr. Изначально эта хрень выглядела как SCATTER FIELDS strKeyField TO ValArr. Далее ИД забиралось из ValArr(1,1). Этот алгоритм хорошо работал со справочниками, но перестал на журнале. Вместо IDDoc мне подсовывался IDJOURN. Оказалось, что SCATTER складывает в массив вообще все поля текущей записи, а не только одно ключевое поле, как мне надо. У справочника ID идет первым полем, поэтому алгоритм работает. А у журнала IDDoc идет вторым полем, после IDJourn. То ли в OLE DB нельзя выбирать конкретные поля, то ли SCATTER FIELDS strKeyField понимает выражение буквально: выбрать поле с названием "strKeyField". В этом случае могли бы помочь такие вещи: SCATTER &strKeyField или SCATTER '&strKeyField', но Фокс ругается, что "Feature not available". Фокус с INSERT'ом так же не проходит:
Код
Выбрать все
		INSERT INTO GridProviderIDS ('ID','RECN') VALUES (&strKeyField, RN)
 


Аналогично "Feature not available".
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #127 - 24. Октября 2007 :: 08:24
Печать  
Цитата:
Имена можно замещать переменными памяти, используя макроподстановку. Использование макроподстановки заключается в том, что перед именем переменной помещают знак амперсанд (&) для того, чтобы сообщить Visual FoxPro, что значение переменной употребляется в качестве имени; заканчивается выражение макроподстановки символом точки (.).

Например, следующий код выводит на экран текст "FoxPro":

x = "Fox"
? "&x.Pro"



Может это поможет
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #128 - 24. Октября 2007 :: 08:34
Печать  
Alex_Bob писал(а) 24. Октября 2007 :: 08:24:
Может это поможет

Не помогло (а про точку-то я не заметил нюанса в доке...) Пробовал и так
Код
Выбрать все
INSERT INTO GridProviderIDS ('ID','RECN') VALUES ("&strKeyField.", RN) 


и так
Код
Выбрать все
INSERT INTO GridProviderIDS ('ID','RECN') VALUES (&strKeyField., RN) 


Вопит
Цитата:
Feature is not available.

  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #129 - 24. Октября 2007 :: 09:35
Печать  
Еще можно попробовать в скобки взять
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #130 - 24. Октября 2007 :: 09:38
Печать  
Название полей в кавычках - это так должно быть?
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #131 - 24. Октября 2007 :: 09:39
Печать  
Alex_Bob писал(а) 24. Октября 2007 :: 09:35:
Еще можно попробовать в скобки взять

Это сразу пробовал. Сейчас попробовал скобки с амперсендом вместе. Все та же хрень.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #132 - 24. Октября 2007 :: 09:40
Печать  
spock писал(а) 24. Октября 2007 :: 09:38:
Название полей в кавычках - это так должно быть?

Это ты про что? Вообще, вроде бы в СКЛ везде можно имена полей и таблиц в кавычках писать.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #133 - 24. Октября 2007 :: 09:51
Печать  
Цитата:
Visual FoxPro 9.0 Language Reference  
INSERT - SQL Command  

...

Example 1
The following example opens the Employee table and adds one record.

USE employee
INSERT INTO employee (emp_no, fname, lname, officeno) ;
  VALUES (3022, "John", "Smith", 2101)
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #134 - 24. Октября 2007 :: 09:52
Печать  
И?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 7 8 [9] 10 11 ... 16
ОтправитьПечать