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

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

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

Ну вот теперь можно сказать один способ работает!
Строка подключения будет выглядеть так:
Driver=MySQL ODBC 3.51 Driver;SERVER=***;UID=***;PWD=***;DATABASE=***;PORT=3306;OPTION=67108864

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

а создать файловый DSN и прочитать его, как я выше писал, попробовал? Обратить внимание на то, что OPTION в данном случае - это ЧИСЛО, попробовал?
Нашёл!
Но вы ни за что не догадаетесь! :)
OPTION=67108864
Когда решение найдено найти на него ссылки гораздо проще Оказывается надо было искать по ключевому слову FLAG_MULTI_STATEMENTS. Например, есть ссылки здесь

http://www.sql.ru/forum/actualthread.aspx?tid=478429

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

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

1. Перечислены значения OPTION для строки соединения и что они обозначают
2. Показан пример закачки таблицы в MySQL. Причем начиная с создания ее структуры и кончая формированием пакета команд на вставку многих записей. Правда, там надо поставить ограничитель на размер формируемой строки, чтобы можно было использовать и для данного случая.

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

Там у него сложный пример, разбираться долго,
а тут мы понятно всё расписали.
Наверняка кому нибудь пригодится.
Спасибо.
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37106129
Berloga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучать PostgreSQL начал совсем недавно. Тоже встал вопрос об импорте данных из DBF на сервер SQL. Открыл для себя следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
postgres=# select regexp_split_to_table('-1%0.76%1%2',E'\\%')::numeric( 2 , 1 ) as id, 
regexp_split_to_table('first%%%last',E'\\%')::varchar( 4 ) as text, 
regexp_split_to_table('12.12.2010 12:45:23%13.12.2010 13:02:34%14.12.2010 12:59:04%15.12.2010
 13:02:45',E'\\%')::timestamp as time;
  id  | text |        time
------+------+---------------------
 - 1 . 0  | firs |  2010 - 12 - 12   12 : 45 : 23 
   0 . 8  |      |  2010 - 12 - 13   13 : 02 : 34 
   1 . 0  |      |  2010 - 12 - 14   12 : 59 : 04 
   2 . 0  | last |  2010 - 12 - 15   13 : 02 : 45 
( 4  rows)
Используя сей факт, пишем функцию.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
-- DROP FUNCTION add_testtable(text, text, text);

CREATE OR REPLACE FUNCTION add_testtable(IN c_id text, IN c_text text, IN c_time text, OUT result text)
  RETURNS text AS
$BODY$declare s char;
begin
    s=chr( 13 );
    result='';
    begin
        insert into testtable ("id","text","time")
        select regexp_split_to_table($ 1 ,E'\\'||s)::numeric( 2 , 1 ), 
        regexp_split_to_table($ 2 ,E'\\'||s)::varchar( 4 ), 
        regexp_split_to_table($ 3 ,E'\\'||s)::timestamp;
    exception
        when others then
            result = SQLSTATE || '. ' || SQLERRM ;
    end;
    return;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST  100 ;
На приложении формируем мемо-поля и вызываем эту функцию, параметрами которой являются ссылки на сформированные мемо-поля. Честно признаться, я не пробывал так передавать по 1 ГБ, но вряд ли вся информация с одной колонки таблицы DBF будет больше 1 ГБ.
Все вроде должно работать, кроме тех случаев когда поле типа DATETIME, DATE, TIME (FoxPro) пусты. Вот тут то возникла у меня загвоздка. Как простым методом пустую строку преобразовать в пустую дату?
Код: plaintext
1.
2.
3.
postgres=# select ' '::date;
ERROR:  invalid input syntax for type date: " "
СТРОКА  1 :select ' '::date;
                ^
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37106146
Berloga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Черт, что-то не особо вчитывался в заголовок темы. Тут же про MYSQL ))
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37106214
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BerlogaЧерт, что-то не особо вчитывался в заголовок темы. Тут же про MYSQL )) Ну ничего, откройте в этом форуме новый топик типа VFP2PostgreSQL и поделитесь решениями с программистами. Очень даже полезное дело.
...
Рейтинг: 0 / 0
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
    #37106255
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Berloga
> Все вроде должно работать, кроме тех случаев когда поле типа DATETIME, DATE, TIME (FoxPro) пусты. Вот тут то
> возникла у меня загвоздка. Как простым методом пустую строку преобразовать в пустую дату?


Скажу сразу, я не работаю с Postgree, но методы применяю одинаковые на других серверах.
Во первых у меня нет "пустой строки" подразумевающей дату. Я всегда такие строки заменяю на Null
И во вторых, я стараюсь не использовать "неявные" преобразования типов - в данном случае строк в дату, а всегда стараюсь
писать явный cast к нужному типу данных.
Из во-первых и во-вторых следует то что Null замечательно кастится к любому типу без ошибок, для отображения
пользователю в самом фокспро есть например
Код: plaintext
Set NullDisplay To [ ]
или функция Nvl для использования в
запросах, ну или функция coalesce на MSSQL и FB

Насчет простого метода, я бы порекомендовал сделать Update всех записей содержащих пустую строку на Null, и изменить тип
столбца на тип DATETIME. Это возможно повлечет за собой переделку приложения, но я считаю что это необходимый шаг
:)

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

Ну вот теперь можно сказать один способ работает!
Строка подключения будет выглядеть так:
Driver=MySQL ODBC 3.51 Driver;SERVER=***;UID=***;PWD=***;DATABASE=***;PORT=3306;OPTION=67108864

Параметр 67108864 означает что будет MYSQL_OPTION_MULTI_STATEMENTS_ON - выполнение сразу нескольких команд.
После этого подключения я успешно передал в MySQL сразу две команды разделённые ";"
и добавил из фокса сразу две записи.
Думаю это будет уже как минимум в два раза быстрее работать чем по одной записи!
Для тех кому интересна данная тема могу сообщить результаты эксперимента:
1. Оптимальный запрос на выполнение INSERT SQL: Рекомендую передавать в MySQL по 10000 записей одной командой, но не больше.
2. Скорость выполнения одной такой команды: Тестировалось без Мемо полей на сервере i5 - скорость составляет 0.2-0.8 сек, т.е. доли секунды! Зависит разумеется от количества передаваемых полей. Иными словами за один раз добавляется сразу 10000 записей в MySQL.
В общем я очень доволен найденным решением и скорость работы с сервером теперь на несколько порядков выше.
Всем удачи.
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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