Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос к dbf-кам с SQL-сервера (число прочтений - 11641 )
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Запрос к dbf-кам с SQL-сервера
10. Октября 2006 :: 03:21
Печать  
Всем привет!

Нужна помощь в решении этой задачи. Пробовал создать linked server и у меня даже это получилось и запросы работают! Но никак не могу добиться адекватной кодовой страницы - лезут козябушки...

Код
Выбрать все
	ТекстЗапроса = "
		|EXEC sp_addlinkedserver
		|	@server = 'Trade',
		|	@provider = 'Microsoft.Jet.OLEDB.4.0',
		|	@srvproduct = 'OLE DB Provider for Jet',
		|	@datasrc = '\\Server3\Data\',
		|	@provstr = 'dBASE IV'
		|";

	RS = СоздатьОбъект("ODBCRecordSet");
	RS.ВыполнитьИнструкцию(ТекстЗапроса); 


Сервер создался, все ОК, правда на второй закладке linked-сервера в EM пришлось указать способ авторизации вручную Be made without using a security context, но это пустяки!

Код
Выбрать все
	ТекстЗапроса = "
		|select TOP 10
		|	*
		|from Trade...SC204
		|";
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	RS = СоздатьОбъект("ODBCRecordSet");
	ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку(); 


запрос отработал нормально - все увидел своими глазами, но вот кодовую страницу он упорно использует cp866, а надо 1251!
Бился с настройками linked servera, с Collation Name - все перепробовал - не помогает, такое впечатление, что это вообще не влияет на выборку...

Может нужно использовать другой драйвер? Эту строку подключения нашел в инете и она рабочая, все что ни подсовывал сам - не канает...  Озадачен

Кстати, решение не исчерпывается тем, на чем я застопорился! Меня устроит любое решение реализующее запрос на выборку информации из рабочей dbf-базы с SQL-сервера, т.е чтобы можно было присоединить к этому запросу таблицы самого SQL-сервера и т.д.
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #1 - 10. Октября 2006 :: 08:14
Печать  
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #2 - 10. Октября 2006 :: 08:30
Печать  
может так?
Код
Выбрать все
	ТекстЗапроса = "
		|EXEC sp_addlinkedserver
		|	@server = '',
		|	@provider = 'MSDASQL',
		|	@srvproduct = '',
		|	@datasrc = '',
		|	@provstr = 'DRIVER=Microsoft Visual FoxPro Driver; Deleted=Yes;Null=Yes;Collate=RUSSIAN; Exclusive=No;SourceType=DBF;SourceDB="+КаталогБазы+"'
		|"; 


sp_addlinkedserver
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #3 - 10. Октября 2006 :: 09:46
Печать  
steban писал(а) 10. Октября 2006 :: 08:30:
может так?
Код
Выбрать все
	ТекстЗапроса = "
		|EXEC sp_addlinkedserver
		|	@server = '',
		|	@provider = 'MSDASQL',
		|	@srvproduct = '',
		|	@datasrc = '',
		|	@provstr = 'DRIVER=Microsoft Visual FoxPro Driver; Deleted=Yes;Null=Yes;Collate=RUSSIAN; Exclusive=No;SourceType=DBF;SourceDB="+КаталогБазы+"'
		|"; 


sp_addlinkedserver

выдает такую ошибку
Цитата:
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'MSDASQL' reported an error. 
[OLE/DB provider returned message: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию]
OLE DB error trace [OLE/DB Provider 'MSDASQL' IDBInitialize::Initialize returned 0x80004005:   ].
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #4 - 10. Октября 2006 :: 09:50
Печать  
юзаю, то, на шо дал ссылку - работает безотказно...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #5 - 10. Октября 2006 :: 09:54
Печать  
Цитата:
юзаю, то, на шо дал ссылку - работает безотказно...

но там же Fox Pro, а у меня SQL-запрос
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #6 - 10. Октября 2006 :: 09:58
Печать  
DrACe писал(а) 10. Октября 2006 :: 09:54:
Цитата:
юзаю, то, на шо дал ссылку - работает безотказно...

но там же Fox Pro, а у меня SQL-запрос

ты делаешь запрос в DBF базу из SQL, это не SQL запрос, это запрос ф формате SQL, но он должен сооветсвовать синтаксису Фокса, т.к. ты используешь его дравер...
или тебе просто привести пример как в selecte использовать ф-цию? то шо я тебе дал в ссылке ничем не отличется от convert, только это фоксовый конверт
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #7 - 10. Октября 2006 :: 10:02
Печать  
если можно - примерчик, потому что такое в QA
Код
Выбрать все
select TOP 10
CPCONVERT(1251,866,desrc)

