powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
17 сообщений из 42, страница 2 из 2
fox+ado+sql: как закинуть данные?
    #33301425
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KДавайте разберемся с терминологией:

лично я не против, просто по-скольку я самоучка, то с терминологией обращаюсь легко и просто. но уточняю: "таблиц", запись ведется в десяток таблиц.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33301436
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда я посоветовал бы вам написать на T-SQL (на сервере) хранимую процедуру. В ней обновление всех таблиц оформить, как транзакцию (BEGIN TRANSACTION.... COMMIT TRANSACTION) и вызывать ее из VFP программы с помощью SQLEXEC.
С уваженем, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33302563
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi bogik!

SQLSETPROP(хендл, "Transactions", 2)
lnRes = SQLEXEC(хендл, "INSERT ... в первую")
* Обработка ошибки
lnRes = SQLEXEC(хендл, "INSERT ... во вторую")
* Обработка ошибки
..... и т.д.
* Если всё в порядке
SQLCOMMIT(хендл)

* Если на каком-то этапе возникла ошибка и транзакцию надо откатить
SQLROLLBACK(хендл)


Вариант с ХП неудобен, если нужно будет передавать в эту ХП очень много
параметров (ну т.е. реально много полей в этих базах, и их все нужно
задавать). - тут придётся как-то мудрить с передачей всего этого массива
данных в ХП (в принципе если ты с XML умеешь обращаться что со стороны
фокса, что со стороны T-SQL то это не проблема).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33302858
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov

Igor KorolyovВариант с ХП неудобен, если нужно будет передавать в эту ХП очень много параметров (ну т.е. реально много полей в этих базах, и их все нужно задавать). - тут придётся как-то мудрить с передачей всего этого массива данных в ХП

Твой же код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQLSETPROP(хендл, "Transactions",  2 )
lnRes = SQLEXEC(хендл, "EXEC xp ... в первую")
* Обработка ошибки
lnRes = SQLEXEC(хендл, "EXEC xp ... во вторую")
* Обработка ошибки
..... и т.д.
* Если всё в порядке
SQLCOMMIT(хендл)

* Если на каком-то этапе возникла ошибка и транзакцию надо откатить
SQLROLLBACK(хендл)

Ничем не отличается, только использует ХП

Igor Korolyovв принципе если ты с XML умеешь обращаться что со стороны фокса, что со стороны T-SQL то это не проблема

Как раз здесь проблема связанная с передачей XML строки, простая передача
строки в виде SQLEXEC([INSERT INTO() VALUES()]) будет значительно меньше CURSORTOXML(), те налететь на ограничение можно запросто.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33305078
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi PaulWist!

