powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
42 сообщений из 42, показаны все 2 страниц
fox+ado+sql: как закинуть данные?
    #33287354
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, подскажите: есть прога работает на файл-сервере, требуется перевести ее на хранение под sql, запросы типа select работают честь по чести, а вот положить туда данные не получается.... пробовал через ODBC но там ограничение по длине строки 256 символов, а у меня база только 101 поле... через ADO ограничения по длине строки нет, но передать переменные у меня не получается... максимум одну переменную. Заранее спасибо.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287390
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятие "пробовал через ODBC" очень растяжимое и сильно завиит от пробуещего. Как ты это пробовал? Ты уверен в праввильности "пробования"?Каким образом количество полей связано ограничеинем на количество символов в поле? Как ты вообще это делаешь? Кусок кода хоть показал бы.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287416
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай чем отличаются символьные константы от символьных переменных памяти

http://www.sql.ru/forum/actualthread.aspx?tid=209472#1821377
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287434
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет, но чем они отличаются я уже знаю (сам допер), тут дело в другом, при передаче символьной переменной через ODBC, фокс ее понимает нормально, а вот при конвертации в ODBC переменная обрезается, и в SQL подается только строка из 256 символов, мне пришлось разбить всю строку на 1 insert и кучу update'ов, таким образом конечно все работает, но при сбое все летит к чертям, я принял решение работать через ADO, но не знаю как правильно постоить синтаксис insert'а чтобы передавать переменные , а не их значения в явном виде.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287646
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все-таки - если можно - приведите пример ...
Потому как работаю через ODBC и с ограничениями не сталкивался (MS SQL 7.0).
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287853
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НЕТ в ODBC ограничения на 256 символов. Ну нет. В этом смысле ODBC ничем не отличается от ADO. Приведите пример Вашей команды.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287946
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33287969
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё еаписано не понятно (хрень какая-то). Если не в состоянии привести пример
кода а не какие-то вырваные из контекста строчки то предлагаю вывести
команды которые должны исполняться в текстовый файл и попробовать выполнить
в QueryAnaliser.

Как вам уже сказали никаких ограничений на длину в одбц нет. Вероятно что-то
с разницей в типах полей


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33288002
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну сами же просили код, я написал.... что я могу поделать если весь перечень таблиц и строк вручную не перебрать, вот и генерится код самостоятельно.... проблема при передаче данных через ОДБЦ что в SQL попадает не вся строка...(это я в профайлере смотрел)....а в адо не знаю синтаксис передачи переменных, вот что я собственно и спрашивал...
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33288053
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НЕ НАДО делать макроподстановку. Второй параметр - это и так символьная переменная. Надо писать так:

kkk=sqlexec(nHandle,m.XXX)

Я вообще удивляюсь, как он у Вас хоть что-то записывает. Вы ведь, по сути написали следующее:

kkk=sqlexec(nHandle, INSERT INTO ...)

Т.е. прямо так, безо всяких кавычек.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33289389
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, спасибо, теперь данные передаются полностью, но не записываются...в чем может быть проблема? базы SQL импортированы с рабочих баз, т.е. совпадение типов должно быть...
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33289479
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это определяется по сообщению об ошибке:

Код: plaintext
1.
2.
3.
4.
5.
6.
kkk=sqlexec(nHandle,m.XXX)
IF kkk< 0 
	LOCAL laError( 1 )
	AERROR(laError)
	* Анализ содержимого массива laError для уточнения причины ошибки
ENDIF
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33295128
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, спасибо, все заработало.... но заметил одну вешь, время не обнуляется как в простом фоксе а хранится как 1 января 1900года 12:00, с этим можно как нибудь справиться?
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33295208
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно заметил одну вешь, время не обнуляется как в простом фоксе а хранится как 1 января 1900года 12:00, с этим можно как нибудь справиться?

Видимо для хранения даты используется SmallDateTime

smalldatetime

Date and time data from January 1, 1900,

Пустой даты в терминах фокса в MSSQL не существует, дата может быть либо по умолчанию, либо NULL. Поэтому надо принять какие-то допущения те 1.01.1900 интерпритировать как пустую дату, если такое значение возможно в поле, то надо ставить NULL в Default поля.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33295658
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
Поэтому надо принять какие-то допущения те 1.01.1900 интерпритировать как пустую дату, если такое значение возможно в поле, то надо ставить NULL в Default поля.
1. В Default не надо ставить NULL. Достаточно разрешить иметь NULL в колонке.
2. Дату лучше из NULL перводить в пустую дату на клиенте (с преобразованием в Date из DateTime, т.к. , обычно, время не интересует):
NVL(TTOD(DataTimeSQL), {})
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33295805
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KДостаточно разрешить иметь NULL в колонке.

