powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
25 сообщений из 42, страница 1 из 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
25 сообщений из 42, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / fox+ado+sql: как закинуть данные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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