Monday, June 2, 2014

[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect) - Ubuntu

The link to download SQLanywhere is here: http://www.sybase.com/detail?id=1087327

To install it, you need to unzip the file and run "./setup" in the top level directory in the unzipped folder.

I also installed:
https://code.google.com/p/pyodbc/ (use the .zip file on the left)
http://onefinepub.com/2014/03/05/installing-unixodbc-2-3-2-higher-ubuntu-12-04-lts/

The first error message I received was:
sqlanydb.InterfaceError: Could not load dbcapi.  Tried: dbcapi.dll,libdbcapi_r.so,libdbcapi_r.dylib
Exception AttributeError: "'Root' object has no attribute 'api'" in <bound method Root.__del__ of <sqlanydb.Root object at 0x3061150>> ignored

This error is resolved by creating a file called "/etc/ld.so.conf.d/sqlanywhere.conf" and adding a line with "/opt/sqlanywhere12/lib64". Then you will need to run ldconfig -v.

The error message in the title occurred on Ubuntu because unixODBC was unable to find all of the libraries it needed to run.

This helped to find the issue: http://blogs.msdn.com/b/dataaccesstechnologies/archive/2014/01/22/sqlallochandle-on-sql-handle-henv-from-linux-sqlncli-driver.aspx

strace -t -f -o trace_out.txt isql -v <DSN>< USERNAME> <PASSWORD>

It will show there are a bunch of missing files. The issue was resolved when isql was run from the /opt/sqlanywhere12/bin64 directory. This indicated that it's not looking in the right place for the library files. Run the following: export LD_LIBRARY_PATH='/opt/sqlanywhere12/lib64'

Not having the environmental variable above will also cause "sqlanydb.InterfaceError: dbcapi version 1 required." if you're using python's sqlanydb library.

It will give a "file not found" error if you try using bin32/lib32 files on a 64 bit system. Make sure you use the bin64/lib64 files in the "Driver=" fild in your /etc/odbc.ini file (if you're using a 64 bit system)!

Now you will receive an error saying "Parse error: DSN does not exist". You need to add an ODBC_INI environmental variable to where your DSNs are defined. I ran the following: export ODBC_INI='/etc/odbc.ini'

To make those variables we exported work system-wide and continue to work even after we log out:

  1. sudo nano /etc/environment
  2. Add:
    ODBC_INI='/etc/odbc.ini'
    LD_LIBRARY_PATH='/opt/sqlanywhere12/lib64'

These articles were helpful:
https://hynek.me/articles/twisted-sybase/
https://hynek.me/articles/a-short-summary-on-sybase-sql-anywhere-python/

No comments:

Post a Comment