Так конечно будет более правильно, если не баловаться SET ANSI_NULL_DFLT_OFF, и проставлять NULL в CREATE TABLE
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33296914
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если Вы в каждом столбце команды CREATE TABLE... указываете NULL или NOT NULL, то SET ANSI_NULL_DFLT_OFF вам не указ :)
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33297469
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K CREATE TABLE... указываете NULL или NOT NULL, то SET ANSI_NULL_DFLT_OFF вам не указ

PaulWist и проставлять NULL в CREATE TABLE

Думаю между этими фразами можно поставить знак тождественного равенства.

Но у автора, на мой взгляд другая проблема

Код: plaintext
1.
2.
3.
4.
5.
6.
create table #t (id int, dd smalldatetime null)

insert into #t (id, dd) values ( 1 , '')

select * from #t

drop table #t

Просто при заполнении поля datetime передается пустая строка, поэтому он получаеи 01.01.1900, и наши NOT NULL/Default NULL ему не помогут, в этом случае на клиенте надо разбирать на EMPTY(дата) и либо игнорировать это поле, что бы записался NULL либо явно его передавать/присваивать.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33298586
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
Просто при заполнении поля datetime передается пустая строка, поэтому он получаеи 01.01.1900, и наши NOT NULL/Default NULL ему не помогут, в этом случае на клиенте надо разбирать на EMPTY(дата) и либо игнорировать это поле, что бы записался NULL либо явно его передавать/присваивать.
Совершенно точно. Я для этого и использую: NVL(TTOD(DataTimeSQL), {})
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33298669
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей.

Тихо сами с собой ведём беседу :)

Aleksey-KСовершенно точно. Я для этого и использую: NVL(TTOD(DataTimeSQL), {})

Автор уже пропал, тем не менее Ваш код призван выдать пустую дату если на сервере он NULL, а у автора проблема как не допустить появление 01.01.1900 на сервере, поэтому если RV то ему надо явно прописать replace datefield with null, либо sqlexe([insert into table (date) values (null)]), предварительно проверив на EMPTY(datefield) значение которое будет подставлять в sqlexec.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33298697
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При отсылка на сервер пришлось писать свою функцию (аналог NULLIF T-SQL)
Код: plaintext
1.
2.
3.
4.
5.
FUNCTION NULLIF(LnSRC1)
	RETURN IIF(EMPTY(m.LnSRC1), 'NULL', IIF(VARTYPE(m.LnSRC1)=="C", ;
		['] + ALLTRIM(m.LnSRC1) + ['], IIF(VARTYPE(m.LnSRC1)== "D", ['] + DTOC(m.LnSRC1) + ['],  ;
		IIF(VARTYPE(m.LnSRC1)== "T", ['] + TTOC(m.LnSRC1) + ['], ;
		ALLTRIM(STR(m.LnSRC1))))))
ENDFUNC
Тогда при сборке строки для SQLEXE все даты (точнее, все поля, пустые значения, которых, надо поменять на 'NULL') "пропускаю" через эту функцию:
lcCommand = [TTN_Update ] +NULLIF(ListDocum.UO_ID) + [, ] + NULLIF(ListDocum.Data_Otgr).....
SQLEXEC(lcCommand )
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33298720
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K

Как вариант
Код: plaintext
1.
FUNCTION NULLIF(LnSRC1)
	RETURN ICASE(.......)

Думаю можно закончить. :))
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33298728
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Aleksey-K

Как вариант
Код: plaintext
1.
FUNCTION NULLIF(LnSRC1)
	RETURN ICASE(.......)

Думаю можно закончить. :))
Имено так. Как только открыл эту функцию, так и вспомнил про ICASE :) Спасибо.
С уважением, Алексей.
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33301374
bogik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, благодарю за помощь, все исправил. или почти все...
встал вопрос с транзакциями:
Как можно объединить в одну транзакцию запись в десяток баз?
в книжке по SQL2000 прочитал что ODBC не поддерживает явное задание транзакций, а следовательно невозможность объединить записи в разные базы...может это можно как то обойти?
...
Рейтинг: 0 / 0
fox+ado+sql: как закинуть данные?
    #33301405
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте разберемся с терминологией: в десяток баз или десяток таблиц? Это, как говорят в Одессе, две большие разницы :)
С уважением, Алексей.
...
Рейтинг: 0 / 0
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
42 сообщений из 42, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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