powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перевод кода на MS SQL Server
25 сообщений из 53, страница 2 из 3
Перевод кода на MS SQL Server
    #34178247
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Valentin_timaПо первому вопросу, данный курсор создается в коде из XML строки во входном параметре и далее используется, как видите, в запросе к источнику данных. Дело в том, что если послать на прямую этот запрос на сервер, то естественно сервер его не переварит, потому что просто не поймет. Как можно обйти подобные места в коде, а их как раз очень много?
1. перед запросом создать временную таблицу на сервере, заполнить и указать ее в запросе
2. перечислить список вместо подзапроса
Код: plaintext
select ... idexp in ( 1 , 2 , 3 , 4 , 5 ,...)
Что быстрее работает надо пробовать. Зависит от размеров таблиц. И во втором варианте могут быть проблемы если запрос окажется очень длинный. В VFP6 ограничение около 4000 знаков.
По первому пункту я понял, т.е. предполагется сначала создать ХП по формированию нужного курсора, а затем ее выполнить, а в фоксе в команде запроса указать имя таблицы. А вот второй пункт не совсем понял, что имеется в виду? Что это за список, если можно подробнее..
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178558
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_tima1. перед запросом создать временную таблицу на сервере, заполнить и указать ее в запросе
2. перечислить список вместо подзапроса
Код: plaintext
select ... idexp in ( 1 , 2 , 3 , 4 , 5 ,...)
Что быстрее работает надо пробовать. Зависит от размеров таблиц. И во втором варианте могут быть проблемы если запрос окажется очень длинный. В VFP6 ограничение около 4000 знаков.
По первому пункту я понял, т.е. предполагется сначала создать ХП по формированию нужного курсора, а затем ее выполнить, а в фоксе в команде запроса указать имя таблицы. А вот второй пункт не совсем понял, что имеется в виду? Что это за список, если можно подробнее..[/quot]
Например тебе пришло на вход:
TempTableId324364755и запрос
Код: plaintext
select * from BigTable where nSomeId in (select Id from TempTable)
сейчас ты сохраняешь TempTable в курсор и выполняешь запрос

по п.1 надо
Код: plaintext
1.
2.
3.
4.
5.
sqlexec(nHandle, "create table #temp (Id i)")
sqlexec(nHandle, "INSERT INTO #temp (id) VALUES (3) ")
sqlexec(nHandle, "INSERT INTO #temp (id) VALUES (24) ")
...
sqlexec(nHandle, "select * from BigTable where nSomeId in (select Id from #Temp)", "MyRes")
sqlexec(nHandle, "DROP table #Temp")
по п.2
Код: plaintext
sqlexec(nHandle, "select * from BigTable where nSomeId in (3,24,36,47,55)", "MyRes")
затем полученный курсор "MyRes" - возращаешь клиенту.
чем больше TempTable, тем длинее строка запроса получится.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178601
Igor86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_timaПоясню:
Вот например мне не понятно, как бороться с таким кодом -

SELECT IdExp ;
FROM KsPrd ;
WHERE Period IN ( lcTagPeriod, tcPeriod) ;
AND idexp IN (SELECT Id FROM CurTO) AND EMPTY(ddelete);
INTO CURSOR IdExpCursor

строка AND idexp IN (SELECT Id FROM CurTO) предполагает, что есть некий курсор CurTO, как это объяснить SQL Server'у?

А получить в результате надо одну строку или несколько ???
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor86 Valentin_timaПоясню:
Вот например мне не понятно, как бороться с таким кодом -

SELECT IdExp ;
FROM KsPrd ;
WHERE Period IN ( lcTagPeriod, tcPeriod) ;
AND idexp IN (SELECT Id FROM CurTO) AND EMPTY(ddelete);
INTO CURSOR IdExpCursor

строка AND idexp IN (SELECT Id FROM CurTO) предполагает, что есть некий курсор CurTO, как это объяснить SQL Server'у?

А получить в результате надо одну строку или несколько ???
CurTO - это TempTable в моем примере
Код: plaintext
1.
2.
3.
4.
5.
6.
sqlexec(nHandle, "create table #temp (Id i)")
sele CurTO
scan
sqlexec(nHandle, "INSERT INTO #temp (id) VALUES (" + alltrim(str(CurTO.Id)) + ") ")
endscan
...
Понятно?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178628
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Valentin_tima1. перед запросом создать временную таблицу на сервере, заполнить и указать ее в запросе
2. перечислить список вместо подзапроса
Код: plaintext
select ... idexp in ( 1 , 2 , 3 , 4 , 5 ,...)
Что быстрее работает надо пробовать. Зависит от размеров таблиц. И во втором варианте могут быть проблемы если запрос окажется очень длинный. В VFP6 ограничение около 4000 знаков.
По первому пункту я понял, т.е. предполагется сначала создать ХП по формированию нужного курсора, а затем ее выполнить, а в фоксе в команде запроса указать имя таблицы. А вот второй пункт не совсем понял, что имеется в виду? Что это за список, если можно подробнее..
Например тебе пришло на вход:
TempTableId324364755и запрос
Код: plaintext
select * from BigTable where nSomeId in (select Id from TempTable)
сейчас ты сохраняешь TempTable в курсор и выполняешь запрос

