:: Visual Foxpro, Foxpro for DOS
Как узнать имя ODBC драйвера для команды SQLConnect ?
Kalmah
Автор

Сообщений: 50
Дата регистрации: 14.09.2011
Нужно соединиться с MySQL. Не догоняю как это сделать.
Как я понял с помощью команды SQLCONNECT([cConnectionName | cDataSourceName [, cUserID [, cPassword ]][, lShared]])
Долблюсь уже час не могу понять что писать в cConnectionName | cDataSourceName...
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Еще есть SQLStringConnect(). Изучите.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
Цитата:
cConnectionName
Определяет именованное подключение, созданное командой CREATE CONNECTION . При использовании CREATE CONNECTION или Проектировщика Подключений для создания именованного подключения, Вы можете конфигурировать это подключение, определяя имя источника данных, пользовательский ID и пароль. При использовании именованного подключения в SQLCONNECT( ) как cConnectionName , Вы можете передать значения, отличающиеся от дополнительных параметров именованного подключении cUserID и cPassword . Эти передаваемые значения используются вместо пользовательского ID и пароля в именованном подключении, указанном cConnectionName . Например, предположите, что Вы создаете именованное подключение myNamedConnection используя CREATE CONNECTION или Проектировщик Подключений и определяете значения myUserID и myPassword для именованного подключения. Для SQLCONNECT( ) , Вы можете определить myNamedConnection как cConnectionName и затем определите myAltUserID и myAltPassword как дополнительный пользовательский ID и пароль как в следующем коде:



SQLCONNECT("myNamedConnection", "myAltUserID", "myAltPassword")


Однако, если Вы создаете именованное подключение, используя строку подключения командой CREATE CONNECTION или Проектировщиком Подключения, или использовать именованное подключение в SQLCONNECT( ) , и попытайтесь передать параметры дополнительного пользовательского ID и пароля для SQLCONNECT( ) , то Visual FoxPro сгенерирует соответствующее сообщение. При создании нового разделяемого подключения, параметр cConnectionName ссылается на именованное подключение в контейнере текущей базы данных (DBC). При создании нового дескриптора подключения, основанного на существующем разделяемом подключении, параметр cConnectionName ссылается на предыдущее подключение, открытое в разделяемом режиме. Если Вы используете параметр cConnectionName без параметра lShared или с параметром lShared как Ложь (.F)., Вы будете всегда создавать новое подключение, которое не будет разделяемым. При использовании cConnectionName , если lShared является Истинным (.T). и именованное подключение является уже открытым в разделяемом режиме, то заданные имя пользователя и пароль должены соответствовать использованным ранее. Иначе, Visual FoxPro генерирует соответствующее сообщение.

cDataSourceName

Определяет имя источника данных как определено в вашем Odbc.ini файле. Вы можете также выбрать источник данных из Диалогового окна Select Connection or Data Source , которое появляется, когда Вы вызываете SQLCONNECT( ) без дополнительных параметров или только с параметром lShared .
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
descent52

Сообщений: 675
Откуда: Саров
Дата регистрации: 26.07.2007
str_podkl="Driver={SQL Server Native Client 10.0};Server=125.67.89.10;Database=RB_SAROV;UID=qwerty;PWD=trewq;"
pConnect = Sqlstringconnect(str_podkl)
SQLExec(pConnect,"select * from DOM","asd")
select asd
BROWSE



Исправлено 2 раз(а). Последнее : descent52, 22.11.13 09:59
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
MSSQL server и MySQL это совсем не одно и то же.
Названия установленных в системе ODBC драйверов можно посмотреть в апплете "ODBC Data Source Administrator" - там есть вкладка Drivers.
Запускается апплет из панели управления, или же, проще, через ввод в консоли его имени - odbcad32.exe. При этом для x64 систем нужно быть особенно внимательным, т.к. там имеется 2 версии утилиты - одна для x64 драйверов и DSN-ов (именно она и запускается по умолчанию из панели управления или штатной консоли), и одна для x86 (для фокса как раз она и актуальна). Для запуска конкретно 32-битной версии следует указать полный путь к ней, или же в консоли перейти в соответствующую папку - а лежит она в C:\Windows\SYSWOW64\ (ну буква диска и имя папки винды в теории могут быть и другими - главное что надо смотреть не в system32, а в SYSWOW64).
Формат строки подключения лучше всего узнать из документации к используемому драйверу - есть ресурс [url]www.connectionstrings.com[/url] где приведены разные варианты для разных серверов и драйверов - но это не самый точный и актуальный источник информации. Всё же документация к конкретному драйверу куда как более точна и подробна.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Kalmah
Автор