Речь то шла про ОДНУ ХП - и как туда передать весь этот массив из данных для
10 новых записей - вот где вопрос :)
P.S. Чем лично мне не нравится ХП для элементарных операций (точнее мне до
сих пор никто не показал удовлетворительного решения проблемы).
Имеем таблицу, скажем из 10 полей. Имеем у себя на форме 10 текстбоксов, в
которых мы МОЖЕМ изменить данные этих полей (но МОЖЕМ и не менять!) Как
передать в ХП информацию, чтобы обновить эту самую запись - при этом НЕ
МЕНЯЯ тех полей, к которым в форме не прикасались.
Т.е. со стороны клиента оно понятно - либо автоматом, либо вручную
формируется команда UPDATE f1 = ?value1, f2 = ?value2 ... WHERE ... при этом
в список обновления включаются ТОЛЬКО необходимые мне поля (RV/CAD это умеет
автоматом делать, впрочем зная GETFLDSTATE() можно и "вручную" набрать эту
команду).
Обычно предлагают "по тупому" отказаться от выборочного сохранения - т.е.
если уж меняли 1 поле, то UPDATE надо делать всем 10-ти (используя для
"нетронутых" полей те значения, что попали на клиент в момент извлечения
данных с сервера).
Примерно такая-же проблема с INSERT через ХП. Либо "считают" что NULL в
параметре это признак "пусть работает Default", либо вводят второй набор
параметров (т.е. помимо СОБСТВЕННО значений ещё и флаги - а есть ли значение
или его реально нету! Хотя теоретически можно это и одним дополнительным
параметром сделать - но писанины при этом куча :( )
Также иногда советуют "сделай 2, 3, 10 ... ХП - на разные случаи". Это
конечно выход, но IMHO криво это и нехорошо :(

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33305377
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor KorolyovРечь то шла про ОДНУ ХП - и как туда передать весь этот массив из данных для 10 новых записей - вот где вопрос :)

Ну здесь два варианта

либо создавать пакет вида

Код: plaintext
1.
2.
3.
4.
StrSql = [CREATE TABLE ВременнаяТаблица]
StrSql = [INSERT INTO ВременнаяТаблица] + значения из фокса
StrSql = [EXEC ХП] &&которая знает из какой временной таблицы брать данные
IF LEN(StrSql) && проверка длины строки
SQLEXEC(StrSql)

Либо
- перевод соединения в ручной режим SQLSETPROP('Transaction',2)
- создание временной таблицы SQLEXEC([CREATE TABLE])
- заливка туда данных из фокса (хоть по одной строке) SQLEXEC(INSERT INTO)
- и наконец выполнение ХП, опять же знающей про временную таблицу SQLEXEC([EXEC ХП])

Igor KorolyovИмеем таблицу, скажем из 10 полей. Имеем у себя на форме 10 текстбоксов, в
которых мы МОЖЕМ изменить данные этих полей (но МОЖЕМ и не менять!) Как
передать в ХП информацию, чтобы обновить эту самую запись - при этом НЕ
МЕНЯЯ тех полей, к которым в форме не прикасались

Честно говоря никогда не задавался таким вопросом и наверное сама постановка неправильная, например (просто фантазирую) есть табличка с двумя с 2 полями причем на второе поле наложен Constraint, такого вида, что

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE CURSOR test (fld1 i , fld2 int CHECK fld1 >  0 )

INSERT INTO test (fld1, fld2) values( 1 , 1 )
* всё прошло отлично
UPDATE test set fld1 =  0  
* здесь получили ошибку
UPDATE test set fld1 =  0 , fld2 =  3 

я понимаю, что пример притянут за уши и на этот счет есть правило поля, НО факт остается фактом.

Как выборочно подставить поля, думаю можно ещё только через динамичесий запрос, хотя тоже не хорошо.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33309056
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
...
Имеем таблицу, скажем из 10 полей. Имеем у себя на форме 10 текстбоксов, в
которых мы МОЖЕМ изменить данные этих полей (но МОЖЕМ и не менять!) Как
передать в ХП информацию, чтобы обновить эту самую запись - при этом НЕ
МЕНЯЯ тех полей, к которым в форме не прикасались.
...
Обычно предлагают "по тупому" отказаться от выборочного сохранения - т.е.
если уж меняли 1 поле, то UPDATE надо делать всем 10-ти (используя для
"нетронутых" полей те значения, что попали на клиент в момент извлечения
данных с сервера).

А в чем собственно тут проблемма?! Вы что же будете формировать разные команды обновления на сервере при изменении разных полей на клиенте? А если этих полей в таблицы 20, а 30.. Вы динамически будете менять команду UPDATE ?. Серверу придется каждый раз перестраивать план запроса при каждой вашем UPDATE... Значительно эффективней написать одну хранимую процедуру на обновлевние ВСЕХ необходимых полей таблицы и вызывать ее при обнолвении ЛЮБОГО поля в клиенте, естественно, передавая ей ВСЕГДА все поля.
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33310432
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> А в чем собственно тут проблемма?!

Ну вот, я же говорил - всегда делают удивлённое выражение лица и говорят что
так программы не пишутся :) Я понимаю, что проще сказать "низя" и забыть...

> Вы что же будете формировать разные команды обновления на сервере при
> изменении разных полей на клиенте?

Да, а почему собственно нет?

> А если этих полей в таблицы 20, а 30

Какая разница - фокс это автоматом позволяет делать, но даже если и вручную,
то особых проблем нет... Со стороны ХП в принципе тоже это возможно - но
только туда ещё надо передавать дополнительные параметры-флаги.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33310662
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
...Какая разница - фокс это автоматом позволяет делать...
Вот это я не понял !? Это как через Pass-Through "автоматом" это выполнить ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33310928
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K Igor Korolyov
...Какая разница - фокс это автоматом позволяет делать...
Вот это я не понял !? Это как через Pass-Through "автоматом" это выполнить ?
С уважением, Алексей.
Это даже я могу объяснить

