我试图从Access数据库读取使用MDBTools驱动程序执行Ubuntu 11.10上的odbc_connect
。 在/etc/odbc.ini
使用DSN设置时,它工作正常。
以下是/etc/odbc.ini
的内容:
[logindb] Description = Microsoft Access Try DB Driver = MDBToolsODBC Database = /home/folder1/TestDb.mdb Servername = localhost
odbc.ini
的Driver属性引用了MDBToolsODBC
,所以,这里是我在/etc/odbcinst.ini
odbc设置:
[MDBToolsODBC] Description = MDB Tools ODBC Driver = /usr/lib/libmdbodbc.so.0 Setup = FileUsage = CPTimeout = CPReuse =
我的问题是,当使用$conn = odbc_connect('logindb','','');
,我必须使用数据库位置的硬编码值。 理想情况下,我想使用无DSN连接来指定odbc_connect
的第一个参数,以便我的数据库文件可以是一个variables(将从不同的dbs中读取)。 就像是:
if ($cond1) { $db = "/home/folder1/TestDb.mdb"; } else { $db = "/home/folder1/TestDb2.mdb"; } $conn = odbc_connect("odbc:Driver={MDBToolsODBC};Dbq=$db",'','');
我也试过没有odbc:前缀,但没有奏效。 任何人都可以告诉我为什么指定DSN的作品,但是当试图使用看起来像相同的属性来指定它,它不起作用? 我认为这与DSN-less连接中的第一个参数的参数和内容有关。 一如既往,任何帮助,非常感谢。
我认为它可能不支持它。 从实际的驱动程序的源代码,你会发现它加载它需要检查的参数,检查它是否已经给了一个DNS字符串,接下来检查ini文件,如果没有错误,它设置参数。
从odbc.c最新的mdb-tools(mdbtools-0.6pre1)
SQLRETURN SQL_API SQLDriverConnect( SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR FAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLCHAR FAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT FAR *pcbConnStrOut, SQLUSMALLINT fDriverCompletion) { SQLCHAR FAR* dsn = NULL; SQLCHAR FAR* database = NULL; ConnectParams* params; SQLRETURN ret; TRACE("DriverConnect"); strcpy (lastError, ""); params = ((ODBCConnection*) hdbc)->params; if (!(dsn = ExtractDSN (params, szConnStrIn))) { LogError ("Could not find DSN in connect string"); return SQL_ERROR; } else if (!LookupDSN (params, dsn)) { LogError ("Could not find DSN in odbc.ini"); return SQL_ERROR; } else { SetConnectString (params, szConnStrIn); if (!(database = GetConnectParam (params, "Database"))) { LogError ("Could not find Database parameter"); return SQL_ERROR; } } ret = do_connect (hdbc, database); return ret;
那么当你在connectparams.c中验证的时候,ExtractDSN专门查找DSN = string
gchar* ExtractDSN (ConnectParams* params, const gchar* connectString) { char *p, *q, *s; if (!params) return NULL; /* * Position ourselves to the beginning of "DSN" */ p = strstr (connectString, "DSN"); if (!p) return NULL; /* * Position ourselves to the "=" */ q = strchr (p, '='); if (!q) return NULL;
LookupDSN查找inifiles或立即返回TRUE,具体取决于HAVE_SQLGETPRIVATEPROFILESTRING预编译器设置。
所以给了那个
SetConnectString (params, szConnStrIn);
只适用于从前两个函数获得的数据,我认为它不支持DSN-less。 只有一个正确的DSN =字符串或ini文件。
它在0.7.1中被支持。 你可以从github获得它:
https://github.com/brianb/mdbtools
关于连接字符串,这适用于我:
"Driver=Microsoft Access Driver (*.mdb);DBQ=///file.mdb;UID=;PWD=;"
$driver = "MDBTools"; -- Driver name from /etc/odbcinst.ini $dbName = "/path/to/database.mdb"; -- Full path of your MDB file $db = new PDO("odbc:Driver=$driver;DBQ=$dbName", "", "");