Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы VFP и mySQL / 25 сообщений из 25, страница 1 из 1
27.09.2007, 20:05
    #34832762
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Привет всем.
Сие для спецназа - боян, а остальному контингенту авось и поможет чем-то...
Недавно решил освоить сабжевую связку и наткнулся на серию неожиданностей и приколов, проблему выборки вопросительных знаков вместо кириллицы или кракозябров всяких. Ну и вообще. И для таких как я решил тут пару слов набросать о том и об этом.
Итак, серверную часть mySQL и к ней GUI-ную админку можно найти - здесь .
Серверную часть нужно ставить на сервер :) и при этом нужно обязательно добавить (заменить) в конфиг сервера следующее:
[client]default-character-set=cp1251[server]default-character-set=cp1251skip-character-set-client-handshakeА вот для клиентов нужен - MySQL Connector/ODBC 3.51 , его можно найти на том же сайте
Когда и то и другое инсталлировано, необходимо с помощью админки mySQL создать пользователя(ей) с определенными привилегиями и паролями, в тч указывается с какой базой работать и какие действия дозволено совершать.
Далее, я лично юзал программу под названием DBF2MySQL , т.к. базы у меня уже были и их надо было просто конвертануть на MySQL. Но не все здесь так просто - прога заточена под досовую версию баз, а у меня все базы - Visual FoxPro. Поэтому лично я быренько наваял программку для конвертации своих вижуал баз в формат FOXPLUS:
Код: 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.
CLOSE DATABASES ALL
* место, откуда возьмем оригинальные бд
lcPathTarget = GETDIR('','','Select Target Dir')
* и куда сложем сконверченные
lcPathDestination = GETDIR('','','Select Destination Dir')
IF EMPTY(m.lcPathTarget) OR EMPTY(m.lcPathDestination) OR m.lcPathTarget == m.lcPathDestination
   RETURN
ENDIF
lnNumOfFiles = ADIR(ArrFiles,m.lcPathTarget + "*.dbf")
IF m.lnNumOfFiles =  0 
   RETURN
ENDIF
CREATE CURSOR curConvFiles (Filename c ( 200 ),Path c ( 20 ))
APPEND FROM ARRAY ArrFiles
*REPLACE ALL Filename with m.lcPathTarget + RTRIM(FileName)
SELECT curConvFiles 
SCAN 
  USE (m.lcPathTarget + RTRIM(curConvFiles.Filename)) IN  0  ALIAS tmpdbf
  SELECT tmpdbf
  ERASE (m.lcPathDestination + RTRIM(curConvFiles.Filename))
  COPY TO (m.lcPathDestination + RTRIM(curConvFiles.Filename)) TYPE FOXPLUS as  1251 
  USE IN tmpdbf
ENDSCAN
SELECT curConvFiles
* прога DBF2MySQL умеет обрабатывать данные пакетно, поэтому создаю по ходу
* необходимый скрипт для нее
lsScript=''
SCAN 
  lsScript= lsScript + lcPathDestination + RTRIM(curConvFiles.Filename) + ', ';
 + LEFT(RTRIM(curConvFiles.Filename),AT('.',curConvFiles.Filename)- 1 ) + ', 1, 0, 1, 0' + CHR( 13 ) + CHR( 10 )
ENDSCAN
* скрипт сохраняю для дальнейшего юзания
ERASE script.scp
STRTOFILE(m.lsScript,'script.scp')
USE IN curConvFiles
Сконвертив бд, с помощью скрипта и DBF2MySQL я залил все свои данные на сервер MySQL.
Осталось последнее - работа с ними в VFP.
Тут есть два пути соединения клиента с сервером, (втч освещенные на страницах сего форума). Итак возьмем тот, что относительно несколько проще:
( источнег )
Код: 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.
36.
37.
38.
39.
40.
41.
gcDRIVER = "{MySQL ODBC 3.51 Driver}"
gcUID = "username" && имя пользователя
gcPASSWORD = "" && Пароль пользователя
gcPORT = "3306" && порт, он в mySQL по умолчанию такой
gcSERVER = "localhost" && это если все на одной машине, а если удаленно, то тут IP-адрес
gcDB = "TEST" && имя базы данных на сервере
gcDESC ="" && короткое описание соединения
gcOPTION = "3" && хз че такое, сам не использовал :)
gcSTMT = "" && хз че такое, сам не использовал :)
gcSOCKET = "" && хз че за сокет, сам не использовал :)

* Значения этих переменных предлагается брать из ини-файла, затем эти значения собирается в одну переменную
*gcODBC = "'+'DRIVER='+gcDRIVER+';UID='+gcUID+';STMT='+gcSTMT+';OPTION='+gcOPTION+';SOCKET='+gcSOCKET+';PORT='+gcPORT;
+';PASSWORD='+gcPASSWORD+';SERVER='+gcSERVER+';DB='+gcDB+';DESC='+gcDESC+'"'
* это полный оригинальный вариант, но мне хватило и основного

gcODBC = "'+'DRIVER='+gcDRIVER+';UID='+gcUID+';PORT='+gcPORT+';PASSWORD='+gcPASSWORD+';SERVER='+gcSERVER+';DB='+gcDB+'"'

* создание самого соединения с сервером и сохранение его хендла для дальнейшей работы
gnSoed = SQLSTRINGCONNECT(&gcODBC)

* нужно проверить, удалось ли соединиццо
IF gnSoedD <=  0 
    = MESSAGEBOX('С сервером соединиться не удалось',  16 , 'SQL Connect Error')
   * выход или че там как, я для примера ставлю
   CANCEL