Pass-Trough - это, по сути, символьная строка, передаваемая на сервер. Т.е. ее содержимое вполне можно формировать динамически.

Используя GetFldState(-1) или цикл по FСOUNT()+OldVal() получаем список полей, которые реально были модифицированы. Используя FIELD() получаем имя нужных полей. Далее формируем символьную строку, где перечислены только собственно измененные поля. И посылаем на сервер сформированную команду.

Если я правильно понимаю, Remote View действует аналогичным образом.

А по поводу 20...30 полей... Хм... Если реально изменилось 2...3 поля какой смыл "тягать" на сервер все остальные? Просто потому, что по другому не получается?
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33310981
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Pass-Trough - это, по сути, символьная строка, передаваемая на сервер. Т.е. ее содержимое вполне можно формировать динамически.
Используя GetFldState(-1) или цикл по FСOUNT()+OldVal() получаем список полей, которые реально были модифицированы. Используя FIELD() получаем имя нужных полей. Далее формируем символьную строку, где перечислены только собственно измененные поля. И посылаем на сервер сформированную команду.

Ключевым словом в ответе Igor Korolyov было слово "Автоматически".
А формирование нужной строки для SQLEXEC через циклы VFP, согласитесь, не очень подходит под это определение. :)
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33311135
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K
Ключевым словом в ответе Igor Korolyov было слово "Автоматически".
А формирование нужной строки для SQLEXEC через циклы VFP, согласитесь, не очень подходит под это определение. :)
С уважением, Алексей.
Не хотелось бы придираться к словам, но где в посте Игоря было упоминание об автоматическом Pass-Through ? Напомню цитату

Igor KorolyovТ.е. со стороны клиента оно понятно - либо автоматом, либо вручную формируется команда UPDATE f1 = ?value1, f2 = ?value2 ... WHERE ... при этом в список обновления включаются ТОЛЬКО необходимые мне поля (RV/CAD это умеет автоматом делать, впрочем зная GETFLDSTATE() можно и "вручную" набрать эту команду).
Т.е. речь идет о том, что FoxPro в своих объектах умеет делать это автоматически. Если отказываешся от стандартных объектов и строишь строку вручную (а Pass-Through - это именно "ручное" формирование строки), то никакой автоматизации не может быть в принципе. Цикл или прямое написание уже не суть важно. Это все-равно ручное (т.е. НЕ автоматическое) написание команды.

Ну, грубо говоря, "ручное" - это самописное, а "автоматическое" - это использование стандартных объектов FoxPro.

Но все это не по существу. Это так, "придирки" к словам.

Вопрос-то он задал совсем о другом. Как в ХП на стороне сервера реализовать выборочное обновление? Т.е. не все 20...30 полей, а только те, которые реально были изменены.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33312841
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> Вот это я не понял !? Это как через Pass-Through "автоматом" это
> выполнить?

1) Я не говорил что ИМЕННО SPT+Автомат - т.е. рассматриваются также варианты
RV (в принципе не дружит с ХП), CAD (пока не пробовал плотно - но говорят
что там какая-то беда с параметрами возвращаемыми из ХП)...
2) Ну если уж КОНКРЕТНО SPT+Автомат - то без вопросов делается.
ПРИМЕРНО так (извини, ломает ночью синтаксис проверять - идея думаю и так
понятна)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQLEXEC(... "SELECT nID, cName, nOther FROM MySchema.Table1 WHERE ...", 
"csr1")
CURSORSETPROP("Tables", "MySchema.Table1")
CURSORSETPROP("KeyFieldList", "nID")
CURSORSETPROP("UpdatableFieldList", "nID, cName, nOther")
CURSORSETPROP("UpdateNameList", "nID MySchema.Table1.nID, cName 
MySchema.Table1.cName, nOther MySchema.Table1.cName")
CURSORSETPROP("WhereType",  3 )
CURSORSETPROP("SendUpdates", .T.)
После чего фокс автоматом будет конструировать INSERT/UPDATE/DELETE
команды - при выполнении TableUpdate() - причём для каждой записи свои -
если там изменилось одно поле - то UPDATE на одно поле - если была вставка и
в её процессе (или после вставки, но до сохранения) изменены лишь 2 поля -
то в Insert попадут только они - оставшиеся поля сервер заполнит
Default-ами - если они конечно есть...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33312923
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это известный метод.. Фактически, вы руками делаете, то, что делает Remote View Designer. А если нет Default на поле, то как будет выглядеть команда UPDATE, посланная на сервер?
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33316154
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> Да, это известный метод

Ну и я о том-же :)

