php - 使用 MDBTools 驱动程序与 PHP ODBC 进行无 DSN 连接

标签 php ms-access ubuntu odbc mdbtools

我正在尝试使用 MDBTools 从 Access 数据库中读取数据在 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 的第一个参数,以便我的数据库文件可以是一个变量(将从不同的数据库读取)。像这样的东西:

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

$conn = odbc_connect("odbc:Driver={MDBToolsODBC};Dbq=$db",'','');

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

最佳答案

我觉得可能不支持。从实际驱动程序的源代码中,您会看到它加载了需要检查的参数,检查是否已为其提供 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=字符串

 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 查找 ini 文件或立即返回 TRUE,具体取决于 HAVE_SQLGETPRIVATEPROFILESTRING 预编译器设置。

鉴于此

SetConnectString (params, szConnStrIn);

仅适用于从前两个函数获得的数据,我认为它不支持 DSN-less。只有正确的 DSN= 字符串或 ini 文件。

关于php - 使用 MDBTools 驱动程序与 PHP ODBC 进行无 DSN 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090172/

相关文章:

python-3.x - 无法在 ubuntu Linux 上获取 pip3 来安装库

php - codeigniter 多表中的总数量

mysql - MS Access DAO 连接在退出时放弃更改

vba - 如何检查Access表中是否存在值

ms-access - 如何将 MS Access 数据库连接到 Jetbrains DataGrip

php - 如何禁用 302 重定向

php - Laravel 5.6,关系路径返回数组而不是对象

php - 从mysql php中选择最后两行

php - 使用 Xampp 为 Wordpress 设置 ChromePhp

php - APNS 不再适用于 PHP