Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

загрузка из файла xml   Найти похожие ветки 

 
galexis ©   (2003-03-04 19:13) [0]

Уважаемые мастера!
Копирую данные из файла .xml в БД. Есть набор полей типа Integer, все бы хорошо, да не во всех записях имеются поля, т.е. если значение в поле есть, то есть и поле в файле xml, если нет, то и поля в xml нет и тогла запрос выглядит так: insert into table (int1, int2) values (123,) И соответственно ошибка. Где здесь моя ошибка?


 
galexis ©   (2003-03-04 19:21) [1]

Что нужно вставлять в поле обозначающее отсутствие значения?


 
Mike_Goblin ©   (2003-03-04 19:32) [2]

>insert into table (int1, int2) values (123,)
insert into table (int1, int2) values (123,NULL)
лучше в xml при отсутсвии значения записывать слово NULL, чем просто убирать поле


 
galexis ©   (2003-03-05 10:23) [3]

Файл xml дает другая организация. Его менять они не будут, да и не могут.

Если записывать NULL, то в поле типа Integer появится значение 0. А нужно чтобы отсутствало значение. В этом поле хранятся значения 0,1,2,3,4,5 (всего 6 значений) + это поле может быть пустым.


 
zacho ©   (2003-03-05 10:29) [4]


> Если записывать NULL, то в поле типа Integer появится значение
> 0

С чего бы это ? NULL и запишется.


 
galexis ©   (2003-03-05 10:39) [5]

Из IBConsole делаю insert into table (int1, int2) values (123,NULL) Все хорошо, записывается NULL. Из TQuery делаю тоже самое - в поле записывается 0. Что бы это значило?


 
Mike_Goblin ©   (2003-03-05 10:41) [6]

Это значит, что ты делаешь не тоже самое


 
galexis ©   (2003-03-05 10:49) [7]

Вставляется сразу около 3000 записей по 30 полей, но число полей в каждой записи разное. До того как формируется запрос, я проверяю поле на наличие значения и если его нет то переменной типа String присваиваю значение ID1:="NULL". Затем запрос, который для всех записей однаков insert into table (int1, int2) values (123,ID1)
Вот и все отличие от IBConsole, где пишу напрямую insert into table (int1, int2) values (123,NULL)


 
zacho ©   (2003-03-05 10:58) [8]


> insert into table (int1, int2) values (123,ID1)

Наверно :ID1 ? Т.е. ID1 - параметр ? Тогда нужно что-то типа ParamByName("ID1").Clear


 
Mike_Goblin ©   (2003-03-05 11:00) [9]

insert into table (int1, int2) values (123,ID1)
это не то же самое, что
insert into table (int1, int2) values (123,NULL)
Перед выполнением запроса (на Query.ExecSQL)поставь точку останова - посмотри какой запрос выполяется реально.


 
Val ©   (2003-03-05 11:14) [10]

хм. может все-таки текст покажите, вместо игры в угадайку?


 
galexis ©   (2003-03-05 14:08) [11]

if LoadDS.FieldByName("IDVID").AsString<>"" then
IDVID:=LoadDS.FieldByName("IDVID").AsString
else
IDVID:="NULL";
q1:="INSERT INTO UL (IDOPF,IDVID) values ("+
LoadDS.FieldByName("IDOPF").AsString+","+
IDVID+")";
LoadQr.SQL.Add(q1);

Реально запрос выглядит точно так:
insert into table (int1, int2) values (123,NULL)


 
galexis ©   (2003-03-05 14:45) [12]

Извините, налажал. Там в реальных данных как раз и идет 0. А там где нет полей - ничего не заносится этим запросом, т.е. все правильно.


 
Val ©   (2003-03-05 14:55) [13]

>galexis ©
т.е. вопрос закрыт?
совет: приглядитесь к использованию параметров в запросах вместо конкатенации - качественно улучшит код и позволит избежать путаницы при их формировании.


 
galexis ©   (2003-03-05 15:11) [14]

Этот вопрос закрыт. На параметры посмотрю, давно хотел. Спасибо.
А вообще мне надо данные из 12 таблиц скопировать. Файл xml очень большой, мой неплохой компьютер справляется с загрузкой данных в TClientDataSet за 10 минут. Нельзя ли убыстрить как нибудь?


 
Vinni   (2003-03-05 19:42) [15]

1. Запрос действительно надо составлять не конкатенацией, а параметризованным - я давно взял это за правило, и проблем стало меньше. Например: если в строковом пареметре встретится кавычка, а вы используете конкатенацию - "кирдык" вашему запросу, на сервер пойдет обрубленный на кавычке запрос. В случае же с параметрами, он никогда не "сломается".

2. Чтобы инициализировать запрос [TQuery] значением NULL, перед его выполнением сделать так:

обязательно !!!
theQuery.ParamByName("IDVID").DataType := ftInteger; //<-в случае Integer типа.

и
theQuery.ParamByName("IDVID").Clear;



 
Vinni   (2003-03-05 20:02) [16]

Забыл... прошу прошения

Почему медленно справляется компьютер? Надо выяснить ЧТО тормозит. Один из вариантов - тормозит xml парсер.
Если использется Microsoft"овский парсер как сервер автоматизации (с поздним связванием через Dispatch) - замедление неизбежно. Ранее связывание, если склероз мне не изменяет, выигрывает в разы (кажется раз в 10?).
Решение: имортировать библиотеку типов в Delphi, получить *_TLB.pas (скорее всего будет MSXML_TLB.pas), ну и подключить его к нужным модулям. Правда в этом случае API будет несколько неудобным. Лично я написал просто более удомоваримую "обертку" к нему. А может Вы используете чей-то другой парсер или, даже, самописный? Я такие чудеса видел. Пробовал, как-то, скачанный парсер. Открыл файл ~3MB - устал ждать когда он его "разберет" и просто "снял" задачу. При этом он съел неимоверное количество памяти. А должен открывать за миллисекунды (MS-XML). Еще ускорить можно написав свой. По опыту говорю - скорость можно удвоить (против MS-XML).


 
galexis ©   (2003-03-06 16:43) [17]

>Vinni

Чесно говоря с xml столкнулся впервые. В DataSet загружаю используя XMLTransformProvider. Поэтому какой у меня парсер сказать не могу. Где это посмотреть? ОС у меня XP, IE 6. IE открывает эти файлы xml еще медленнее (или так кажется). Где можно прочитать про MS-XML?



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
1-76399
GAlexandr
2003-03-13 13:08
2003.03.24
Чтение из TWriter


1-76472
dm37
2003-03-12 12:07
2003.03.24
ini-файл


3-76260
Воробъянинов
2003-03-04 09:13
2003.03.24
Кодировка в ADO...


3-76364
Купец
2003-03-06 11:17
2003.03.24
В DBGrid проблема с выделением строки...


3-76352
Andy Eremin
2003-03-06 08:47
2003.03.24
пустые поля