Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MDBTools驱动程序与PHP ODBC的无DSN连接_Php_Ms Access_Ubuntu_Odbc_Mdbtools - Fatal编程技术网

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

使用MDBTools驱动程序与PHP ODBC的无DSN连接,php,ms-access,ubuntu,odbc,mdbtools,Php,Ms Access,Ubuntu,Odbc,Mdbtools,我正试图使用驱动程序从Access数据库读取数据,以便在Ubuntu 11.10上执行odbc\u connect。在/etc/odbc.ini中使用DSN设置时,它工作正常 下面是/etc/odbc.ini的内容: [logindb] Description = Microsoft Access Try DB Driver = MDBToolsODBC Database = /home/folder1/TestDb.mdb Servername = localhost [MDBToolsOD

我正试图使用驱动程序从Access数据库读取数据,以便在Ubuntu 11.10上执行
odbc\u connect
。在
/etc/odbc.ini
中使用DSN设置时,它工作正常

下面是
/etc/odbc.ini
的内容:

[logindb]
Description = Microsoft Access Try DB
Driver = MDBToolsODBC
Database = /home/folder1/TestDb.mdb
Servername = localhost
[MDBToolsODBC]
Description = MDB Tools ODBC
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage =
CPTimeout =
CPReuse =
odbc.ini
中的驱动程序属性引用了
MDBToolsODBC
,因此,下面是我在
/etc/odbcinst.ini
中的odbc设置:

[logindb]
Description = Microsoft Access Try DB
Driver = MDBToolsODBC
Database = /home/folder1/TestDb.mdb
Servername = localhost
[MDBToolsODBC]
Description = MDB Tools ODBC
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage =
CPTimeout =
CPReuse =
我的问题是,当使用
$conn=odbc\u connect('logindb','')时,我必须使用数据库位置的硬编码值。理想情况下,我希望使用无DSN连接指定
odbc\u 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工具(mdbtools-0.6pre1)

然后,当您在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查找inifiles或立即返回TRUE,具体取决于HAVE_SQLGETPRIVATEPROFILESTRING预编译器设置

因此

SetConnectString (params, szConnStrIn);

它只对从前面两个函数中获得的数据起作用,我认为它不支持DSN less。只有正确的DSN=字符串或ini文件。

在0.7.1中受支持。您可以从github获得它:

关于连接字符串,这对我很有用:

"Driver=Microsoft Access Driver (*.mdb);DBQ=///file.mdb;UID=;PWD=;"

@Rocket:在
/etc/odbc.ini
中的变量名之后,是否应该是
数据库=$db
?@eggyal:这也没有帮助。它仍然显示:
SQL错误:[unixODBC][Driver Manager]未找到数据源名称,并且未指定默认驱动程序
@Rocket:如果您明确指定
Driver=/usr/lib/libmdbodbc.so.0
?@eggyal:Yes<代码>$conn=odbc_connect('logindb','')工作正常。@Rocket:对不起,我的意思是如果您在DSN中指定它:
odbc\u connect(“Driver=/usr/lib/libmdbodbc.so.0;Database=$db“,”)
?您确定支持UID和PWD吗?我在源代码中找不到它