Сообщений: 50
Дата регистрации: 14.09.2011
В общем получилось у меня так :
Сначала запускаем odbcad32 Получаем окно
http://i59.fastpic.ru/big/2013/1122/dc/a65711e86a5b132d636a8ecc33baafdc.jpg
Потом жмем кнопку добавить. Получаем окно
http://i57.fastpic.ru/big/2013/1122/85/0e9c865f027d3954c2c67ad557391a85.jpg
и выбираем наш драйвер. Жмем готово Получаем окно.
http://i60.fastpic.ru/big/2013/1122/a4/34715dc9a901c5dc9ee8b4b0e194e7a4.jpg
Заполняю так как на картинке. Жмем тест тест проходит. Далее ок. Появляется еще один пользовательский DSN под именем MySQL56
http://i60.fastpic.ru/big/2013/1122/44/0aba2bf83b3aa168420ec59e9d58f344.jpg
После этого в фоксе SQLCONNECT('MySQL56') проходит (=1).
Хотя мне хотелось-бы не так, т.к. в этом случае наверное ? на каждого пользователя свой ODBC.

зы Не знаю как тут картинку нормально разместить. Уж как смог.



Исправлено 5 раз(а). Последнее : Kalmah, 22.11.13 17:29
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну да, так и создаётся DSN - правда к заголовку темы это не имеет прямого отношения SQLCONNECT не работает с "именем драйвера" - он работает либо с DSN, либо с объектом Connection в текущей фоксовой БД. А вот непосредственно с "именем драйвера" работает команда SQLStringConnect - там это имя фигурирует как часть "строки подключения". При этом нет надобности ни в создании DSN, ни в использовании фоксовой dbc...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Kalmah
Автор

Сообщений: 50
Дата регистрации: 14.09.2011
Направление куда копать вы дали. Спасибо !
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
dos32

Сообщений: 1017
Откуда: Ленинград
Дата регистрации: 15.01.2008
там в примерах есть где-то, как найти что есть в системе, так все-ж удлбне чем явно задавать, мелкие различие версий на клиентах значения иметь не будут.

на базе примера не особенно красиво на бегу тупо выдрав кусок и сделал примерно так, до исх пор так и работает, как и все временное :
#DEFINE ERROR_SUCCESS 0 && OK
#DEFINE SQL_FETCH_NEXT 1
#DEFINE SQL_NO_DATA 100
#DEFINE ERROR_ODBCFAIL "ERROR_ODBCFAIL"
LOCAL nODBCEnv,nRetVal,dsn,dsndesc,mdsn,mdesc,cMySqlName,aDrvrs,n1Time
DECLARE Short SQLDrivers IN ODBC32.dll ;
Integer henv, Integer fDirection, ;
String @ szDriverDesc, Integer cbDriverDescMax, Integer pcbDriverDesc, ;
String @ szDriverAttributes, Integer cbDrvrAttrMax, Integer pcbDrvrAttr
cMySqlName=""
* Get ODBC environment handle
nODBCEnv=VAL(SYS(3053))
* -- Possible error messages
* 527 "cannot load odbc library"
* 528 "odbc entry point missing"
* 182 "not enough memory"
IF INLIST(nODBCEnv,527,528,182)
ERROR " ошибка nODBCEnv - получение списка драйверов ODBC"
RETURN ERROR_ODBCFAIL
ENDIF
dsn=space(100)
dsndesc=space(100)
mdsn=0
mdesc=0
nRetVal = SQLDrivers(m.nODBCEnv,0,@dsn,100,@mdsn,@dsndesc,100,@mdesc)
DIMENSION aDrvrs[1,1]
aDrvrs[1] = ""
DO WHILE .T.
dsn=space(100)
dsndesc=space(100)
mdsn=0
mdesc=0
*SET STEP ON
* Return drivers
nRetVal = SQLDrivers(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,100,@mdesc)
IF "MySQL ODBC"$m.dsn
cMySqlName=ALLTRIM(m.dsn)
cMySqlName=STRTRAN(cMySqlName,CHR(0),"")
*EXIT && нашелся ...
ENDIF
DO CASE
CASE m.nRetVal = SQL_NO_DATA
nRetVal = ERROR_SUCCESS
EXIT
CASE m.nRetVal # ERROR_SUCCESS AND m.nRetVal # 1
EXIT
OTHERWISE
IF !EMPTY(aDrvrs[1])
DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,1]
ENDIF
dsn = ALLTRIM(m.dsn)
aDrvrs[ALEN(aDrvrs,1),1] = LEFT(m.dsn,LEN(m.dsn)-1)
ENDCASE
ENDDO
IF EMPTY(cMySqlName) &&тады страхуемся из сетапа
cMySqlName=setupread("MySqlDriverName")
ENDIF
IF EMPTY(cMySqlName)
ERROR "не удалось определить имя драйвера MySQL ни автоматом ни черезнастройки, установите его или если он есть в системе попробуйте происать его вручнут в настройке MySqlDriverName"
ENDIF
*?cMySqlName
RETURN cMySqlName

ну а потом на базе этого сделал класс, которы кидаю на формы, он в ините сразу и коннектится
sDrv=getmysqlodbcdrivername() && это то что выше функия
sCon="DRIVER="+sDrv+";DB="+oApp.baza+";SERVER="+oApp.server+";UID="+oApp.user+";PASSWORD="+oApp.pass+";PORT=3306;OPTION=16387;CHARSET=cp1251;"

ну и возможно там-же сразу пригодится
cCmd="set character_set_client='cp1251'"
SQLEXEC(nH,cCmd)
cCmd="set character_set_results='cp1251'"
SQLEXEC(nH,cCmd)
cCmd="set collation_connection='cp1251_general_ci'"
SQLEXEC(nH,cCmd)


итого на форму кидаю класс и тупо далее команды, класс при создании коннектится и кодовые строки задает, ну тут у меня по схеме когда каждая форма имеет отдельное соединение. у меня собственно конторский склад сейчас на mysql пашет уже года 3 в связке с инет-магазином.
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Kalmah
Автор

Сообщений: 50
Дата регистрации: 14.09.2011
Отдельное вам dos32 спасибочки за код ! Это то что я и искал !



Исправлено 1 раз(а). Последнее : Kalmah, 23.11.13 21:05
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я бы так не советовал делать - он просто перебирает драйвера и будет использовать "первый попавшийся" - более того, если в имени драйвера нету подстроки "MySQL ODBC" то он и вовсе ничего не найдёт.
Это ненадёжно, хотя и позволяет иногда обходится без настройки приложения на каждом рабочем месте. Я предпочитаю абсолютно чёткую и однозначную настройку (да, подобный код может дать полный список драйверов для выбора их не в системном апплете управления ODBC, а в собственно фоксовой форме) - без хитрых поисков


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
dos32

Сообщений: 1017
Откуда: Ленинград
Дата регистрации: 15.01.2008
ну собственно все так, код наспех сляпан из майкрософтового примера как я и сказал, причем модифицировался на бегу чисто настолько чтоб заработал, можно из него список брать, можно еще что-то, у меня он в итоге так и остался с возможностью принудительной перезаписи в сетапе если что, но поскольку на практике чаще всего у народа OBDC для мускула стоит одна версия или одной достаточно для всех приложений, то в итоге временное иногда приживается .
а сделать уже можно и наверное нужно красивше, у меня оно просто в своей конторе работает, поэтому когда есть много чего недоделанного более полезного, такое можно отложить пока не клюнет, благо заглушка есть. а так в реале ODBC от 3 до 5 версии все строку MySQL ODBC имели, а предложить своим дамам выбирать драйвер из списка мне показалось меньшим злом чем принять его единственность как нормальное явление, тем более по сути софт работал с дровами от 3 до 5 версии и пофиг какой в списке первым найдется , особых проблем с совместимость не было. хотя при перехода с 3 на 5е дрова что-то сделать пришлось, не то кодировки в ините класса задать, не то еще какой-то флаг в OPTION добавить, уже забыл, года 2 не видел как оно работает.
а вообще в примерах там вроде как подлиньше, там и DSNы перебираются, но мне они были неинтересны, просто достало что в конторе на части компов новые дрова ODBC появились, а на части еще те которые в дистрибут софтины вшиты, потому потратил ровно столько времени чтоб не вникая выдрать кусок из примера, даже не переписав, благо софт не на продажу а себе в работу.
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
*regfile = "registry.prg"
*regfile = "D:\vfp8\Samples\Classes\registry.prg"
SET PROCEDURE TO registry.prg ADDITIVE
oReg = CreateObject("ODBCReg")
DIMENSION aODBCData[1]
m.nErrNum = oReg.GetODBCDrvrs(@aODBCData,.T.)
FOR nI=1 TO ALEN(aODBCData,1)
?aODBCData[nI,1],aODBCData[nI,2]
NEXT


------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
descent52

Сообщений: 675
Откуда: Саров
Дата регистрации: 26.07.2007
Перминов Игорь, СУПЕР!!!



Исправлено 1 раз(а). Последнее : descent52, 27.11.13 14:47
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Перминов Игорь
*regfile = "registry.prg"
Вообще-то более правильно брать класс в HOME(1)+"\Ffc\registry.vcx" - а так - ну внутри себя он именно это и делает - те же самые АПИ функции и вызывает И да, там есть и перечислитель DSN-ов, не только драйверов...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
descent52

Сообщений: 675
Откуда: Саров
Дата регистрации: 26.07.2007
Нееее, ну ваще молодчик простаки Перминов Игорь! Красота!



Исправлено 3 раз(а). Последнее : descent52, 27.11.13 14:49
Ratings: 0 negative/0 positive
Re: Как узнать имя ODBC драйвера для команды SQLConnect ?
ViT-o-TiV

Сообщений: 15
Дата регистрации: 14.06.2005
Спасибо за примеры, как раз нужно было узнать какие ODBC драйверы установлены. Но мне нужно пойти ещё дальше, нужно найти драйвер "SQL Server" и использовать его последнюю версию, если установлено несколько. Сначала было подумал брать информацию из описания (в строке "DriverODBCVer"), но как оказалось там не достоверная информация, например в младшем драйвере стоит версия "10.0", в старшем "3.80".
Смотрел пример из "\Samples\Solution\WinAPI\regodbc.sct", но там тоже про версию ничего нет. Подскажет кто-нить?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 33 (Гостей: 33)

© 2000-2024 Fox Club 
Яндекс.Метрика