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

Tim*_*m S 9 php ubuntu ms-access odbc mdbtools

我正在尝试使用MDBTools驱动程序从Access数据库读取以odbc_connect在Ubuntu 11.10上执行.使用DSN设置时,它工作正常/etc/odbc.ini.

以下是内容/etc/odbc.ini:

[logindb]
Description = Microsoft Access Try DB
Driver = MDBToolsODBC
Database = /home/folder1/TestDb.mdb
Servername = localhost
Run Code Online (Sandbox Code Playgroud)

odbc.ini引用中的Driver属性MDBToolsODBC,这里是我的odbc设置/etc/odbcinst.ini:

[MDBToolsODBC]
Description = MDB Tools ODBC
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage =
CPTimeout =
CPReuse =
Run Code Online (Sandbox Code Playgroud)

我的问题是,在使用时$conn = odbc_connect('logindb','','');,我必须使用数据库位置的硬编码值.理想情况下,我想指定odbc_connect使用无DSN连接的第一个参数,以便我的数据库文件可以是一个变量(将从不同的dbs读取).就像是:

if ($cond1) {
  $db = "/home/folder1/TestDb.mdb";
} else {
  $db = "/home/folder1/TestDb2.mdb";
}

$conn = odbc_connect("odbc:Driver={MDBToolsODBC};Dbq=$db",'','');
Run Code Online (Sandbox Code Playgroud)

我也尝试过没有odbc:前缀,但它不起作用.任何人都可以告诉我为什么指定DSN有效,但是当试图使用看起来相同属性的动态指定它时,它不起作用?我认为它与无DSN连接中第一个参数的参数和内容有关.一如既往,非常感谢任何帮助.

Har*_*hof 7

我认为它可能不会支持它.从实际驱动程序的源代码开始,您会看到它加载了需要检查的参数,检查它是否已被赋予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;
Run Code Online (Sandbox Code Playgroud)

然后在connectparams.c中验证时,ExtractDSN专门查找DSN =字符串

 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;
Run Code Online (Sandbox Code Playgroud)

LookupDSN查找inifiles或立即返回TRUE,具体取决于HAVE_SQLGETPRIVATEPROFILESTRING预编译器设置.

所以考虑到了

SetConnectString (params, szConnStrIn);
Run Code Online (Sandbox Code Playgroud)

仅适用于从之前的2个函数获得的数据,我认为它不支持DSN.只有正确的DSN = string或ini文件.