Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программная перекачка из DBF в MSSQL [D6, MSSQL, dBase, FoxPro]


Страницы:   1 2 3

kivadim ©   (2005-05-18 09:44:00) 

Есть таблички DBF-ки, которые имеют одинаковые структуры и данные из которых нужно перекачивать в таблицу на MSSQL сервере.
Перекачку в проге делаю следующим образом:

procedure TForm1.TransferData(TName: string);
var i: integer;
begin
flDM.DBF_Query.Close;
flDM.DBF_Query.SQL.Clear;
flDM.DBF_Query.SQL.Text:='select * FROM '+TName+' ';
flDM.DBF_Query.Open;

flDM.MSSQL_Query.Close;
flDM.MSSQL_Query.SQL.Clear;
flDM.MSSQL_Query.SQL.Text:='insert into MSTable values('+
                             ':FL000, :FL00_1_1, :FL00_1_2, :FL01, :FL01_A, :FL02_1, :FL02_2, '+
                             ':FL03, :FL04, :FL05, :FL11, :FL12, :FL13, :FL15, :FL16, :FL17, :FL30, :FL31, '+
                             ':FL32_1, :FL32_2, :FL33, :FL34, :FL35_1, :FL35_2, :FL35_3, :FL35_4, :FL41_1, '+
                             ':FL41_2, :FL45_1, :FL45_2, :FL45_3, :FL45_4, :FL42, :FL50, :FL51, :FL52_1, '+
                             ':FL52_2, :FL52_3, :FL53, :FL61, :FL61_1, :FL61_2, :FL62, :FL63_1, :FL63_2, '+
                             ':FL71_1, :FL71_2, :FL00_3, :FL00_4, :FL00_5, :FL00_6, :FL00_7, :FL00_8) ';

while not flDM.DBF_Query.Eof do
 begin
  for i:=0 to 52 do
   begin
    flDM.MSSQL_Query.Parameters[i].Value:=flDM.DBF_Query.Fields[i].AsVariant;
   end;
  flDM.MSSQL_Query.ExecSQL;
  flDM.DBF_Query.Next;
 end;
flDM.DBF_Query.Close;
end;


но работает довольно медленно, так например ~35000 записей перекачиваются порядка 5-7 минут.
Можно ли записать гетерогенный запрос в котром участвовали бы таблица .dbf и таблица mssql?
Ну или хотябы как увеличить быстродействие существующего решения?


Nikolay M.   (2005-05-25 10:43:00) [41]


> Это норамально?

Да.


kivadim   (2005-05-25 10:40:00) [42]

Еще вопросик.
Почему MSSQL сервер (процесс sqlserver.exe) после отработки запроса не освобождает занятую им память?
Запустив пару запросов на перекачку больших объемов данных sqlserver.exe занимает по нарастающей объем памяти, а по окончанию работы не освобождает ее.
Это норамально?


sniknik   (2005-05-18 16:00:00) [43]

ты нашол запрос для access, для mssql см. BOL по называемым ранее темам.


kivadim   (2005-05-18 15:48:00) [44]

наткнулся на решение обратной проблемы


procedure TExportADOTable.ExportToDbase(FieldNames: string; FileName: string;
 IsamFormat: string);
begin
 {IsamFormat values
 dBase III
 dBase IV
 dBase 5.0
 }
 if not Active then
   Exit;

 FADOCommand.Connection := Connection;
 FADOCommand.CommandText := 'Select ' + FieldNames + ' INTO ' + '[' +
   ExtractFileName(FileName) + ']' +
   ' IN ' + '"' + ExtractFilePath(FileName) + '"' + '[' + IsamFormat +
   ';]' + ' From ' + TableName;
 FADOCommand.Execute;
end;


где сводится к сосставлению подобного запроса:
Select * INTO [small.dbf] IN "D:\" [dBase IV;] From My_Table
но возникает ошибка

Project TransferData.exe raised exception class EOleException with message 'Incorrect syntax near the keyword 'IN''. Process stopped. Use Step or Run to continue.


Подскажите в чем проблема...


MOA   (2005-05-18 14:22:00) [45]

>Как можно заблокировать размер лог-файла, сохраняя при этом работоспособность самой БД либо вообще удалить лог-файл
Никак. Ибо это и есть основной механизм, благодаря которому MSSQL является SQL сервером ;).
Лог очишается только при бэкаппах - это есть механизм "дуракоустойчивости" ;). Если для базы установлен флаг "Auto shrink" - после бэкапа она уменьшится автоматом. Или см. в BOL команду
DBCC SHRINKDATABASE
И ещё - посмотрите в EM свойства Вашей базы - будет любопытно ;).
Удачи!