endif

* ну и тестовую выборку из своей базы AuthLog делал так:
myCom = 'SELECT * FROM AuthLog'
nResult = sqlexec(m.gnSQLHandle , myCom, 'curResult')
* в курсор curResult складываю результат выборки
* а в переменной nResult  - удалась выборка вообще или нет

IF m.nResult #  1 
   MESSAGEBOX('Выборка не удалась - или базы нет или соединение отвалилось или хз че такое',  16 , 'SQL Error')
ELSE 
   *m.nResult =  1 
   BROWSE
   USE 
ENDIF

Второй способ соединения с сервером несколько труднее. Нужно сначала сохранить параметры соединения под каким-то названием и по нему потом подключаццо. В mySQL (как и в другом SQL-сервере) это делается с помощью ODBC, а конкретно с помощью команды
myodbc3i -a -su -t
Эту команду нужно давать в так называемой консоли или командной оболочке (cmd.exe в WinXP), а я давал в Total Comander-е. Запустиццо GUI, в котором нужно указать название соединения (его-то потом и используем), юзера, пароли, базу данных и все такое. Если на первой вкладке все правильно введено (юзер/пароль), то имя бд можно будет увидеть в соотв. комбо. Тут же можно и нужно протестить соединение кнопкой TEST, а нажав DETAILS можно будет лицезреть сообщение об ошибке, еси таковая возникнет. На второй вкладке надо бы было бы указать CHARSET как cp1251 - но будет ошибка из-за бага в mySQL (который можно обойти - об этом потом). Короче еси тест прошел гуд, то жмем ок и текст проги будет таким:
Код: 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.
lcDSNNAme='имя_указанного_в_ODBC_соединения'
m.lcPassword='' && пароль, хотя нах он тут нужен, если задается в ODBC я не знаю, сам создавал юзера без пароля
STORE SQLCONNECT(m.lcDSNNAme) TO m.lnSQLHandle
* по ходу в SQLCONNECT(m.lcDSNNAme) после запятой можно укать юзера, затем его пароль,
* было бы типа SQLCONNECT(m.lcDSNNAme,lcUID,lcPASSWORD)
IF m.lnSQLHandle <= 0 
   = MESSAGEBOX('С сервером соединиться не удалось',  16 , 'SQL Connect Error')
   * выход или че там как, я для примера ставлю
   CANCEL
ENDIF

* ну и тестовую выборку из своей базы AuthLog делал так:
myCom = 'SELECT * FROM AuthLog'
nResult = sqlexec(m.gnSQLHandle , myCom, 'curResult')
* в курсор curResult складываю результат выборки
* а в переменной nResult  - удалась выборка вообще или нет

IF m.nResult #  1 
   MESSAGEBOX('Выборка не удалась - или базы нет или соединение отвалилось или хз че такое',  16 , 'SQL Error')
ELSE 
   *m.nResult =  1 
   BROWSE
   USE 
ENDIF
Короче все работает, только вот выборка кириллицы хромала - вместо нее сначала были кракозябры. Это было из-за настроек сервера - у него по умолчанию используется латинский чарсет, а нада наш, cp1251. Т.е. в настройках сервера MySQL я заменил дефолные чарсеты на наши. Тогда в курсоре выборки стали приходить сплошные знаки вопросов, вместо текста кириллицы. Причем я заглянул в саму базу на сервере тоталом и увидел там свои тексты в нормальном 1251 виде. Проблема скрывается в одном баге_или_не_баге, неважно, короче когда фокса устанавливает соединение, то default-character-set становится latin1. Обходится это 3 путями:
1) нужно собрать MySQL с default-character-set=cp1251 (на сайте он выложен собранным под latin1)
2) при каждом соединении устанавливать default-character-set=cp1251, это настариваится в конфиге сервера MySQL в секции [server] строкой
#Command(s) that are executed for each new connection
init-connect=SET NAMES cp1251
3) а можно еще элегантнее поступить, прописав в конфиге сервера MySQL в секции [server]
skip-character-set-client-handshake
(собственно потому я и пишу об этом здесь) - способы 2 и 3 были почерпаны вообще из PhPClub-a

мною же был выбран последний способ...
...
Рейтинг: 0 / 0
27.09.2007, 20:44
    #34832832
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Может в FAQ по FoxPro поместить?
...
Рейтинг: 0 / 0
27.09.2007, 21:00
    #34832867
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
да я только за, если вопрос ко мне...
...
Рейтинг: 0 / 0
27.09.2007, 23:09
    #34833052
Декоратор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Слишком много буков. Не читал. :)
...
Рейтинг: 0 / 0
27.09.2007, 23:32
    #34833074
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
CTAC-KOда я только за, если вопрос ко мне...
Там есть кнопка "предложить FAQ"... Попробуйте предложить...

Хотя там кажется есть какие-то правила по офрмлению FAQ...
...
Рейтинг: 0 / 0
28.09.2007, 09:32
    #34833414
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Да, кстати, забыл совсем, если пытаться сделать все правильно, т.е. при создании ODBC соединения задать чарсет для сессии cp1251, то возникает такая вот ошибка:

