[英]DSN-less connection with PHP ODBC using MDBTools Driver
我正在尝试使用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= 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 查找 ini 文件或立即返回 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", "", "");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.