Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ??? / 25 сообщений из 62, страница 1 из 3
31.01.2011, 21:50
    #37089394
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Смысл в том чтобы передать таблицу на сервер не по отдельной записи, а сразу всю таблицу для последующих операций уже внутри сервера.
Как это сделать?
...
Рейтинг: 0 / 0
31.01.2011, 22:54
    #37089461
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33,

XML?
...
Рейтинг: 0 / 0
31.01.2011, 23:34
    #37089509
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Игорь ГорбоносПитон33,

XML?

Конкретный пример можно?
...
Рейтинг: 0 / 0
01.02.2011, 01:06
    #37089602
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33,

я не работал с MySql и не знаю его возможностей для работы с XML, через XML я общаюсь с MSSQL и пример могу дать для MSSQL
...
Рейтинг: 0 / 0
01.02.2011, 01:22
    #37089616
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Игорь ГорбоносПитон33,

я не работал с MySql и не знаю его возможностей для работы с XML, через XML я общаюсь с MSSQL и пример могу дать для MSSQL
Дайте пример тогда для MSSQL?
...
Рейтинг: 0 / 0
01.02.2011, 10:08
    #37089862
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Смысл в том чтобы передать таблицу на сервер не по отдельной записи, а сразу всю таблицу для последующих операций уже внутри сервера.
Как это сделать?Для начала неплохо бы выяснить а что, собственно, имеет MySQL для таких действий? Есть ли в нем возможность "одной командой" закачать таблицу?
...
Рейтинг: 0 / 0
01.02.2011, 10:13
    #37089884
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33Игорь ГорбоносПитон33,

я не работал с MySql и не знаю его возможностей для работы с XML, через XML я общаюсь с MSSQL и пример могу дать для MSSQL
Дайте пример тогда для MSSQL?
1. Клиент
1.1. Выбираем необходимы поля и записи из курсора и сохраняем в новый курсор:
Код: plaintext
SELECT f1, f2 FROM MyCursor TO xmlcur
1.2. Формируем xml документ:
Код: plaintext
1.
2.
LOCAL m.XMLStr, m.lcCommand
CURSORTOXML("xmlcur", "m.XMLStr",  3 ,  16 )
 
1.3. Формируем команду для сервера
Код: plaintext
1.
2.
TEXT TO lcCommand TEXTMERGE NOSHOW PRETEXT  7 
    EXEC dbo.My_SP @XMLines='<<m.XMLStr>>', ... другие параметры
ENDTEXT
1.4. Выполняем команду через SQLEXEC или через оболочку над ней, реализованной в виде класса или процедуры
2. Сервер
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE PROCEDURE dbo.My_SP
   @XMLines XML = NULL,
   ....Другие параметры
AS
BEGIN TRY
...
...
    DECLARE @IDXML INT
...
    EXEC sp_xml_preparedocument @IDXML OUTPUT, @XMLines
    IF @IDXML IS NULL
         RAISERROR('При добавлении строк произошла ошибка разбора документа XML с помощью процедуры    sp_xml_preparedocument!',  16 ,  127 )
    -- Просто выбираем данные, но скорее всего тут будет или CTE или INSERT 
    SELECT f1,f2 
    FROM OPENXML (@IDXML, '/VFPData/row',  2 )
     WITH (f1 int '@f1',
	 f2 INT '@f2')
 ...
...
...
    IF @IDXML >  0 
         EXEC sp_xml_removedocument @IDXML
END TRY
BEGIN CATCH
	IF @@NESTLEVEL =  1 
	BEGIN
		IF (XACT_STATE()) <>  0 
			ROLLBACK TRAN
		EXEC dbo.ErrorProcess   -- dbo.ErrorProcess  -  процедура - обработчик ошибок
	END
	ELSE
		EXEC dbo.ErrorProcess  0 
	IF @IDXML >  0 
		EXEC sp_xml_removedocument @IDXML
	RETURN - 1 