[MySQL][ODBC 3.51 Driver]Can't initialize character set cp1251 (path: C:\mysql\\share\charsets\)
собственно она и есть тем багом в mySQL, который приходится обходить, прибегая к игнорированию согласования чарсета во время установки соединения (skip-character-set-client-handshake). Заметьте, в ошибке указан путь C:\mysql, хотя по умолчанию mysql устанавливается в совершенно иное место - папку Program Files, да и конечная папка именуеццо не просто mysql, но содержит еще и номер версии (у меня, например, это "MySQL Server 5.0"). Это не отмечая еще тот факт, что там почему-то указано два слэша в пути (mysql \\ share). Но даже если не обращать на это все внимания и спецом скопировать именно туда то, что ему, mysql-у нужно, т.е. папку share\charsets (сами чарсеты), как предлагалось на одном из форумов (на который я попал когда искал это сообщение об ошибке) это все равно ничего не дает! Ошибка остается. В том числе бесполезна и правка libmysql.dll с помошью HIEW или иного НЕХ-редактора (предлагалось заменить в теле dll все latin на cp1251).
...
Рейтинг: 0 / 0
28.09.2007, 10:50
    #34833687
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
отправил в фак :)
Эх, одного мне на этом форуме дико не хватает - это возможности отредактировать свою мессагу. Я там в тексте программы сделал ошибку и допустил несколько неточностей...
Код: plaintext
1.
2.
3.
4.
*у меня во втором тексте исходнега
gcODBC = "'+'DRIVER='+gcDRIVER+...
*а надо
gcODBC = "'DRIVER='+gcDRIVER+...
...
Рейтинг: 0 / 0
28.09.2007, 12:15
    #34834136
karly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Может еще и в Статьи на Фоксклубе?
...
Рейтинг: 0 / 0
15.10.2007, 12:15
    #34868506
IVT
IVT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Начинаю работать на связке VFP + MySQL
Возникла вышеобозначенная проблема с русскими буквами.

http://www.shop-script.ru/help/mysql5-invalid-cyrillic.htm
...
Рейтинг: 0 / 0
15.10.2007, 12:18
    #34868523
IVT
IVT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
IVTНачинаю работать на связке VFP + MySQL
Возникла вышеобозначенная проблема с русскими буквами.

http://www.shop-script.ru/help/mysql5-invalid-cyrillic.htm

Т.о. достаточно выполнить команду sqlexec(lnHandle, 'SET NAMES cp1251') и проблема решена

Конфигурацию MySQL-сервера менять не имею возможности, т.к. пользуюсь сторонним хостингом
...
Рейтинг: 0 / 0
15.10.2007, 12:20
    #34868537
IVT
IVT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Кстати проблемы с русскими буквами у меня не наблюдается при использовании драйвера "MySQL Connector/ODBC v5".
...
Рейтинг: 0 / 0
02.06.2008, 09:14
    #35348209
alexbog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
* это полный оригинальный вариант, но мне хватило и основного

gcODBC = 'DRIVER='+gcDRIVER+';UID='+gcUID+';PORT='+gcPORT+';PASSWORD='+gcPASSWORD+';SERVER='+gcSERVER+';DB='+gcDB

* создание самого соединения с сервером и сохранение его хендла для дальнейшей работы
gnSoed = SQLSTRINGCONNECT(&gcODBC)

Доброго времени суток.
в первой строчке я полагаю должно быть вот так, как у меня.
после второй строчки у меня выдает ошибку:
Date/datetime contains ilegal characters.

Может кто поможет: откуда это проблема?
...
Рейтинг: 0 / 0
02.06.2008, 09:29
    #35348228
alexbog80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
* нужно проверить, удалось ли соединиццо
IF gnSoedD <= 0
= MESSAGEBOX('С сервером соединиться не удалось', 16, 'SQL Connect Error')
* выход или че там как, я для примера ставлю
CANCEL
endif
*************************************************
лишняя D в переменной gnSoedD......
...
Рейтинг: 0 / 0
02.06.2008, 09:36
    #35348243
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
alexbogМожет кто поможет: откуда это проблема?
Проблема в макроподстановке. Ее тут не надо:
gnSoed = SQLSTRINGCONNECT( & gcODBC)
...
Рейтинг: 0 / 0
02.06.2008, 13:10
    #35348816
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
IVTНачинаю работать на связке VFP + MySQL
Возникла вышеобозначенная проблема с русскими буквами.

http://www.shop-script.ru/help/mysql5-invalid-cyrillic.htm
И чем вам так нравится MySQL? Почему не используете MS SQL Server 2005 Express ?
Я бы еще понял юниксоидов, которые в упор не видят MS, но у вас клиент на VFP !
В чем приемущества использования в качестве сервера базы данных MySQL перед SQL 2005 Express при работе в качестве клиента приложения на VFP ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
02.06.2008, 15:24
    #35349221
alexbog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Верно & была лишняя, сейчас при удачном конекте VFP вылет напроч, ну типа приносим извинения и все такое....
кто подскажет?????
...
Рейтинг: 0 / 0
02.06.2008, 15:40
    #35349292
DMITRY_PEREDISTY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
MS SQL - Очень неудобен.
То что пишется MySql в одну строку, на MS пишется страницей текста.
Одно преимущество это возможность написания процедур, но насколько мне известно, в последних версиях MySql это есть.
Вообще самая удобная база (на мой взгляд) это Cache Там есть процедуры и функции и даже классы. К сожалению Cache Intersystem жмоты и дают дистриб только за деньги.
Соответственно и сервер Cache не шибко найдешь, или надо самому поддержкой сервера заниматься.
А MySql - народный продукт всеми горячо любимый и поддерживаемый на всех серваках.
...
Рейтинг: 0 / 0
02.06.2008, 16:08
    #35349421
DMITRY_PEREDISTY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
А вот для клиентов нужен - MySQL Connector/ODBC 3.51 , его можно найти на том же сайте

Ссылка на этот фуфлыжный сайт, висит везде где только можно, на всех MySql-ных ресурсах.
Однако драйвер ODBC с него получить не удастся, требуется регистрация. При этом требуется почтовый адрес. Мой например d...@mail.ru не подходит.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
15.08.2009, 15:24
    #36145835
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Итого, через пару-тройку годков получаем несколько подредактированный код. Сам-то уже давно написал себе отдельный класс...

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
LOCAL lcDRIVER, lcUSER, lcPASSWORD, lcPORT, lcSERVER, lcDATABASE, lcOPTION, lcSTMT, lcINIFile

* глобально задаю переменную для хранения хэндла соединения, т.к.
* он понадобиццо по всей проге. в классе просто сунул в пропертю.
PUBLIC gnSQLCH

* пробуем взять значения из ini-файла, если удастся
* если файла нет - используем значения по-умолчанию
* если файл есть, но в нем все наcтройки пустые - напильнег в руки :)
IF _VFP.StartMode #  0 
   * Настройки только для готового приложения
   * Имя ini-файла исходя из того, что называеццо как и прога
   * и лежит соотвецтвенна рядом с нею жо
   lcINIFile = ADDBS(FULLPATH(CURDIR()))+PROGRAM() + '.ini'
ELSE 
   * в режиме разработки нада указать это имя ручками
   lcINIFile = ADDBS(FULLPATH(CURDIR()))+'myapp.ini'
ENDIF

* настройки я буду сразу "оборачивать" в "параметр=;"
* в классе это все пропертии + у всех есть _access, в котором сие "оборачивание"
* поэтому там только, например: this.DRIVER = ReadFromINI(m.lcINIFile,'SQL','DRIVER')
if file(m.lcINIFile)
   * сии настройки в ini-файле предполагаеццо что находяццо в секции [SQL]
   lcDRIVER = 'DRIVER='+ReadFromINI(m.lcINIFile,'SQL','DRIVER')+';'
   lcUSER = 'USER='+ReadFromINIm.lcINIFile,'SQL','USER')+';'
   lcPASSWORD= 'PASSWORD='+ReadFromINI(m.lcINIFile,'SQL','PASSWORD')+';'
   lcPORT = 'PORT='+ReadFromINIm.lcINIFile,'SQL','PORT')+';'
   lcSERVER = 'SERVER='+ReadFromINI(m.lcINIFile,'SQL',)+';'
   lcDATABASE = 'DATABASE='+ReadFromINI(m.lcINIFile,'SQL','SERVER')+';'
else
   lcDRIVER = "DRIVER=MySQL ODBC 3.51 Driver;" && имя ODBC-драйвера - хз откуда его узнать...
   lcUSER = "USER=username;" && имя пользователя
   lcPASSWORD= "PASSWORD=;" && Пароль пользователя
   lcPORT = "PORT=3306;" && порт, он в mySQL по умолчанию такой
   lcSERVER = "SERVER=localhost;" && это если все на одной машине, а если удаленно, то тут IP-адрес
   lcDATABASE = "DATABASE=TEST;" && имя базы данных на сервере
endif

* эти настройки я не выкладывал в ini, но это дело разраба
* "тонкие" настройки соединения флагами. ниже описано, также см.:
* http://dev.mysql.com/doc/refman/ 5 . 0 /en/connector-odbc-configuration-connection-parameters.html
lcOPTION = "OPTION=3;"
* настройки, передаваемые при инициации соединения. собственно тут 
* и порешим проблему кодировок
lcSTMT = "STMT=SET NAMES cp1251;"

* собственно пробуем конектиццо
gnSQLCH=SQLSTRINGCONNECT(m.lcDRIVER+m.lcUSER+m.lcPORT+m.lcPASSWORD+m.lcSERVER+m.lcDATABASE+m.lcOPTION+m.lcSTMT)

* теперь нужно проверить, удалось ли соединиццо
IF m.gnSQLCH <=  0 
    MESSAGEBOX('С сервером соединиться не удалось',  16 , 'SQL Connect Error')

   * далее, раз такое дело - выход или че там как
   * в классе я разместил это все в методе Init...
   RETURN .F.

endif

...
return

*************************************************
*** Процедура считывает значение из ini-файла ***
*************************************************
FUNCTION ReadFromINI
LPARAMETERS tcINIFile,tcSection,tcParameter

*** WinAPI-функция, считывающая из ini-файла
Declare GetPrivateProfileString IN Win32API;
 String cAppName, ; 
 String cKeyName, ;
 String cDefault, ;
 String @ cReturnedString, ;
 Long nSize, ;
 String cFileName 

LOCAL lcValue
lcValue = REPLICATE(CHR( 0 ), 255 )

GetPrivateProfileString(m.tcSection, m.tcParameter, "", @lcValue,  255 , m.tcINIFile)

CLEAR DLLS 'GetPrivateProfileString'

RETURN STRTRAN(m.lcValue,CHR( 0 ))

Описание флагов для OPTION:

20.1.4.2. Connector/ODBC Connection Parameters
You can specify the parameters in the following tables for Connector/ODBC when configuring a DSN. Users on Windows can use the Options and Advanced panels when configuring a DSN to set these parameters; see the table for information on which options relate to which fields and checkboxes. On Unix and Mac OS X, use the parameter name and value as the keyword/value pair in the DSN configuration. Alternatively, you can set these parameters within the InConnectionString argument in the SQLDriverConnect() call.
Parameter Default Value Comment
user ODBC The user name used to connect to MySQL.
uid ODBC Synonymous with user. Added in 3.51.16.
server localhost The host name of the MySQL server.
database The default database.
option 0 Options that specify how Connector/ODBC should work. See below.
port 3306 The TCP/IP port to use if server is not localhost.
initstmt Initial statement. A statement to execute when connecting to MySQL. In version 3.51 the parameter is called stmt. Note, the driver supports the initial statement being executed only at the time of the initial connection.
password The password for the user account on server.
pwd Synonymous with password. Added in 3.51.16.
socket
The Unix socket file or Windows named pipe to connect to if server is localhost.
sslca The path to a file with a list of trust SSL CAs. Added in 3.51.16.
sslcapath The path to a directory that contains trusted SSL CA certificates in PEM format. Added in 3.51.16.
sslcert The name of the SSL certificate file to use for establishing a secure connection. Added in 3.51.16.
sslcipher A list of allowable ciphers to use for SSL encryption. The cipher list has the same format as the openssl ciphers command Added in 3.51.16.
sslkey The name of the SSL key file to use for establishing a secure connection. Added in 3.51.16.
charset The character set to use for the connection. Added in 3.51.17.
sslverify If set to 1, the SSL certificate will be verified when used with the MySQL connection. If not set, then the default behaviour is to ignore SSL certificate verification.
readtimeout The timeout in seconds for attempts to read from the server. Each attempt uses this timeout value and there are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IP Close_Wait_Timeout value of 10 minutes. This option works only for TCP/IP connections, and only for Windows prior to MySQL 5.1.12. Corresponds to the MYSQL_OPT_READ_TIMEOUT option of the MySQL Client Library. This option was added in Connector/ODBC 3.51.27.
writetimeout The timeout in seconds for attempts to write to the server. Each attempt uses this timeout value and there are net_retry_count retries if necessary, so the total effective timeout value is net_retry_count times the option value. This option works only for TCP/IP connections, and only for Windows prior to MySQL 5.1.12. Corresponds to the MYSQL_OPT_WRITE_TIMEOUT option of the MySQL Client Library. This option was added in Connector/ODBC 3.51.27.
Note
The SSL configuration parameters can also be automatically loaded from a my.ini or my.cnf file.
The option argument is used to tell Connector/ODBC that the client isn't 100% ODBC compliant. On Windows, you normally select options by toggling the checkboxes in the connection screen, but you can also select them in the option argument. The following options are listed in the order in which they appear in the Connector/ODBC connect screen.
Value Flagname GUI Option Description
1 FLAG_FIELD_LENGTH Do not Optimize Column Width The client cannot handle that Connector/ODBC returns the real width of a column. This option was removed in 3.51.18.
2 FLAG_FOUND_ROWS Return Matching Rows The client cannot handle that MySQL returns the true value of affected rows. If this flag is set, MySQL returns “found rows” instead. You must have MySQL 3.21.14 or newer to get this to work.
4 FLAG_DEBUG Trace Driver Calls To myodbc.log Make a debug log in C:\myodbc.log on Windows, or /tmp/myodbc.log on Unix variants. This option was removed in Connector/ODBC 3.51.18.
8 FLAG_BIG_PACKETS Allow Big Results Do not set any packet limit for results and bind parameters. Without this option, parameter binding will be truncated to 255 characters.
16 FLAG_NO_PROMPT Do not Prompt Upon Connect Do not prompt for questions even if driver would like to prompt.
32 FLAG_DYNAMIC_CURSOR Enable Dynamic Cursor Enable or disable the dynamic cursor support.
64 FLAG_NO_SCHEMA Ignore # in Table Name Ignore use of database name in db_name.tbl_name.col_name.
128 FLAG_NO_DEFAULT_CURSOR User Manager Cursors Force use of ODBC manager cursors (experimental).
256 FLAG_NO_LOCALE Do not Use Set Locale Disable the use of extended fetch (experimental).
512 FLAG_PAD_SPACE Pad Char To Full Length Pad CHAR columns to full column length.
1024 FLAG_FULL_COLUMN_NAMES Return Table Names for SQLDescribeCol SQLDescribeCol() returns fully qualified column names.
2048 FLAG_COMPRESSED_PROTO Use Compressed Protocol Use the compressed client/server protocol.
4096 FLAG_IGNORE_SPACE Ignore Space After Function Names Tell server to ignore space after function name and before “(” (needed by PowerBuilder). This makes all function names keywords.
8192 FLAG_NAMED_PIPE Force Use of Named Pipes Connect with named pipes to a mysqld server running on NT.

16384 FLAG_NO_BIGINT Change BIGINT Columns to Int Change BIGINT columns to INT columns (some applications cannot handle BIGINT).

32768 FLAG_NO_CATALOG No Catalog Forces results from the catalog functions, such as SQLTables, to always return NULL and the driver to report that catalogs are not supported.
65536 FLAG_USE_MYCNF Read Options From my.cnf Read parameters from the [client] and [odbc] groups from my.cnf.
131072 FLAG_SAFE Safe Add some extra safety checks.
262144 FLAG_NO_TRANSACTIONS Disable transactions Disable transactions.
524288 FLAG_LOG_QUERY Save queries to myodbc.sql Enable query logging to c:\myodbc.sql(/tmp/myodbc.sql) file. (Enabled only in debug mode.)
1048576 FLAG_NO_CACHE Do not Cache Result (forward only cursors) Do not cache the results locally in the driver, instead read from server (mysql_use_result()). This works only for forward-only cursors. This option is very important in dealing with large tables when you do not want the driver to cache the entire result set.
2097152 FLAG_FORWARD_CURSOR Force Use Of Forward Only Cursors Force the use of Forward-only cursor type. In case of applications setting the default static/dynamic cursor type, and one wants the driver to use noncache result sets, then this option ensures the forward-only cursor behavior.
4194304 FLAG_AUTO_RECONNECT Enable auto-reconnect. Enables auto-reconnection functionality. You should not use this option with transactions, since a auto reconnection during a incomplete transaction may cause corruption. Note that an auto-reconnected connection will not inherit the same settings and environment as the original. This option was added in Connector/ODBC 3.51.13.
8388608 FLAG_AUTO_IS_NULL Flag Auto Is Null When FLAG_AUTO_IS_NULL is set, the driver does not change the default value of sql_auto_is_null, leaving it at 1, so you get the MySQL default, not the SQL standard behavior.
When FLAG_AUTO_IS_NULL is not set, the driver changes the default value of SQL_AUTO_IS_NULL to 0 after connecting, so you get the SQL standard, not the MySQL default behaviour.
Thus, omitting the flag disables the compatibility option and forces SQL standard behaviour.
See IS NULL. This option was added in Connector/ODBC 3.51.13.
16777216 FLAG_ZERO_DATE_TO_MIN Flag Zero Date to Min Translates zero dates (XXXX-00-00) into the minimum date values supported by ODBC, XXXX-01-01. This resolves an issue where some statements will not work because the date returned and the minimum ODBC date value are incompatible. This option was added in Connector/ODBC 3.51.17.
33554432 FLAG_MIN_DATE_TO_ZERO Flag Min Date to Zero Translates the minimum ODBC date value (XXXX-01-01) to the zero date format supported by MySQL (XXXX-00-00). This resolves an issue where some statements will not work because the date returned and the minimum ODBC date value are incompatible. This option was added in Connector/ODBC 3.51.17.
67108864 FLAG_MULTI_STATEMENTS Allow multiple statements Enables support for batched statements. This option was added in Connector/ODBC 3.51.18.
134217728 FLAG_COLUMN_SIZE_S32 Limit column size to 32-bit value Limits the column size to a signed 32-bit value to prevent problems with larger column sizes in applications that do not support them. This option is automatically enabled when working with ADO applications. This option was added in Connector/ODBC 3.51.22.
268435456 FLAG_NO_BINARY_RESULT Always handle binary function results as character data When set this option disables charset 63 for columns with an empty org_table. This option was added in Connector/ODBC 3.51.26.
To select multiple options, add together their values. For example, setting option to 12 (4+8) gives you debugging without packet limits.
The following table shows some recommended option values for various configurations.
Configuration Option Value
Microsoft Access, Visual Basic 3
Driver trace generation (Debug mode) 4
Microsoft Access (with improved DELETE queries) 35
Large tables with too many rows 2049
Sybase PowerBuilder 135168
Query log generation (Debug mode) 524288
Generate driver trace as well as query log (Debug mode) 524292
Large tables with no-cache results 3145731

Для конвертирования таблиц dbf в бд на mysql из visual foxpro позже я тоже написал себе такую прогу:
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
* возможно не все переменные перечислил - напильнег
LOCAL lcPathTarget, lnNumOfFiles, lcCreateStr, lcAI, lcMemoFieldz, lnFCount, lnF, lcDBName, lcSQLCommand
LOCAL ARRAY ArrFiles[ 1 ], arrFields[ 1 ], arrFvalue[ 1 ]

lcPathTarget = GETDIR('','','Укажите папку с таблицами')
IF EMPTY(m.lcPathTarget)
   MESSAGEBOX("Не задан путь к конвертируемым таблицам!")
   RETURN
ENDIF
* сколько таблиц (файлов)
lnNumOfFiles = ADIR(ArrFiles,m.lcPathTarget + "*.dbf")
IF m.lnNumOfFiles =  0 
   MESSAGEBOX("В заданной папке не найдено ни одной таблицы!")
   RETURN
ENDIF
* в курсоре curConvFiles складём список таблиц для аплоада  в мускул
CREATE CURSOR curConvFiles (Filename c( 100 ), Marked l)
APPEND FROM ARRAY ArrFiles
RELEASE ArrFiles

SELECT curConvFiles
SCAN FOR Marked
  * откроем очередную таблицу под ником tmpdbf
  USE (m.lcPathTarget + RTRIM(curConvFiles.Filename)) IN  0  ALIAS tmpdbf
  SELECT tmpdbf
  * сколько у таблицы полей?
lnFCount = AFIELDS(arrFields)

* структура получаемого массива
* arrFields(m.lnF, 1 ) fname
* arrFields(m.lnF, 2 ) ftype
* arrFields(m.lnF, 3 ) fwidth
* arrFields(m.lnF, 4 ) fdecimals
* arrFields(m.lnF, 6 ) Logical BIN or not BIN
* arrFields(m.lnF, 18 ) AI step

* строка создания текущей таблицы
lcCreateStr = ''
* AutoIncrement , подразумаеццо Artificial Intelligence :)
lcAI = ''
* мемо-поля
lcMemoFieldz = '0'

* если не находим в структуре таблицы поля с AI то всенеприменно его создадим
IF ASCAN(arrFields, 1 , 1 ,m.lnFCount, 18 )= 0 
   lcCreateStr = "RECID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL"
ENDIF

* сканим поля под одному
FOR lnF =  1  TO m.lnFCount
   field_name = arrFields(m.lnF, 1 )
   field_type  = arrFields(m.lnF, 2 )
   field_len = arrFields(m.lnF, 3 )
   field_dec = arrFields(m.lnF, 4 )
   field_nocp = arrFields(m.lnF, 6 )
   field_next = arrFields(m.lnF, 17 )
   field_step = arrFields(m.lnF, 18 )

   * разделяем запятой каждое обписываемое поле
   IF !EMPTY(m.lcCreateStr)
      lcCreateStr = lcCreateStr + ", "
   ENDIF

   * описалово создания соотв. поля на мускуле по типу в вфп.
   * стоит заметить, что типа Logical у мускула нет, даже если юзать BOOLEAN
   * это так или иначе числовое поле tinyint( 1 ), где  0 -false, a  1 -true
   * так что придеццо причесывать свой код или если писать с нуля, то учитывать это
   * кстати, в вфп в объекте checkbox по-умолчанию используеццо именно  0 / 1 , а не .F./.T.
   DO CASE
      CASE field_type = "L"
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " TINYINT(1) UNSIGNED NOT NULL DEFAULT 0"
*           lcCreateStr = lcCreateStr + RTRIM(field_name) + " BOOLEAN UNSIGNED NOT NULL DEFAULT 0"

     * для мемо-полей я в общем случае использую MEDIUMBLOB т.к. заранее неизвестно
     * что в оригинале там храниццо - только текст или binary data
     * если известно что там текст, то вместо MEDIUMBLOB можно юзать MEDIUMTEXT
      CASE field_type = "M"
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " MEDIUMBLOB DEFAULT NULL"
           lcMemoFieldz = m.lcMemoFieldz + IIF(EMPTY(m.lcMemoFieldz),'',',') + TRANSFORM(RECNO())

      CASE field_type = "N"
        IF field_len <=  2  && Для нумериков типа  0 - 9 ,  0 - 99 
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " TINYINT(2) ZEROFILL NOT NULL DEFAULT 0"
        ELSE
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " NUMERIC(" + TRANSFORM(field_len) +"," +  TRANSFORM(field_dec) + ") NOT NULL DEFAULT 0"
        ENDIF

      CASE field_type = "D"
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " DATE DEFAULT NULL"

      CASE field_type = "T"
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " DATETIME DEFAULT NULL"

      CASE field_type = "I"
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " INTEGER UNSIGNED NOT NULL DEFAULT 0"
           IF field_step# 0 
              lcAI = "MODIFY COLUMN " + RTRIM(field_name) + " INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, AUTO_INCREMENT = " + TRANSFORM(field_next)
           ENDIF

      CASE field_type = "W" && BLOB
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " BLOB DEFAULT NULL"

      CASE field_type = "B" && DOUBLE
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " DOUBLE(" + TRANSFORM(field_len) +"," +  TRANSFORM(field_dec) + ") NOT NULL DEFAULT 0"
      
      CASE field_type = "F" && FLOAT
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " FLOAT(" + TRANSFORM(field_len) +"," +  TRANSFORM(field_dec) + ") NOT NULL DEFAULT 0"

      CASE field_type = "C" AND field_len= 1 
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " CHAR(1" + IIF(field_nocp," BINARY","") + ") NOT NULL DEFAULT ''"

      CASE field_type = "V" OR field_type = "C" AND field_len> 1  && VARCHAR/VARCHAR BINARY
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " VARCHAR(" + TRANSFORM(field_len) + IIF(field_nocp," BINARY","") + ") NOT NULL DEFAULT ''"

      CASE field_type = "Y" && CURRENCY
           lcCreateStr = lcCreateStr + RTRIM(field_name) + " DOUBLE(20,4) NOT NULL DEFAULT 0"
      
      *CASE field_type = "G" && GENERAL
      *CASE field_type = "Q" && VARBINARY
      OTHERWISE 
           MESSAGEBOX("Не определен перевод для данных типа:" + field_type)
   ENDCASE 
ENDFOR

* теперь узнаем как же величать создаваемую таблицу
lcDBName = LEFT(curConvFiles.Filename, AT(".DBF", curConvFiles.Filename)- 1 )

* добавим в начало команду убийства таблицы на мускуле, вдруг она уже существует?
m.lcSQLCommand = "DROP TABLE IF EXISTS " + m.lcDBName
IF NOT m.goSQL.Exec()
   RETURN .F.
ENDIF

* теперь добавим команду создания таблицы на мускуле
m.lcSQLCommand = "CREATE TABLE " + m.lcDBName + " ("+ m.lcCreateStr + ") "

* и отправим все на сервак
IF SQLExec(m.gnSQLCH,m.lcSQLCommand)<= 0 
   RETURN .F.
ENDIF

* Теперь, когда таблица на мускуле создана, заполняем ее существующими данными
SELECT tmpdbf
lnFCount = FCOUNT()
DIMENSION arrFvalue(RECCOUNT(),m.lnFCount)
SCAN
   lcPart1 = ''
   lcPart2 = ''
   FOR lnF =  1  TO m.lnFCount
       lcPart1 = lcPart1 + RTRIM(FIELD(m.lnF)) + IIF(m.lnF = m.lnFCount,"",",")
       lcFName = FIELD(m.lnF)
       arrFValue(RECNO(),m.lnF) = &lcFname
       lcFType = VARTYPE(&lcFname)
       DO CASE
          * заменяем пустые даты на .NULL.
          CASE (m.lcFType = "D" OR m.lcFType = "T") AND EMPTY(arrFValue(RECNO(),m.lnF))
              lcPart2 = lcPart2 + "NULL"
          * в логических полях ставим  0 / 1 
          CASE m.lcFType = "L"
              lcPart2 = lcPart2 + IIF(arrFValue(RECNO(),m.lnF),"'1'","'0'")
          * в чарполях обрезаем пробелы справа
          CASE m.lcFType = "C" AND NOT ISNULL(arrFValue(RECNO(),m.lnF)) AND NOT INLIST(m.lnF,&lcMemoFieldz)
              arrFValue(RECNO(),m.lnF) = ALLTRIM(arrFValue(RECNO(),m.lnF))
              lcPart2 = lcPart2 + "?m.arrFValue("+TRANSFORM(RECNO())+','+TRANSFORM(m.lnF)+")"
          OTHERWISE 
              lcPart2 = lcPart2 + "?m.arrFValue("+TRANSFORM(RECNO())+','+TRANSFORM(m.lnF)+")"
       ENDCASE
       * добавляем аццкую запятую фконце 
       lcPart2 = lcPart2 + IIF(m.lnF = m.lnFCount,"",",")
   ENDFOR

   * собираем большую команду для отправки на сервеур мускулеаукса :)
   * в принципе можно отправлять построчно, т.е. прямо здесь, вместо собирания
   * в одну кучу. особенно это касается больших таблиц. у меня были небольшими
   * поэтому быстрее так
   m.lcSQLCommand = m.lcSQLCommand+;
    "INSERT INTO "+ m.lcDBName + " (" + m.lcPart1 + ") VALUES (" + m.lcPart2 + ");"