> Фактически, вы руками делаете, то, что делает Remote View Designer

Не дизайнер, а сам RV это делает. Т.е. RV это такая "упрощающая" надстройка
над SQLEXEC()... А вот возможность формирования автоматических команд
обновления - это фишка фоксового движка - доступна и для SPT курсоров...

> А если нет Default на поле, то как будет выглядеть команда UPDATE,
> посланная на сервер?

Извини не понял... При чём тут вообще UPDATE - при изменениях записей
никакие Default-ы не срабатывают в принципе. Положим ты ошибся, и имел в
виду команду INSERT всё-же...

Тут есть 2 стороны - фоксовая и серверная.

Если НЕ используется RV, то никаких Default со стороны фокса нет и быть не
может (к сожалению эту "фишку" RV либо вообще невозможно "перенести" на SPT
курсоры, либо я просто не знаю никакого способа).
Если есть Default на стороне фокса -то они срабатывают совершенно аналогично
банальному REPLACE, выполненному сразу после вставки записи в курсор - т.е.
при создании записи сразу производится вычисление этих выражений и
помещаются соответствующие значения в поля курсора. Соответственно потом
(при TABLEUPDATE(), когда и формируются команды обновления базовых таблиц)
фокс при формировании INSERT команды учтёт эти поля как изменённые.
Если Default-а нет - и прямого редактирования поля тоже нет - то фокс просто
не включит данное поле в список полей команды INSERT. Это кстати объясняет
смысл ошибки 1547 - Cannot insert an empty row from a view into its base
table(s) - в таком сценарии фокс формирует некорректную команду типа INSERT
INTO SomeTable () Values () - т.е. с пустыми списками полей.

Если же речь идёт про сторону сервера, и про тамошние Default-ы - то вообще
не понимаю в чём затруднения - это не имеет никакой связи с тем как фокс
формирует команду INSERT - т.е. целиком на совести сервера, как он
прореагирует на INSERT INTO SomeTable (SomeFiledWithDefault) VALUES
(?uValueFromVFPCursor) - я полагаю что нормальный сервер в таком случае
вообще не должен даже пытаться вычислять выражение прописанное в Default -
но если и вычисляет, то по любому должен его потом проигнорировать и
использовать то что указано в команде INSERT... Иначе это уж совершенно
кривой и неадекватный сервер получается :(

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33316344
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, неправильно понял грамматику вашего предложения:
Igor Korolyov
если там изменилось одно поле - то UPDATE на одно поле - если была вставка и
в её процессе (или после вставки, но до сохранения) изменены лишь 2 поля -
то в Insert попадут только они - оставшиеся поля сервер заполнит
Default-ами - если они конечно есть...

В любом случае, мне не нравится, что за меня VFP решает, какое поле обновить, а какое нет. Опять же, постоянное изменение команды UPDATE не позволяет серверу использовать кэширование запроса. Другими словами, я использую хранимые процедуры для обновления данных с передачей ей при вставке и обновления ВСЕХ столбцов. Ничего тяжелого в этом нет. Хранимая процедура вызывается из метода формы и метод вызова ее описывается один раз, зато это позволяет серверу строить более эффективный план запроса (особенно при UPDATE). А вставка на серверной стороне, как правило, требует оформление в виде явной транзакции (explicit transaction) и использовать для этого простую команду INSERT , посылаемую с клиента не имеет смысла.
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33318611
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Aleksey!

> В любом случае, мне не нравится, что за меня VFP решает, какое поле
> обновить, а какое нет.

Хм, он ничего не решает - он по тупому "исполняет" что ты накодировал или
наводил! Если ты "трогал" поля - они пойдут на сервер - если нет, то и
вопросов нет :)

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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