Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

загрузка из файла 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
1-76376
OlegM
2003-03-13 06:10
2003.03.24
Как отобразить bitmap


3-76368
AlexA
2003-03-06 16:04
2003.03.24
Раскрытие DBLookupCobboBox


3-76354
onos_avp
2003-03-06 06:58
2003.03.24
базы парадокс из delphi и из c++


7-76686
Timon
2003-01-10 19:55
2003.03.24
Модем


3-76266
SZap
2003-03-06 11:40
2003.03.24
Програмное создание Таблици





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский