2013-04-09 4 views
1

Я пытаюсь подключиться к локальной базе данных MySQL с помощью SWI Prolog (с драйвером ODBC) и я получаю следующее сообщение об ошибкеSWI Prolog ODBC ошибка

?- [family]. 
% family compiled 0.00 sec, 264 bytes 
true. 

?- open_db. 
ERROR: ODBC: State S1090: [unixODBC][Driver Manager]Invalid string or buffer length 

Имя базы данных: prolog_test

Пролог Код (family.pl)

open_db :- 
    odbc_connect('mysql:dbname=prolog_test;host=localhost', _, 
       [ user('prologuser'), 
        password('prologpass'), 
        alias(localhost), 
        open(once) 
       ]). 

children(X) :- 
    odbc_query(localhost, 'SELECT (lemma) FROM tableName',X). 

Спасибо за помощь

+0

После реализации функции из @CapelliC (ниже) я смог узнать, что ODBC не настроен правильно на моем сервере. После [Ubuntu Post] (https://help.ubuntu.com/community/ODBC) и [этого сообщения] (http://www.1stbyte.com/2012/09/07/unixodbc-on-ubuntu-12 -04-broken-and-able-to-connect-error /) Я смог настроить соединение ODBC на моем сервере. – otternq

ответ

1

Следуйте инструкциям от here и here.

создать файл: /etc/odbc.ini

[ODBC Data Sources] 
odbcname  = MyODBC 3.51 Driver DSN 

[prologtest] 
Driver  = /usr/lib/odbc/libmyodbc.so 
Description = MyODBC 3.51 Driver DSN 
SERVER  = my.database.server.com 
PORT   = 
USER   = USER 
Password  = XXXXXX 
Database  = DBNAME 
OPTION  = 3 
SOCKET  = 

[Default] 
Driver  = /usr/local/lib/libmyodbc3.so 
Description = MyODBC 3.51 Driver DSN 
SERVER  = localhost 
PORT   = 
USER   = root 
Password  = 
Database  = test 
OPTION  = 3 
SOCKET  = 

На моей машине, libmyodbc.so находится в /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so

Изменен код Пролог к ​​(гораздо ближе к documentation)

1 open_wordnet :- 
    2   odbc_connect('prologtest', _, 
    3      [ user('prologuser'), 
    4      password('prologpass'), 
    5      alias(prologa), 
    6      open(once) 
    7      ]). 

Теперь я в состоянии сделать запросы к базе данных

1

я использую слабый эр альтернативной odbc_driver_connect, он хорошо работает:

myodbc_connect_db(Db, Uid, Pwd, Cn) :- 
    format(atom(S), 'driver=mysql;db=~w;uid=~w;pwd=~w', [Db, Uid, Pwd]), 
    odbc_driver_connect(S, Cn, [encoding(utf8)]). 

В зависимости от требований приложения, может быть преимуществом, что не требуется DSN.

+0

Спасибо за помощь, реализация описанной вами функции позволила мне найти ошибку: «ОШИБКА: ODBC: состояние IM002: [unixODBC] [Менеджер драйверов] Имя источника данных не найдено, а драйвер по умолчанию не указан», что привело меня к решение. – otternq

+0

Это нормально, если вы настроили драйвер mysql в файле /etc/odbcinst.ini. Например, http://www.kaffeetalk.de/how-to-setup-and-configure-mysql-with-unixodbc-under-ubuntu-14-04/. – Koryonik