по п.1 надо
Код: plaintext
1.
2.
3.
4.
5.
sqlexec(nHandle, "create table #temp (Id i)")
sqlexec(nHandle, "INSERT INTO #temp (id) VALUES (3) ")
sqlexec(nHandle, "INSERT INTO #temp (id) VALUES (24) ")
...
sqlexec(nHandle, "select * from BigTable where nSomeId in (select Id from #Temp)", "MyRes")
sqlexec(nHandle, "DROP table #Temp")
по п.2
Код: plaintext
sqlexec(nHandle, "select * from BigTable where nSomeId in (3,24,36,47,55)", "MyRes")
затем полученный курсор "MyRes" - возращаешь клиенту.
чем больше TempTable, тем длинее строка запроса получится.[/quot]

Спасибо ... В общем то это реальный выход, по аналогии можно и с дугим кодом бооться.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178661
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_tima Вы очень правильно поняли мою проблему, сразу видно, что Вы имеете в этом вопросе опыт.
Да, действительно приложение создавалось под идеалогию клиент-сервер.
Вопрос: Каким способом Вы подключаетесь в серверу, и какие средства используете при работе с сервером через фокс (RV, ADO, CA, SPT) ?

Работаю с сервером SQL через SPT (закачиваю, что надо на "компонент" и затем передаю на клиента)...

Насчет временных таблиц (курсоров) - в 95% случаев можно без них обойтись, так как синтаксис у MS SQL Server намного шире, чем синтаксис FoxPro. Я бы на Вашем месте переписал бы все на Хранимые процедуры серевра, а Ваш "компонент" бы просто передавал данные между приложением и сервером через параметры...

К меня много работет таких приложений, только вместо "компонента" использую Web Service (так как по требованию заказчиков приложения должны работать через Интерент)...

Good luck!
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178689
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch Valentin_tima Вы очень правильно поняли мою проблему, сразу видно, что Вы имеете в этом вопросе опыт.
Да, действительно приложение создавалось под идеалогию клиент-сервер.
Вопрос: Каким способом Вы подключаетесь в серверу, и какие средства используете при работе с сервером через фокс (RV, ADO, CA, SPT) ?

Работаю с сервером SQL через SPT (закачиваю, что надо на "компонент" и затем передаю на клиента)...

Насчет временных таблиц (курсоров) - в 95% случаев можно без них обойтись, так как синтаксис у MS SQL Server намного шире, чем синтаксис FoxPro. Я бы на Вашем месте переписал бы все на Хранимые процедуры серевра, а Ваш "компонент" бы просто передавал данные между приложением и сервером через параметры...

К меня много работет таких приложений, только вместо "компонента" использую Web Service (так как по требованию заказчиков приложения должны работать через Интерент)...

Good luck!

Т.е. как я понял, перенести методы компоненты на сервер, выполнив разумеется их адаптацию? В общем это конечно выход, тем более что Вы на практике используете такой метод. Значит от прямых запросов на сервер из кода следует лучше всего избавиться, я правильно понял?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34178812
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_tima Т.е. как я понял, перенести методы компоненты на сервер, выполнив разумеется их адаптацию? В общем это конечно выход, тем более что Вы на практике используете такой метод. Значит от прямых запросов на сервер из кода следует лучше всего избавиться, я правильно понял?
Да, я не делаю прямых запросов на сервер - передаю параметрами и возвращаю курсоры с необходимыми данными... С обнолением и вставкой данных немного сложнее, но если данных немного, то можно через параметры. В FoxPro это сделать проще, так как курсор можно легко преобразовать в XML текст и передать как параметр, потом в Вашем "компоненте" снова получить курсор и уже его "залить" в таблицу dbf... C MS SQL Server такой "фокус" я не пробовал, так как 2000 работал отвартительно плохо с XML, после чего я стал делать все через параметры к Хранимым процедурам...

P.S. Но новые приложения я разрабатываю уже для работы непосредственно с SQL Server из самого приложения, так как этот серавер прекрасно работает по TCP/IP (то есть через Интернет, а использование Web Services замеляет процесс обмена данных официально на 30% , а по моей правтике в 2-3 раза). Таким образом с SQL Server проблемы обновления нет - для простых вариантов использую курсор-адаптер, для более ответсвенных - вызов хранимых процедур с параметрами...
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179370
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за помощь! Но думаю, что будет еще масса вопросов
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179466
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотелось бы узнать насчет соединения с сервером, какая технология предпочтительнее, для каждого обращения отдельное соединение или одно глобальное соединение для всего сеанса работы?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179509
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_timaХотелось бы узнать насчет соединения с сервером, какая технология предпочтительнее, для каждого обращения отдельное соединение или одно глобальное соединение для всего сеанса работы?
Думаю для одного клиента - одно соединение, т.е. для сеанса. На установку соединения время тоже тратится.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179594
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем я с Вами согласен. Логичное представление.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179654
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня волнует вопрос переноса данных на сервер, думаю что не только меня. Вот хотелось бы услышать, какими способаи это лучше делать? Я пробовал пользоваться фоксовским мастером и выявил такие проблемы:
- В SQL Server'е отсутствуют некоторые типы данных имеющихся в фоксе и наоброт.
- Мемо поля вообще не переносятся, в перенесенной таблице название поля есть а самих данных нет.
- При переносе полей типа (С), на сервере они отображаются не верной кодовой страницей.
- Некоторые таблицы мастер вообще отказывается переносить по непонятным мне причинам.
У кого есть опыт - поделитесь..
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179969
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще такой вопрос:
- Как подключить СОМ+ компоненту к серверу?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34179993
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько таблиц? Если меньше 100, то делал все вручную...