kivadim   (2005-05-18 13:44:00) [46]

Спасибо всем за ответы.

>> Виталий Панасенко   (18.05.05 09:58) [5]
Надо будет разобраться, просто не подозревал что можно автоматизировать перекачку через DTS.

Еще вопросик:
Я закачивал данные в MS, а потом удалял и заметил, что удаление данных не уменьшает размер БД в MSSQL, а также сильно увельчивается размер лог-файла базы в MSSQL. Как можно заблокировать размер лог-файла, сохраняя при этом работоспособность самой БД либо вообще удалить лог-файл и как все-же уменьшить размер БД после удаления данных?


ANB   (2005-05-18 11:31:00) [47]

Есть у меня пример закачки dbf в MS SQL. Но я там через ADO коннектился только к MS SQL. Из dbf напрямую данные читал. Скорость - ну 35000 за 3-5 сек точно не качала, но быстрее 3 минут.


Max Zyuzin   (2005-05-18 11:27:00) [48]

>sniknik ©   (18.05.05 10:10) [10]
Ну раз сам Фиг знает :o) значит точно получится :o)


sniknik   (2005-05-18 10:10:00) [49]

> хотя фиг знает
знаю, знаю. точно получится. (возможность есть)
                                           фиг.

;о))


Anatoly Podgoretsky   (2005-05-18 10:08:00) [50]

Lexer ©   (18.05.05 09:56) [3]
MS SQL достаточно серьезная система, что бы не справиться с такой мелочью. В вопросе нет ни какой детализации, чтобы можно было предложить другое оптимальное решение, данное решение самое быстродействующее.


sniknik   (2005-05-18 10:06:00) [51]

> - нормально по времени.
ненормально, пакетная команда [1] отработает гдето сек 3-10 (может больше от многого зависит, но ненамного)
и основное время уйдет не на перекачку а на подключение к движку... (это если по минимальному времени сравнивать)

> Можно ли записать гетерогенный запрос в котром участвовали бы таблица .dbf и таблица mssql?
openrowset, opendatasource, linked server, dts + BOL ко всем темам
и + microsoft jet для обьекта "с другой стороны" от MSSQL.

повнимательнее с путями, считаются от того кто выполняет а это будет у тебя MSSQL сервер. (если откудато с рабочей станции таблица, сервер ее должен видеть, и пути писать от него)


Max Zyuzin   (2005-05-18 10:01:00) [52]

>kivadim   (18.05.05 09:44)  
Не стоит использовать TADOQuery для выполнения запросов, которые ничего не возвращают. TADOCommand попробуй вместо этого.
Вообще я так заметил что работа через АДО с dBase довольно медленна... по этому время перекачки кажется мне нормальным, по поводу гетерогенного запроса думаю что ничего не получится, хотя фиг знает.


Nikolay M.   (2005-05-18 09:58:00) [53]


> Можно ли записать гетерогенный запрос в котром участвовали
> бы таблица .dbf и таблица mssql?

BOL: OPENROWSET, OPENDATASOURCE, linked servers.


Виталий Панасенко   (2005-05-18 09:58:00) [54]

Вообще-то у MS SQL есть свой механизм импорта данных... Зачем изобретать велосипед ?


Nikolay M.   (2005-05-18 09:57:00) [55]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1116325991&n=1
Ы?


> как увеличить быстродействие существующего решения?

Использовать BULK INSERT - быстрее по-любому не получится.


Lexer   (2005-05-18 09:56:00) [56]


> [1] Anatoly Podgoretsky ©   (18.05.05 09:46)
> INSERT INRO SELECT FROM


Ему надо перекачать из одной БД в другую, неужели MSSQL проглотит скрипт типа:
INSERT INTO WARE SELECT FROM '......ware.db'?


ANB   (2005-05-18 09:48:00) [57]


> kivadim   (18.05.05 09:44) ~35000 записей перекачиваются порядка 5-7 минут
- нормально по времени. Сервак пошустрее используй и DBF качай на нем локально.


Anatoly Podgoretsky   (2005-05-18 09:46:00) [58]

INSERT INRO SELECT FROM


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо