Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос специалистам по ADODB / 15 сообщений из 15, страница 1 из 1
22.06.2004, 16:56
    #32572210
Раз (1)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Взялся изучать взаимодействие VFP с MS SQL-Server через ADO...

Для пробы пытаюсь получить список таблиц из базы на SQL-Server.

Код вот такой:

Код: 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.
LOCAL loConn AS "ADODB.Connection"
LOCAL lcConnString AS String
LOCAL loCommand AS "ADODB.Command"
LOCAL loRS AS "ADODB.Recordset"

loConn = CREATEOBJECT ("ADODB.Connection")
loCommand = CREATEOBJECT ("ADODB.Command")
loRS = CREATEOBJECT ("ADODB.Recordset")

lcConnString = [Provider=SQLOLEDB. 1 ;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=BBB;Data Source=DDD;] 

loConn.Mode =  1 	&& adModeRead
loConn.Open(lcConnString)

loCommand.ActiveConnection = loConn
loCommand.CommandType =  1  && adCmdText
loCommand.CommandText = "EXEC sp_tables"
loRS.Source = loCommand
loRS.CursorType =  3 	&& adOpenStatic
loRS = loCommand.Execute

? loRS.RecordCount

loConn.Close

RELEASE ALL

Так вот этот самый ? loRS.RecordCount упорно показывает -1, что бы я с ним ни делал. Хотя EXEC sp_tables , выполненный на сервере при открытой базе BBB возвращает все записи как положено...

Есть какие-нибудь мысли, как заставить фокса принять эти данные именно через OLEDB?
...
Рейтинг: 0 / 0
22.06.2004, 18:24
    #32572520
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
loRS.CursorLocation = 3
...
Рейтинг: 0 / 0
22.06.2004, 19:14
    #32572604
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Раз (1)Так вот этот самый ? loRS.RecordCount упорно показывает -1, что бы я с ним ни делал. Хотя EXEC sp_tables , выполненный на сервере при открытой базе BBB возвращает все записи как положено...

Есть какие-нибудь мысли, как заставить фокса принять эти данные именно через OLEDB?

RecordCount не самое удачное свойство для проверки того, что рекордсет нормально открылся и содержит данные, т.к. в зависимости от провайдера данных, типа курсора и "положения звезд" - может показывать все что угодно до того, пока рекордсету не скажут явно исполнить MoveLast , при большом объеме выборки - такие "скачки" не особо хорошо влияют на производительность...

К тому же RecordCount = -1 это вовсе не аналог фоксового результата SQLEXEC(...) = -1 , означающего ошибку при выполнении SQL-вызова на сервере...

Для проверки того, что рекордсет действительно открылся - используй свойство State = 1 && adStateOpen, для проверки того, что рекордсет не пустой и содержит данные - loRS.EOF = loRS.BOF && if both is .T. then recordset is empty.

З.Ы. ну и команда loRS.Source = loCommand - здесь явно "лишняя", т.к. рекордсет и так создается, открывается и заполняется данными через loRS = loCommand.Execute, т.е. если после исполнения данной команды коллекция loConn.Errors пустая - то можно считать, что данные у вас уже в фоксе... :-))

З.З.Ы. посмотреть содержимое одного столбца вашей выборки можете таким циклом:
Код: plaintext
1.
2.
3.
4.
do while !loRS.EOF
?loRS.Fields( 2 ).Value && table name
loRS.MoveNext
enddo
...
Рейтинг: 0 / 0
23.06.2004, 07:57
    #32572901
Раз (1)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
CriploRS.CursorLocation = 3
На RecordCount свойство CursorLocation никак не повлияло, все равно -1.

Но данные в рекордсете действительно оказались, спасибо qu-qu за разъяснения : )
...
Рейтинг: 0 / 0
23.06.2004, 08:11
    #32572904
Pavel_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
В VFP8 через АDO удобнее работать с курсорадаптером

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Cur_ch = CREATEOBJECT('CursorAdapter')
WITH sotlCur_ch
   .ALIAS          = 'SP_tables'
   .DATASOURCETYPE = 'ADO'
   .FetchSize =  10  
   .CURSORFILL(.F., .F.,  0 , loRS)
ENDWITH

Идалее можно работать с курсором (ALIAS)
Код: plaintext
1.
 select  'SP_tables'
browse
...
Рейтинг: 0 / 0
23.06.2004, 08:15
    #32572905
Pavel_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Ошибка
Код: plaintext
WITH Cur_ch
...
Рейтинг: 0 / 0
23.06.2004, 19:46
    #32574603
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Подскажите вот чего - если я буду работать таким образом не с сервером БД, а с данными лежащими в сети, т.е. конектимся к контейнеру БД с таблицами лежащим на сетевом расшаренном диске - сократить ли это все ненужный трафик в сети или все таки по прежнему будут гоняться даные из открываемых таблиц, а только потом браться выборки ?
...
Рейтинг: 0 / 0
23.06.2004, 21:36
    #32574680
karly™
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Во-первых, работать со родным форматом напрямую, без посредников типа ODBC и ADO всегда лучше.