Для большего количества есть утилиты, правда хороших бесплатных не видел - можете написать свою, это делается очень просто...

Соединение я использую ODBC для MS SQL Server 2005 (Native client)...

Если будете использовать Ваш "компонент" то соединение вначале сессии, закрытие в конце... Надеюсь, что DLL скомпилирована как multithreaded...
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180014
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey ChСколько таблиц? Если меньше 100, то делал все вручную...

Для большего количества есть утилиты, правда хороших бесплатных не видел - можете написать свою, это делается очень просто...

Соединение я использую ODBC для MS SQL Server 2005 (Native client)...

Если будете использовать Ваш "компонент" то соединение вначале сессии, закрытие в конце... Надеюсь, что DLL скомпилирована как multithreaded...

Что значит соединение в начале сессии, не совсем понял, и еще что означает multithreaded, single-threaded?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180024
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще какой принцип написания своей утлилиты, через RV или еще както по другому?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180144
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_timaИ еще какой принцип написания своей утлилиты, через RV или еще както по другому?
Я бы самому поиграться с этим посоветовал. Заодно все способы взаимодействия с SQL сервером поизучаешь.
Я бы sqlexec() попользовал.
Если база большая, то почитай про команду bulk insert у MS SQL, иначе все очень медленно будет любым способом.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180177
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Valentin_timaИ еще какой принцип написания своей утлилиты, через RV или еще както по другому?
Я бы самому поиграться с этим посоветовал. Заодно все способы взаимодействия с SQL сервером поизучаешь.
Я бы sqlexec() попользовал.
Если база большая, то почитай про команду bulk insert у MS SQL, иначе все очень медленно будет любым способом.
А почему не CursorAdapter?
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180299
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА почему не CursorAdapter?

изв. за флуд

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

идеи КС в массы!
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180315
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишу "большую красную кнопку"
для VFP9-CAD-ODBC

если чего-то получится, покажу
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180327
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_timaА почему не CursorAdapter?
Потому что VFP6, я на 9 еще не перебрался.
CursorAdapter соответственно сам не юзал и ничего про него не скажу.

Я бы решал задачу переброса так:
на вход имя таблицы
1. Разбираем структуру и создаем аналогичную таблицу в SQL сервере (в приаттаченном файлике пример разбора DBC контейнера)
2. Генерим файл с содержимым таблицы
3. sqlexec("bulk insert ...")
4. создаем индексы на SQL
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180484
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100 авторА почему не CursorAdapter?

изв. за флуд

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

идеи КС в массы!
Господи.. alex11100, да не надоело вам всех крестить этим CA ?!
Ну вы то должны понимать, что CD это просто красивая обретка над не любымым вами "екзеком " (кстати, не понял, причем тут "временные таблицы"). Ничего больше, что может SPT, CA не может.
Что-то типа ADO, но не над OLE DB, а над SQLEXEC.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180496
Valentin_tima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K alex11100 авторА почему не CursorAdapter?

изв. за флуд

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

идеи КС в массы!
Господи.. alex11100, да не надоело вам всех крестить этим CA ?!
Ну вы то должны понимать, что CD это просто красивая обретка над не любымым вами "екзеком " (кстати, не понял, причем тут "временные таблицы"). Ничего больше, что может SPT, CA не может.
Что-то типа ADO, но не над OLE DB, а над SQLEXEC.
С уважением, Алексей.

В общем то Вы правы, кроме того, что SQLEXEC возвращает не изменяемый сурсор, а СА буферизированный изменяемый.
...
Рейтинг: 0 / 0
Перевод кода на MS SQL Server
    #34180627
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin_timaВ общем то Вы правы, кроме того, что SQLEXEC возвращает не изменяемый сурсор, а СА буферизированный изменяемый.
1) SQLExec() возвращает изменяемый и буферизированный курсор. Его вполне можно редактировать, при этом не забывая, что он буферрезирован. Отменить буферизацию такого курсора невозможно в принципе. Как и в CursorAdapter

2) При желании, используя ряд настроек CursorSetProp(), полученный через SQLExec() курсор можно сделать обновляемым. Т.е. самому написать класс CursorAdapter.

Как уже сказал Aleksey-K CursorAdapter - это просто некий класс-надстройка над SQLExec(). Все основные функции в SQLExec() уже заложены. CursorAdapter - это просто удобный интерфейс.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перевод кода на MS SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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