|
|
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Господа, подскажите: есть прога работает на файл-сервере, требуется перевести ее на хранение под sql, запросы типа select работают честь по чести, а вот положить туда данные не получается.... пробовал через ODBC но там ограничение по длине строки 256 символов, а у меня база только 101 поле... через ADO ограничения по длине строки нет, но передать переменные у меня не получается... максимум одну переменную. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2005, 11:38:49 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Понятие "пробовал через ODBC" очень растяжимое и сильно завиит от пробуещего. Как ты это пробовал? Ты уверен в праввильности "пробования"?Каким образом количество полей связано ограничеинем на количество символов в поле? Как ты вообще это делаешь? Кусок кода хоть показал бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2005, 13:38:34 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Почитай чем отличаются символьные константы от символьных переменных памяти http://www.sql.ru/forum/actualthread.aspx?tid=209472#1821377 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2005, 15:02:29 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет, но чем они отличаются я уже знаю (сам допер), тут дело в другом, при передаче символьной переменной через ODBC, фокс ее понимает нормально, а вот при конвертации в ODBC переменная обрезается, и в SQL подается только строка из 256 символов, мне пришлось разбить всю строку на 1 insert и кучу update'ов, таким образом конечно все работает, но при сбое все летит к чертям, я принял решение работать через ADO, но не знаю как правильно постоить синтаксис insert'а чтобы передавать переменные , а не их значения в явном виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2005, 16:01:21 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
И все-таки - если можно - приведите пример ... Потому как работаю через ODBC и с ограничениями не сталкивался (MS SQL 7.0). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 02:22:42 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
НЕТ в ODBC ограничения на 256 символов. Ну нет. В этом смысле ODBC ничем не отличается от ADO. Приведите пример Вашей команды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 09:48:54 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
fff1="" sss1="" fff2="" sss2="" fff=field(1) sss="?m."+fff for x=2 to 9 aaa=field(x) fff=fff+","+aaa sss=alltrim(sss)+",?m."+aaa endfor aa="'INSERT INTO " aa1=" (" aa2=") VALUES (" aa3=")'" XXX=aa+alltrim(bbb)+aa1+alltrim(fff)+", idnumtp,id_codper" +alltrim(aa2)+alltrim(sss)+",?m.idnumtp,?m.id_codper" +aa3 kkk=sqlexec(nHandle,&XXX) вот до сюда закидываю первые 9 переменных, далее оставшиеся в блоках по 9, если увеличить количество, то в SQL появляется только первые 256 символов, причем обрывается даже на половине слова, и SQL соответственно ничего не делает. а фокс прокатывает без ошибок. fff1=field(10) fff1=fff1+"=?m."+fff1 for x=11 to 18 aaa=field(x) fff1=fff1+","+aaa+"=?m."+aaa endfor XXX="'update "+alltrim(bbb)+ " SET "+alltrim(fff1)+ " where idnumtp=?m.idnumtp and id_codper=?m.id_codper and n=?m.n and o=?m.o'" kkk=sqlexec(nHandle,&XXX) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 10:25:29 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
чё еаписано не понятно (хрень какая-то). Если не в состоянии привести пример кода а не какие-то вырваные из контекста строчки то предлагаю вывести команды которые должны исполняться в текстовый файл и попробовать выполнить в QueryAnaliser. Как вам уже сказали никаких ограничений на длину в одбц нет. Вероятно что-то с разницей в типах полей Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 10:37:05 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
ну сами же просили код, я написал.... что я могу поделать если весь перечень таблиц и строк вручную не перебрать, вот и генерится код самостоятельно.... проблема при передаче данных через ОДБЦ что в SQL попадает не вся строка...(это я в профайлере смотрел)....а в адо не знаю синтаксис передачи переменных, вот что я собственно и спрашивал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 10:46:23 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
НЕ НАДО делать макроподстановку. Второй параметр - это и так символьная переменная. Надо писать так: kkk=sqlexec(nHandle,m.XXX) Я вообще удивляюсь, как он у Вас хоть что-то записывает. Вы ведь, по сути написали следующее: kkk=sqlexec(nHandle, INSERT INTO ...) Т.е. прямо так, безо всяких кавычек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 11:02:47 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, спасибо, теперь данные передаются полностью, но не записываются...в чем может быть проблема? базы SQL импортированы с рабочих баз, т.е. совпадение типов должно быть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 18:05:10 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Это определяется по сообщению об ошибке: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 18:54:46 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, спасибо, все заработало.... но заметил одну вешь, время не обнуляется как в простом фоксе а хранится как 1 января 1900года 12:00, с этим можно как нибудь справиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 11:24:15 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
авторно заметил одну вешь, время не обнуляется как в простом фоксе а хранится как 1 января 1900года 12:00, с этим можно как нибудь справиться? Видимо для хранения даты используется SmallDateTime smalldatetime Date and time data from January 1, 1900, Пустой даты в терминах фокса в MSSQL не существует, дата может быть либо по умолчанию, либо NULL. Поэтому надо принять какие-то допущения те 1.01.1900 интерпритировать как пустую дату, если такое значение возможно в поле, то надо ставить NULL в Default поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 11:41:13 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
PaulWist Поэтому надо принять какие-то допущения те 1.01.1900 интерпритировать как пустую дату, если такое значение возможно в поле, то надо ставить NULL в Default поля. 1. В Default не надо ставить NULL. Достаточно разрешить иметь NULL в колонке. 2. Дату лучше из NULL перводить в пустую дату на клиенте (с преобразованием в Date из DateTime, т.к. , обычно, время не интересует): NVL(TTOD(DataTimeSQL), {}) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 13:12:06 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Aleksey-KДостаточно разрешить иметь NULL в колонке. Так конечно будет более правильно, если не баловаться SET ANSI_NULL_DFLT_OFF, и проставлять NULL в CREATE TABLE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 13:48:07 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Ну если Вы в каждом столбце команды CREATE TABLE... указываете NULL или NOT NULL, то SET ANSI_NULL_DFLT_OFF вам не указ :) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2005, 19:09:33 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Aleksey-K CREATE TABLE... указываете NULL или NOT NULL, то SET ANSI_NULL_DFLT_OFF вам не указ PaulWist и проставлять NULL в CREATE TABLE Думаю между этими фразами можно поставить знак тождественного равенства. Но у автора, на мой взгляд другая проблема Код: plaintext 1. 2. 3. 4. 5. 6. Просто при заполнении поля datetime передается пустая строка, поэтому он получаеи 01.01.1900, и наши NOT NULL/Default NULL ему не помогут, в этом случае на клиенте надо разбирать на EMPTY(дата) и либо игнорировать это поле, что бы записался NULL либо явно его передавать/присваивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 09:07:21 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
PaulWist Просто при заполнении поля datetime передается пустая строка, поэтому он получаеи 01.01.1900, и наши NOT NULL/Default NULL ему не помогут, в этом случае на клиенте надо разбирать на EMPTY(дата) и либо игнорировать это поле, что бы записался NULL либо явно его передавать/присваивать. Совершенно точно. Я для этого и использую: NVL(TTOD(DataTimeSQL), {}) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 14:34:32 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Алексей. Тихо сами с собой ведём беседу :) Aleksey-KСовершенно точно. Я для этого и использую: NVL(TTOD(DataTimeSQL), {}) Автор уже пропал, тем не менее Ваш код призван выдать пустую дату если на сервере он NULL, а у автора проблема как не допустить появление 01.01.1900 на сервере, поэтому если RV то ему надо явно прописать replace datefield with null, либо sqlexe([insert into table (date) values (null)]), предварительно проверив на EMPTY(datefield) значение которое будет подставлять в sqlexec. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 14:54:07 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
При отсылка на сервер пришлось писать свою функцию (аналог NULLIF T-SQL) Код: plaintext 1. 2. 3. 4. 5. lcCommand = [TTN_Update ] +NULLIF(ListDocum.UO_ID) + [, ] + NULLIF(ListDocum.Data_Otgr)..... SQLEXEC(lcCommand ) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 15:02:01 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Aleksey-K Как вариант Код: plaintext 1. Думаю можно закончить. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 15:08:25 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
PaulWist Aleksey-K Как вариант Код: plaintext 1. Думаю можно закончить. :)) Имено так. Как только открыл эту функцию, так и вспомнил про ICASE :) Спасибо. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 15:10:40 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Господа, благодарю за помощь, все исправил. или почти все... встал вопрос с транзакциями: Как можно объединить в одну транзакцию запись в десяток баз? в книжке по SQL2000 прочитал что ODBC не поддерживает явное задание транзакций, а следовательно невозможность объединить записи в разные базы...может это можно как то обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 14:08:37 |
|
||
|
fox+ado+sql: как закинуть данные?
|
|||
|---|---|---|---|
|
#18+
Давайте разберемся с терминологией: в десяток баз или десяток таблиц? Это, как говорят в Одессе, две большие разницы :) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 14:21:01 |
|
||
|
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?all=1&fid=41&tid=1593301]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
105ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 448ms |

| 0 / 0 |