ENDSCAN
USE &&IN tmpdbf
* собственно отправляем команду на мускул
IF NOT EMPTY(m.lcSQLCommand) AND SQLExec(m.gnSQLCH,m.lcSQLCommand)< 0 
   messagebox("Ошибка исполнения SQL-команды", 16 ,"Error")
   RETURN .F.
ENDIF
IF NOT EMPTY(m.lcAI)
   m.lcSQLCommand = "ALTER TABLE "+ m.lcDBName + " " + m.lcAI
   IF NOT m.goSQL.Exec()
	  RETURN .F.
   ENDIF
ENDIF
ENDSCAN
ERASE "dbstru.dbf"
MESSAGEBOX("Готово!")
...
Рейтинг: 0 / 0
15.08.2009, 20:16
    #36145975
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
CTAC-KO,
Не могу сказать ничего дурного о собственно содержании статьи, _но_описание_всех_опций_одбц_драйвера_здесь_к_чему??!
И, кстати, если это всё-таки дойдёт до ФАКа, то можно туда ещё внести, что 5 версия одбц-драйвера может уваливать фокс при попытке использования русской кодировки (1251).
ЗЫ. В части insert into - можно экспортировать *.dbf в *.csv через <copy to ... type csv> и лить csv-шки на сервер через load data infile - будет в разы быстрее (особенно для больших таблиц), единственная проблема - это символьные поля с двойными кавычками. Ну, а для таких файлов есть <copy to ... delimited with ... delimiter ...>
...
Рейтинг: 0 / 0
15.08.2009, 23:24
    #36146072
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
Описание опций к тому, что тогда я вообще не знал че это, а потом задался вопросом: а где об этом вообще можно узнать конкретно и настроил как мне надо, как то: включил себе multiple statements, compressed protocol и тд. Между прочим потратил немало времени чтобы найти, на сайте мускула поиск вообще вредный какой-то :). Ну а чтобы не отвлекаццо переходом на др. страницу залил прям сюда... выглядит не особо хорошо, но инфа доступна.
что до выливания файлами - с этим я согласен. сам пока не дошел, т.к. уже и не надо, ну а кто смогёт - напильнег рулит :)
...
Рейтинг: 0 / 0
15.08.2009, 23:51
    #36146086
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
как обычно все не без ошибок, т.к. фактически писал код здесь. конвертирования не произойдет :)
у меня там форма, в которой в грид выводиццо список найденных таблиц и там юзер может отметить какие из таблиц конвертировать. метка - это поле Marked, становиццо .T. Если нада тупо все сконвертить, то можно добавить replace all marked with .T.:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR curConvFiles (Filename c( 100 ), Marked l)
APPEND FROM ARRAY ArrFiles
RELEASE ArrFiles
*тут у меня шел показ формы в которой де нада ставился Т в Marked
*т.к. формы нет - отмечаем для конверсии :) насильно все записи
replace all marked with .T.
SELECT curConvFiles
SCAN FOR Marked
или просто убрать условие FOR Marked из SCAN, ну или малевать форму...
...
Рейтинг: 0 / 0
13.04.2010, 10:19
    #36575647
Solaris_Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
DMITRY_PEREDISTY,

Если разуешь глаза, увидишь строку " No thanks, just take me to the downloads!"
...
Рейтинг: 0 / 0
13.04.2010, 10:38
    #36575691
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
DMITRY_PEREDISTYMS SQL - Очень неудобен.
То что пишется MySql в одну строку, на MS пишется страницей текста.

Пример, если можно.
С уважением, Алексей
...
Рейтинг: 0 / 0
14.04.2010, 23:03
    #36579511
FAM
FAM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемы VFP и mySQL
CTAC-KO,

хорошую тему опубликовал. Конечно многим пригодится.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблемы VFP и mySQL / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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