END CATCH
С уважением, Алексей
...
Рейтинг: 0 / 0
01.02.2011, 11:02
    #37090004
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Алексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
...
Рейтинг: 0 / 0
01.02.2011, 11:45
    #37090170
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
ВладимирМАлексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
Так это не ко мне вопрос! Питон33 спрашивал как из VFP проделать такую операцию.
А если надо именно закачать данные из DBF на сервер, то Вы совершенно правы!
Я бы использовал SSIS пакет (если надо проделывать это регулярно) или OpenRowSet (если не нет). Сам VFP для этого не нужен.
С уважением, Алексей
...
Рейтинг: 0 / 0
01.02.2011, 15:53
    #37091095
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Aleksey-KВладимирМАлексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
Так это не ко мне вопрос! Питон33 спрашивал как из VFP проделать такую операцию.
А если надо именно закачать данные из DBF на сервер, то Вы совершенно правы!
Я бы использовал SSIS пакет (если надо проделывать это регулярно) или OpenRowSet (если не нет). Сам VFP для этого не нужен.
С уважением, Алексей
Нужно именно из VFP!
К примеру, подготовить записи в программе VFP и передать их одним махом на сервер.
Теперь возникает второй вопрос:
Какой метод будет работать быстрее - через ODBC в цикле обновлять по одной записи,
или формируя громадный XML и потом пересылать его на сервер, да потом там ещё проделывать с ним операции?
В общем интересует скорость.
Какой же всё-таки из методов самый быстрый для 500 000 записей DBF.
...
Рейтинг: 0 / 0
01.02.2011, 16:08
    #37091162
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33Aleksey-Kпропущено...

Так это не ко мне вопрос! Питон33 спрашивал как из VFP проделать такую операцию.
А если надо именно закачать данные из DBF на сервер, то Вы совершенно правы!
Я бы использовал SSIS пакет (если надо проделывать это регулярно) или OpenRowSet (если не нет). Сам VFP для этого не нужен.
С уважением, Алексей
Нужно именно из VFP!
К примеру, подготовить записи в программе VFP и передать их одним махом на сервер.
Теперь возникает второй вопрос:
Какой метод будет работать быстрее - через ODBC в цикле обновлять по одной записи,
или формируя громадный XML и потом пересылать его на сервер, да потом там ещё проделывать с ним операции?
В общем интересует скорость.
Какой же всё-таки из методов самый быстрый для 500 000 записей DBF.
А вы сами как думаете? 500 000 команда послать на сервер или одну! Что быстрее?
Даже если учесть избыточную "болтливость" формата XML для "проской" таблицы, то все равно ответ на ваш вопрос, как мне кажестся, очевиден!
С уважением, Алексей
P.S. А если еще учесть возможные требования транзакционной целостности добавления ?!
...
Рейтинг: 0 / 0
01.02.2011, 16:15
    #37091200
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Ну, надо же и самому иногда думать

Вы хотите закачать данные в некую БД. Очевидно, лучше всего и быстрее всего будет использование групповых команд импорта этой самой БД. Следовательно, идете в форум по MySQL на этом сайте и выполняете поиск разных способов импорта данных. Скорее всего, там есть что-нибудь и про импорт из DBF. Я просто не в курсе, поскольку не работал с MySQL.

Далее встает вопрос, как запустить эту операцию импорта. Очевидно, надо "попросить" MySQL это сделать. Можно ли это сделать из среды FoxPro? А это уже зависит от выбранного способа импорта и возможностей драйвера ADO или ODBC. Ведь "просить" Вы будете через эти драйвера.

PS: Время импорта зависит не столько от количество записей, сколько от общего объема информации (в байтах), которое требуется передать на сервер. Ну, и от способа передачи, разумеется.

Кстати, можете попробовать создать CursorAdapter и поиграться его свойством BatchUpdateCount. По сути, это будет аналог передачи нескольких команд Insert-SQL в одном пакете.
...
Рейтинг: 0 / 0
01.02.2011, 16:17
    #37091208
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Aleksey-K,

