|
|
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Aleksey-KДавайте разберемся с терминологией: лично я не против, просто по-скольку я самоучка, то с терминологией обращаюсь легко и просто. но уточняю: "таблиц", запись ведется в десяток таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 14:28:47 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Тогда я посоветовал бы вам написать на T-SQL (на сервере) хранимую процедуру. В ней обновление всех таблиц оформить, как транзакцию (BEGIN TRANSACTION.... COMMIT TRANSACTION) и вызывать ее из VFP программы с помощью SQLEXEC. С уваженем, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 14:34:57 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Hi bogik! SQLSETPROP(хендл, "Transactions", 2) lnRes = SQLEXEC(хендл, "INSERT ... в первую") * Обработка ошибки lnRes = SQLEXEC(хендл, "INSERT ... во вторую") * Обработка ошибки ..... и т.д. * Если всё в порядке SQLCOMMIT(хендл) * Если на каком-то этапе возникла ошибка и транзакцию надо откатить SQLROLLBACK(хендл) Вариант с ХП неудобен, если нужно будет передавать в эту ХП очень много параметров (ну т.е. реально много полей в этих базах, и их все нужно задавать). - тут придётся как-то мудрить с передачей всего этого массива данных в ХП (в принципе если ты с XML умеешь обращаться что со стороны фокса, что со стороны T-SQL то это не проблема). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 01:47:45 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Igor KorolyovВариант с ХП неудобен, если нужно будет передавать в эту ХП очень много параметров (ну т.е. реально много полей в этих базах, и их все нужно задавать). - тут придётся как-то мудрить с передачей всего этого массива данных в ХП Твой же код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Ничем не отличается, только использует ХП Igor Korolyovв принципе если ты с XML умеешь обращаться что со стороны фокса, что со стороны T-SQL то это не проблема Как раз здесь проблема связанная с передачей XML строки, простая передача строки в виде SQLEXEC([INSERT INTO() VALUES()]) будет значительно меньше CURSORTOXML(), те налететь на ограничение можно запросто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 09:54:00 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2005, 04:46:10 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovРечь то шла про ОДНУ ХП - и как туда передать весь этот массив из данных для 10 новых записей - вот где вопрос :) Ну здесь два варианта либо создавать пакет вида Код: plaintext 1. 2. 3. 4. Либо - перевод соединения в ручной режим SQLSETPROP('Transaction',2) - создание временной таблицы SQLEXEC([CREATE TABLE]) - заливка туда данных из фокса (хоть по одной строке) SQLEXEC(INSERT INTO) - и наконец выполнение ХП, опять же знающей про временную таблицу SQLEXEC([EXEC ХП]) Igor KorolyovИмеем таблицу, скажем из 10 полей. Имеем у себя на форме 10 текстбоксов, в которых мы МОЖЕМ изменить данные этих полей (но МОЖЕМ и не менять!) Как передать в ХП информацию, чтобы обновить эту самую запись - при этом НЕ МЕНЯЯ тех полей, к которым в форме не прикасались Честно говоря никогда не задавался таким вопросом и наверное сама постановка неправильная, например (просто фантазирую) есть табличка с двумя с 2 полями причем на второе поле наложен Constraint, такого вида, что Код: plaintext 1. 2. 3. 4. 5. 6. я понимаю, что пример притянут за уши и на этот счет есть правило поля, НО факт остается фактом. Как выборочно подставить поля, думаю можно ещё только через динамичесий запрос, хотя тоже не хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2005, 10:08:02 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov ... Имеем таблицу, скажем из 10 полей. Имеем у себя на форме 10 текстбоксов, в которых мы МОЖЕМ изменить данные этих полей (но МОЖЕМ и не менять!) Как передать в ХП информацию, чтобы обновить эту самую запись - при этом НЕ МЕНЯЯ тех полей, к которым в форме не прикасались. ... Обычно предлагают "по тупому" отказаться от выборочного сохранения - т.е. если уж меняли 1 поле, то UPDATE надо делать всем 10-ти (используя для "нетронутых" полей те значения, что попали на клиент в момент извлечения данных с сервера). А в чем собственно тут проблемма?! Вы что же будете формировать разные команды обновления на сервере при изменении разных полей на клиенте? А если этих полей в таблицы 20, а 30.. Вы динамически будете менять команду UPDATE ?. Серверу придется каждый раз перестраивать план запроса при каждой вашем UPDATE... Значительно эффективней написать одну хранимую процедуру на обновлевние ВСЕХ необходимых полей таблицы и вызывать ее при обнолвении ЛЮБОГО поля в клиенте, естественно, передавая ей ВСЕГДА все поля. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 14:09:48 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey! > А в чем собственно тут проблемма?! Ну вот, я же говорил - всегда делают удивлённое выражение лица и говорят что так программы не пишутся :) Я понимаю, что проще сказать "низя" и забыть... > Вы что же будете формировать разные команды обновления на сервере при > изменении разных полей на клиенте? Да, а почему собственно нет? > А если этих полей в таблицы 20, а 30 Какая разница - фокс это автоматом позволяет делать, но даже если и вручную, то особых проблем нет... Со стороны ХП в принципе тоже это возможно - но только туда ещё надо передавать дополнительные параметры-флаги. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 01:45:26 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov ...Какая разница - фокс это автоматом позволяет делать... Вот это я не понял !? Это как через Pass-Through "автоматом" это выполнить ? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 09:26:34 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Aleksey-K Igor Korolyov ...Какая разница - фокс это автоматом позволяет делать... Вот это я не понял !? Это как через Pass-Through "автоматом" это выполнить ? С уважением, Алексей. Это даже я могу объяснить Pass-Trough - это, по сути, символьная строка, передаваемая на сервер. Т.е. ее содержимое вполне можно формировать динамически. Используя GetFldState(-1) или цикл по FСOUNT()+OldVal() получаем список полей, которые реально были модифицированы. Используя FIELD() получаем имя нужных полей. Далее формируем символьную строку, где перечислены только собственно измененные поля. И посылаем на сервер сформированную команду. Если я правильно понимаю, Remote View действует аналогичным образом. А по поводу 20...30 полей... Хм... Если реально изменилось 2...3 поля какой смыл "тягать" на сервер все остальные? Просто потому, что по другому не получается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 11:01:10 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Pass-Trough - это, по сути, символьная строка, передаваемая на сервер. Т.е. ее содержимое вполне можно формировать динамически. Используя GetFldState(-1) или цикл по FСOUNT()+OldVal() получаем список полей, которые реально были модифицированы. Используя FIELD() получаем имя нужных полей. Далее формируем символьную строку, где перечислены только собственно измененные поля. И посылаем на сервер сформированную команду. Ключевым словом в ответе Igor Korolyov было слово "Автоматически". А формирование нужной строки для SQLEXEC через циклы VFP, согласитесь, не очень подходит под это определение. :) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 11:13:06 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
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 полей, а только те, которые реально были изменены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 11:43:41 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey! > Вот это я не понял !? Это как через Pass-Through "автоматом" это > выполнить? 1) Я не говорил что ИМЕННО SPT+Автомат - т.е. рассматриваются также варианты RV (в принципе не дружит с ХП), CAD (пока не пробовал плотно - но говорят что там какая-то беда с параметрами возвращаемыми из ХП)... 2) Ну если уж КОНКРЕТНО SPT+Автомат - то без вопросов делается. ПРИМЕРНО так (извини, ломает ночью синтаксис проверять - идея думаю и так понятна) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. команды - при выполнении TableUpdate() - причём для каждой записи свои - если там изменилось одно поле - то UPDATE на одно поле - если была вставка и в её процессе (или после вставки, но до сохранения) изменены лишь 2 поля - то в Insert попадут только они - оставшиеся поля сервер заполнит Default-ами - если они конечно есть... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2005, 04:33:50 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Да, это известный метод.. Фактически, вы руками делаете, то, что делает Remote View Designer. А если нет Default на поле, то как будет выглядеть команда UPDATE, посланная на сервер? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2005, 11:08:57 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 01:08:53 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Извините, неправильно понял грамматику вашего предложения: Igor Korolyov если там изменилось одно поле - то UPDATE на одно поле - если была вставка и в её процессе (или после вставки, но до сохранения) изменены лишь 2 поля - то в Insert попадут только они - оставшиеся поля сервер заполнит Default-ами - если они конечно есть... В любом случае, мне не нравится, что за меня VFP решает, какое поле обновить, а какое нет. Опять же, постоянное изменение команды UPDATE не позволяет серверу использовать кэширование запроса. Другими словами, я использую хранимые процедуры для обновления данных с передачей ей при вставке и обновления ВСЕХ столбцов. Ничего тяжелого в этом нет. Хранимая процедура вызывается из метода формы и метод вызова ее описывается один раз, зато это позволяет серверу строить более эффективный план запроса (особенно при UPDATE). А вставка на серверной стороне, как правило, требует оформление в виде явной транзакции (explicit transaction) и использовать для этого простую команду INSERT , посылаемую с клиента не имеет смысла. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 09:01:51 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Hi Aleksey! > В любом случае, мне не нравится, что за меня VFP решает, какое поле > обновить, а какое нет. Хм, он ничего не решает - он по тупому "исполняет" что ты накодировал или наводил! Если ты "трогал" поля - они пойдут на сервер - если нет, то и вопросов нет :) Про оптимизацию я не спорю, равно как и про то что вполне можно смирится и с ограничениями твоей модели - я же не говорил что это нехорошо и неправильно - просто это влечёт за собой какие-то ограничения или особенности - которые нужно учитывать... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2005, 00:06:41 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1593301]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 359ms |

| 0 / 0 |
