2012-04-10 22 views
8

MDBToolsドライバを使用してAccessデータベースから読み取って、Ubuntu 11.10でodbc_connectを実行しようとしています。 /etc/odbc.iniでDSN設定を使用するとうまくいきます。 odbc.ini参照MDBToolsODBCにおけるドライバーの属性MDBToolsドライバを使用したPHP ODBCとのDSNレス接続

[logindb] 
Description = Microsoft Access Try DB 
Driver = MDBToolsODBC 
Database = /home/folder1/TestDb.mdb 
Servername = localhost 

、そう、ここに私のODBCセットアップは/etc/odbcinst.iniである:

以下

/etc/odbc.iniの内容です

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

$conn = odbc_connect('logindb','','');を使用するときに私の問題は、あります、私はデータベースの場所のハードコードされた値を使用する必要があります。理想的には、最初のパラメータodbc_connectをDSNレス接続を使用して指定して、データベースファイルを変数にすることができます(別のDBから読み取ることになります)。何かのように:接頭辞を、それがうまくいきませんでした:

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

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

私はまた、ODBCせずに、それを試してみました。 DSNの指定がなぜ機能するのか誰にでも教えてもらえますが、同じ属性のように見えるものを使用してそれを指定しようとすると動作しません。私はそれがDSNのない接続の最初のパラメータのパラメータと内容と関係していると思っています。いつものように、どんな助けも大歓迎です。

+0

@Rocket: '/etc/odbc.iniにおける変数名に続きを'、それは' Database = $ db'であってはなりませんか? – eggyal

+0

@eggyal:それは助けにもならなかった。 「SQLエラー:[unixODBC] [ドライバマネージャ]データソース名が見つかりません。デフォルトのドライバが指定されていません」と表示されます。 –

+0

@Rocket: 'Driver =/usr/lib/libmdbodbc.so.0'を明示的に指定した場合は? – eggyal

答えて

7

サポートしていない可能性があります。実際のドライバのソースから、チェックする必要があるパラメータをロードし、DNS文字列が与えられているかどうかチェックし、次にiniファイルをチェックし、エラーがない場合はパラメータを設定します。あなたはconnectparams.cで確認したときにodbc.c最新mdbtools(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; 

ため

はその後、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プリコンパイラ設定に応じて、inifilesを検索するか、TRUEを返します。

ので

SetConnectString (params, szConnStrIn); 

が唯一それが2つの以前の機能から得たデータに動作することを考えると、私はそれがDSNレスをサポートしていませんと思います。適切なDSN = stringまたはiniファイルのみ。

1

これは0.7.1でサポートされています。あなたはgithubのからそれを得ることができます。

https://github.com/brianb/mdbtools

接続文字列については、これは私の作品:

"Driver=Microsoft Access Driver (*.mdb);DBQ=///file.mdb;UID=;PWD=;" 
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", "", ""); 
関連する問題