Вы мне можете без намёков - а ясно и понятно описать недостатки и преимущества вашего метода?
Просто на форуме есть люди которые ваших намёков не поймут!
...
Рейтинг: 0 / 0
01.02.2011, 16:46
    #37091293
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33,

одной командой - нет, только если это не вызов функции "ZalitTablicuNaServerBystroIBezOshibok" :)

Выгрузите dbf в csv, соединитесь с сервером, загрузите через load data. Если есть спецсимволы, выгружайте через delimited ... with delimiter, а в load data придётся прописать ещё пару параметров. Всё.
...
Рейтинг: 0 / 0
01.02.2011, 17:08
    #37091352
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
ВладимирМКстати, можете попробовать создать CursorAdapter и поиграться его свойством BatchUpdateCount. По сути, это будет аналог передачи нескольких команд Insert-SQL в одном пакете.

тссс, только там, - на фоксклабе не рассказывайте,
а то там целое пАкАление писало немыслимые коды по
формированию пакетов

относительно МС СКЛ от себя:
CAD, пакеты строк + sqlExec,
для Sql2005 bulkxmlload.prg (Doug Hennig/ upsize wizard - в проекте апсайзвизарда -
это для автора примера с иксэмеэль будет полезно)

+ пример через "мульку-парамульку" (встречался в моей практике)
...
Рейтинг: 0 / 0
01.02.2011, 18:04
    #37091552
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
прошелмимо,

В тексте программы есть такая фраза
* чтобы работало, - установить VFPODBC.msi
Это к чему ваще??
Разве он нам нужен для работы с MySQL на линухе?
...
Рейтинг: 0 / 0
01.02.2011, 18:05
    #37091555
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
+ все-же примерчик от Дага Хеннига через ком-компонент
для мс скл
...
Рейтинг: 0 / 0
01.02.2011, 18:08
    #37091569
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33прошелмимо,

В тексте программы есть такая фраза
* чтобы работало, - установить VFPODBC.msi
Это к чему ваще??
Разве он нам нужен для работы с MySQL на линухе?

гы, хто такой твой линух и тем паче майискюэль - мне не известно -
выкручивайся сам

а примеров я накидал патаму, что
от тя поступила такая вводная:
Питон33Дайте пример тогда для MSSQL?
...
Рейтинг: 0 / 0
01.02.2011, 18:14
    #37091577
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
ВладимирМ,

из всех - вы более грамотно описали процесс.
Не могли бы конкретные примеры дать?
На счёт "Попросить мускул" закачать xml тоже поподробнее.
Дело в том что в мускуле нет ни каких дополнительных процедур и писать их никто не будет.
У нас много клиентов и каждому объяснять как залезть в мускул, да ещё что-то там писать - это очень тяжело.
...
Рейтинг: 0 / 0
01.02.2011, 18:56
    #37091671
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Ну, я не работал с MySQL поэтому синтаксис сказать не могу. Надо спрашивать на форуме MySQL. Есть ли там такое вообще.

Ну, а чисто теоретически как "просить сервер"? Если установка соединения через ODBC, то это команда SQLExec(). Для MS SQL, например, это примерно так

Код: plaintext
=SQLExec("номер соединения", "INSERT INTO tabMSSQL select * from OPENROWSET(строка_подключения_к_VFP)")

Если соединение установлено через ADO, то, соответственно, надо будет создавть COM-объекты вроде ADO.Command и формировать соответствующие команды.

Наконец, вероятно, Вы этот момент не вполне поняли, но можно в одном пакете передавать несколько команд. Примерно так

Код: plaintext
1.
2.
3.
4.
strCommand = "INSERT INTO tabMySQL (Field1, Field1, Field3) values (1,1,1) " + ;
	"INSERT INTO tabMySQL (Field1, Field1, Field3) values (2,2,2) " + ;
	"INSERT INTO tabMySQL (Field1, Field1, Field3) values (3,3,3) "