Во-вторых, при правильно организованных индексах по сети будет переданы только результаты выборки ,
плюс чуть-чуть служебной информации.
...
Рейтинг: 0 / 0
23.06.2004, 23:05
    #32574717
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
karly™Во-первых, работать со родным форматом напрямую, без посредников типа ODBC и ADO всегда лучше.

Во-вторых, при правильно организованных индексах по сети будет переданы только результаты выборки ,
плюс чуть-чуть служебной информации.

При работе в сети вместе с формой открываются все таблицы, которые участвуют в выборках. При этом все данные из таблицы тянутся на клиента по сети и лишь после этого производятся выборки.

Вот собственно и вопрос - если пользовать связку OLE DB + CursorAdapter уменьшим ли трафик по сети или нет.
...
Рейтинг: 0 / 0
23.06.2004, 23:28
    #32574729
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Vladimir M Sklyar При работе в сети вместе с формой открываются все таблицы, которые участвуют в выборках. При этом все данные из таблицы тянутся на клиента по сети и лишь после этого производятся выборки.

А вот и нет - сколько тянуть - задается паратметрами окружения по умолчанию - 100 первых записей.

karly™ Во-первых, работать со родным форматом напрямую, без посредников типа ODBC и ADO всегда лучше.

Теоретически да, но на практике быстрее через OLE DB - парадокс, объяснение которому видел одно - не тенет за собой Rushmor (но правду знает только Большой Брат).

Vladimir M SklyarПодскажите вот чего - если я буду работать таким образом не с сервером БД, а с данными лежащими в сети...

Я давно уже применяю Web Services вместо прямого обращения к данным - все преимущества Client-Server технологии + дешевизна в эксплуатации и надежность... да и трафик минимальный...

karly™Во-вторых, при правильно организованных индексах по сети будет переданы только результаты выборки,
плюс чуть-чуть служебной информации.

Здесь я с Вами согласен, вот только этой служебной информации порой получается много :)))
...
Рейтинг: 0 / 0
24.06.2004, 09:09
    #32574883
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Sergey ChЯ давно уже применяю Web Services вместо прямого обращения к данным - все преимущества Client-Server технологии + дешевизна в эксплуатации и надежность... да и трафик минимальный...

А вот с этого места поподробнее пожалуйста. Каким образом организовано ядро - т.е. сервер ?
...
Рейтинг: 0 / 0
24.06.2004, 11:24
    #32575139
karly™
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Vladimir M Sklyar

При работе в сети вместе с формой открываются все таблицы, которые участвуют в выборках. При этом все данные из таблицы тянутся на клиента по сети и лишь после этого производятся выборки.

Это глубокое заблуждение . Фокс умеет передавать на рабочую станцию только ту часть файла dbf, которая участвует в результирующей выборке.

Попробуйте создать тестовый файл размером в несколько сотен мегабайт. Заполните его случайными данными. Функция Rand() будет очень кстати :) Затем сделайте индекс, например по полю RecID . И выполните запрос
Код: plaintext
Select * from TestDB Where RecID Between X And Y 
И сравните время выполнения запроса с временем копирования всего файла на рабочую станцию.

Если после этого появятся мысли/вопросы - высказываете/задавайте :)
...
Рейтинг: 0 / 0
25.06.2004, 11:18
    #32576938
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
To: Vladimir M Sklyar

Рассказывать долго. Где-то тут мы уже обсуждали эту тему.
В двух словах примерно так:

- создаете Web Service который принимает SQL команды с удаленный рабочих станций, исполняет запрос, конвертирует в XML и посылает ответ на удаленную рабочую станцию...
- клиент посылает SQL команды, далее принимает ответ в виде XML, преобразует в Cursor...
- если надо обновить или добавить данные то все на оборот...

Все работает почти как обычный SQL Server (правда все надо организовывать самому). В одном из проектов у меня так работала сеть магазинов через Интернет и модемы 28k...

Можно усилить и безопасность (для некторых клиеинтов я все шифрую)...

Good luck!
...
Рейтинг: 0 / 0
25.06.2004, 12:33
    #32577199
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Sergey ChTo: Vladimir M Sklyar

Все работает почти как обычный SQL Server (правда все надо организовывать самому).

Это все понятно, но пишеться на чем
- фокс (сервер DCOM, COM+) или нечто другое ?
- что в качестве БД (.dbc/.dbf, промышленный сервер БД)?
...
Рейтинг: 0 / 0
25.06.2004, 14:26
    #32577555
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос специалистам по ADODB
Vladimir M Sklyar

Это все понятно, но пишеться на чем
- фокс (сервер DCOM, COM+) или нечто другое ?
- что в качестве БД (.dbc/.dbf, промышленный сервер БД)?

1. Самый простой вариант - создаем COM (пишем на VFP как всегда, только назавём это DEFINE CLASS yourweb AS SESSION OLEPUBLIC) Далее делаем Web Service на основе пакета SOAP 3.0 (берите с сервера MS) - в VFP 8.0 есть даже мастер, который все делает включая регистрацию. Далее если нужен доступ из любой точки земного шара - указываем выбранный Web Server.

2. Тут как душа ляжет. У меня есть и dbf, dbc и MS SQL (но последнюю можно использовать и без FoxPro :)

Мой совет - почитайте про Web Services - там все описано...

Good luck!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос специалистам по ADODB / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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