|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33287390&tid=1593301]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 287ms |

| 0 / 0 |
