使用MDBTools驱动程序与PHP ODBC无DSN连接

我试图从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", "", "");