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

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

XML?

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

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

я не работал с MySql и не знаю его возможностей для работы с XML, через XML я общаюсь с MSSQL и пример могу дать для MSSQL
Дайте пример тогда для MSSQL?
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37089862
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питон33КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Смысл в том чтобы передать таблицу на сервер не по отдельной записи, а сразу всю таблицу для последующих операций уже внутри сервера.
Как это сделать?Для начала неплохо бы выяснить а что, собственно, имеет MySQL для таких действий? Есть ли в нем возможность "одной командой" закачать таблицу?
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37089884
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питон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
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37090004
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37090170
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМАлексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
Так это не ко мне вопрос! Питон33 спрашивал как из VFP проделать такую операцию.
А если надо именно закачать данные из DBF на сервер, то Вы совершенно правы!
Я бы использовал SSIS пакет (если надо проделывать это регулярно) или OpenRowSet (если не нет). Сам VFP для этого не нужен.
С уважением, Алексей
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37091095
Питон33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KВладимирМАлексей, а почему не использовать закачку в MS SQL напрямую подключившись к нужной таблице? Ну, там через Linked Server или запросом через OpenRowSet()? Зачем нужен посредник в виде файла XML?
Так это не ко мне вопрос! Питон33 спрашивал как из VFP проделать такую операцию.
А если надо именно закачать данные из DBF на сервер, то Вы совершенно правы!
Я бы использовал SSIS пакет (если надо проделывать это регулярно) или OpenRowSet (если не нет). Сам VFP для этого не нужен.
С уважением, Алексей
Нужно именно из VFP!
К примеру, подготовить записи в программе VFP и передать их одним махом на сервер.
Теперь возникает второй вопрос:
Какой метод будет работать быстрее - через ODBC в цикле обновлять по одной записи,
или формируя громадный XML и потом пересылать его на сервер, да потом там ещё проделывать с ним операции?
В общем интересует скорость.
Какой же всё-таки из методов самый быстрый для 500 000 записей DBF.
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37091162
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питон33Aleksey-Kпропущено...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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