Вопрос по ubuntu, php – Соединение без DSN с PHP ODBC с использованием драйвера MDBTools

8

Я пытаюсь прочитать из базы данных Access, используяMDBTools водители, чтобы выполнить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

Атрибут Драйвер вodbc.ini РекомендацииMDBToolsODBCИтак, вот моя настройка odbc в/etc/odbcinst.ini:

[MDBToolsODBC]
Description = MDB Tools ODBC
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage =
CPTimeout =
CPReuse =

Моя проблема при использовании$conn = odbc_connect('logindb','','');Я должен использовать жестко закодированное значение для расположения базы данных. В идеале я хотел бы указать первый параметрodbc_connect используя соединение без DSN, так что мой файл базы данных может быть переменной (будет читать из разных БД). Что-то вроде:

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

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

Я также пробовал это без префикса odbc:, но это не работало. Может ли кто-нибудь сказать мне, почему указание DSN работает, но при попытке указать его на лету, используя то, что выглядит как те же атрибуты, он не работает? Я думаю, что это связано с параметрами и содержимым первого параметра в соединении без DSN. Как всегда, любая помощь очень ценится.

@eggyal: Это тоже не помогло. Это все еще говорит:SQL error: [unixODBC][Driver Manager]Data source name not found, and no default driver specified. Rocket Hazmat
@Rocket: после имен переменных в/etc/odbc.iniне должно бытьDatabase=$db? eggyal
@eggyal: да.$conn = odbc_connect('logindb','',''); работает отлично. Rocket Hazmat
@Rocket: И если вы укажете явноDriver=/usr/lib/libmdbodbc.so.0? eggyal
@Rocket: Извините, я имел в виду, если вы укажете это в DSN:odbc_connect("Driver=/usr/lib/libmdbodbc.so.0;Database=$db",'','')? eggyal

Ваш Ответ

3   ответа
1

Поддерживается в 0.7.1. Вы можете получить его из github:

https://github.com/brianb/mdbtools

Что касается строки подключения, это работает для меня:

"Driver=Microsoft Access Driver (*.mdb);DBQ=///file.mdb;UID=;PWD=;"
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;

затем, когда вы проверяете в 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 ищет файлы или сразу возвращает с ИСТИНОЙ, в зависимости от настройки прекомпилятора HAVE_SQLGETPRIVATEPROFILESTRING.

Итак, учитывая, что

SetConnectString (params, szConnStrIn);

работает только с данными, полученными от двух предыдущих функций, я думаю, что он не поддерживает DSN-less. Только правильный DSN = строка или INI-файлы.

0
$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", "", "");

Похожие вопросы