=SQLExec("номер соединения", strCommand)

Надо только уточнить, каким символом разделяются команды в среде MySQL. Будет ли достаточно пробела (как в приведенном примере) или надо что-то еще ставить. Например, точку с запятой или перевод строки

Кроме того, в данном варианте, как правило, есть ограничение на размер подобного пакета. Т.е. на количество символов в переменной strCommand. Обычно где-то в районе 8К, но опять же надо уточнять по документации драйвера

Примерно это и реализует настройка BatchUpdateCount, если Вы организуете взаимодействие с сервером через объект CursorAdapter. Т.е. Вы работаете с CursorAdapter как с обычной таблицей FoxPro, а он внутри себя сам сформирует нужные пакеты и пошлет их на сервер.

И наконец, если задача разовая, то стоит ли вообще заморачиваться оптимизиацией? 500 тысяч строк закачается относительно быстро. Не думаю, что будет дольше, чем минут 10..20 при самом худшем раскладе

PS: Можно пойти по пути создания командных файлов. Т.е. пользователь должен сформировать определенный файл и положить его в определенную директорию (пункт меню в приложении). Затем формируется командный файл и запускается через RUN. Но, опять же, если такое есть для MySQL.
...
Рейтинг: 0 / 0
01.02.2011, 20:05
    #37091772
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
ВладимирМ,

Дело в том что 500 000 записей по одной команде загонять в MySQL - длится сутки даже по localhost.
В общем то вы меня навели одну на мысль:
Делать наверно просто через SQLPREPARE() весь цикл операций по передаче.
А затем дать SQLEXEC() всего один раз в конце и будет как мне кажется быстрее. (но это только предположение)
Разница в скорости думаю будет существенной.
...
Рейтинг: 0 / 0
01.02.2011, 20:13
    #37091779
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33,

это может быть быстрее, но реально быстрее будет через load data.
...
Рейтинг: 0 / 0
01.02.2011, 23:35
    #37092015
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Питон33Дело в том что 500 000 записей по одной команде загонять в MySQL - длится сутки даже по localhost.
"Не верю" (с) Не может такое относительно небольшое количество записей столько времени обрабатываться. Что-то Вы не договариваете. Какие-то у Вас идут дополнительные обработки не связанные с закачкой данных на сервер.

Может, приведете пример кода, как Вы это делаете?

Питон33Делать наверно просто через SQLPREPARE() весь цикл операций по передаче.
А затем дать SQLEXEC() всего один раз в конце и будет как мне кажется быстрее. (но это только предположение)
Да какой там план выполнения у команды вставки одной записи! Откуда возьмется ускорение-то? Впрочем, может это какая фича именно MySQL?
...
Рейтинг: 0 / 0
01.02.2011, 23:37
    #37092020
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
tanglir,

Пример можно?
load data нету такой команды в фоксе.
...
Рейтинг: 0 / 0
01.02.2011, 23:48
    #37092036
Питон33
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
ВладимирМ"Не верю" (с) Не может такое относительно небольшое количество записей столько времени обрабатываться. Что-то Вы не договариваете. Какие-то у Вас идут дополнительные обработки не связанные с закачкой данных на сервер.
Поверьте это так. 500 000 записей, по одной записи обновляются в цикле командой MySQL UPDATE по уникальному ключу.
Процесс длится сутки.

ВладимирМДа какой там план выполнения у команды вставки одной записи! Откуда возьмется ускорение-то? Впрочем, может это какая фича именно MySQL?
Ускорение будет, так как выполняются все команды сразу, а не по отдельности SQLEXEC()
Каждый раз SQLEXEC() ожидает ответа от сервера, иными словами 500 000 раз тормозит.
SQLPREPARE() просто подготавливает для выполнения, а выполнение будет в самом конце по команде SQLEXEC().
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ??? / 25 сообщений из 62, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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