from Trade...bik
 


выдает ошибку
Цитата:
Server: Msg 195, Level 15, State 10, Line 2
'CPCONVERT' is not a recognized function name.

кодовые страницы в запросе приведены от балды, т.к. не проходит даже парсинг запроса
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #8 - 10. Октября 2006 :: 10:47
Печать  
DrACe писал(а) 10. Октября 2006 :: 09:46:
выдает такую ошибку
Цитата:
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'MSDASQL' reported an error. 
[OLE/DB provider returned message: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию]
OLE DB error trace [OLE/DB Provider 'MSDASQL' IDBInitialize::Initialize returned 0x80004005:   ].

А какая версия драйвера?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #9 - 10. Октября 2006 :: 10:50
Печать  
только что скачал драйвер: vfpodbc.dll 6.01.8629.01
может не то?
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #10 - 10. Октября 2006 :: 10:52
Печать  
кстати: драйвер должен быть установлен на стороне SQL-сервера, или на стороне клиента?
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #11 - 10. Октября 2006 :: 11:27
Печать  
DrACe писал(а) 10. Октября 2006 :: 10:52:
кстати: драйвер должен быть установлен на стороне SQL-сервера, или на стороне клиента?

на той машине, с кторой производится конект к базе, независимо от формата СУБД
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #12 - 10. Октября 2006 :: 12:20
Печать  
УРРРРРРРРРРРАААААААААА!!!!!!!!!!!!!!!! Победил!  Подмигивание

благодаря всем участвующим и сочувствующим, а также бескрайнему Инету - ЗАРАБОТАЛО!!!

В помощь последователям:
1) скачал VFP OLE DB povider v9: http://download.microsoft.com/download/b/f/b/bfbfa4b8-7f91-4649-8dab-9a647636036...

2) создал linked server
Код
Выбрать все
EXEC  sp_addlinkedserver
	  @server = 'FOX_OLEDB',
	  @provider = 'VFPOLEDB',
	  @srvproduct = '',
	  @datasrc ='c:\base\',
	  @provstr = 'Collating Sequence=RUSSIAN' 


взято тут http://www.sql.ru/faq/faq_topic.aspx?fid=146
после создания сервера лучше зайти в EM и убедиться, что права на каталог мы получили (на второй закладке лучше использовать Be made without using a security context или Be made using the login's curent security context, а также на третьей закладке - параметры доступа)

3) собственно сам запрос:
Код
Выбрать все
select
*
from FOX_OLEDB...dbf_name 


;о)
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #13 - 11. Октября 2006 :: 05:34
Печать  
эпопея продолжается...   Озадачен
рано я радовался...

Что имею теперь:
1) linked server создал под руководством vfpoledb провайдера - все ОК
2) выполняю запрос к таблице итогов регистра остатков на точку актуальности, все элементарно:
Код
Выбрать все
SELECT
	ОстаткиТМЦ.SP408	AS НоменклатураID,
	ОстаткиТМЦ.SP418	AS СкладID,
	ОстаткиТМЦ.SP411	AS Количество

FROM Base...RG405 AS ОстаткиТМЦ

WHERE	(ОстаткиТМЦ.PERIOD={D '2006-10-01'})
	AND (ОстаткиТМЦ.SP411 <> 0) //--- ресурс Количество
	AND (ОстаткиТМЦ.SP4062 = '     1   ') //--- измерение Фирма
	AND (ОстаткиТМЦ.SP3117 = 0) //--- измерение ЦенаПрод
 


напомню индексы этой таблицы:
Код
Выбрать все
#----Indexes------
# Name     |Descr	   |Unique|Indexed fields							    |DBName    
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP4062,SP408,SP418,SP3117				    |PROP
I=VIA408   |VIA408	  |0     |PERIOD,SP408								|VIA408    
 


и этот простейший запрос на локальном сервере с результатом чуть больше 2000 строк на DBF-ке 7.2 Мб выполняется ~2,5 минуты!
В то время, как сама его считает не более 2 секунд.  Ужас
Такое чувство, что все индексы ему по-барабану!

Интересно, что самый первый мой провайдер OLE DB Provider for Jet, который не понимает русскую кодировку 1251, выдает результат за 30 секунд, что тоже много, но в 5 раз быстрее vfpoledb

что мне делать?!!
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос к dbf-кам с SQL-сервера
Ответ #14 - 11. Октября 2006 :: 07:18
Печать  
я не знаю шо у тебя за бока, может это под SQL какие то ньюансы, но из одной 1С в другую запросы у меня просто летают... обе базы в DBF-формате
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать