国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

GDAL打開mdb文件失敗解決方法(二)

2019-11-08 03:18:51
字體:
來源:轉載
供稿:網友

上一篇http://blog.csdn.net/liminlu0314/article/details/53433014博文中說到,可以通過配置項來解決mdb文件打開失敗的問題。該問題主要是在64位的程序中會出現。仔細查看gdal的代碼,發現在源碼中已經針對這個問題進行了修改,但是測試發現修改的不徹底。

具體的bug信息參考http://trac.osgeo.org/gdal/ticket/5594。GDAL庫中源碼片段如下,詳見文件ogrodbcdatasource.cpp中的132行左右,位于函數OGRODBCDataSource::OpenMDB中。

/* -------------------------------------------------------------------- *//*      Initialize based on the DSN.                                    *//* -------------------------------------------------------------------- */    CPLDebug( "ODBC", "Establishsession(%s)", pszDSN );    if( !oSession.EstablishSession( pszDSN, NULL, NULL ) )    {        int bError = TRUE;        if( EQUAL(pszDSN, "") )//注釋掉這句話即可        {            // Trying with another template (#5594)            pszDSNStringTemplate = "DRIVER=Microsoft access Driver (*.mdb, *.accdb);DBQ=%s";            CPLFree( pszDSN );            pszDSN = (char *) CPLMalloc(strlen(pszNewName)+strlen(pszDSNStringTemplate)+100);            snPRintf( pszDSN,                      strlen(pszNewName)+strlen(pszDSNStringTemplate)+100,                      pszDSNStringTemplate,  pszNewName );            CPLDebug( "ODBC", "EstablishSession(%s)", pszDSN );            if( oSession.EstablishSession( pszDSN, NULL, NULL ) )            {                bError = FALSE;            }        }        if( bError )        {            CPLError( CE_Failure, CPLE_AppDefined,                    "Unable to initialize ODBC connection to DSN for %s,/n"                    "%s", pszDSN, oSession.GetLastError() );            CPLFree( pszDSN );            return FALSE;        }    }

上述代碼雖然加了匹配另一個模板,但是有個判斷if( EQUAL(pszDSN, "") ),這個判斷由于pszDSN通過上面的賦值,肯定是有值的,所以這個判斷永遠為FALSE,也就是if內的代碼不會執行,這樣就導致修改了其實和沒有修改是一樣的。所以為了能夠在使用第一個模板失敗時,使用第二個模板,需要將if這句話注釋掉即可。

修改完重新編譯即可。

PS:最后又發現了一個問題,在打開調試開關之后,執行會崩潰,通過調試發現位于該文件的218行的 if( oTableList.GetTables() )中執行失敗,函數GetTables的源碼如下:

int CPLODBCStatement::GetTables( const char *pszCatalog,                                 const char *pszSchema ){    CPLDebug( "ODBC", "CatalogNameL: %s/nSchema name: %s",		pszCatalog , pszSchema); //這句出問題了#if (ODBCVER >= 0x0300)    if( !m_poSession->IsInTransaction() )    {        // Commit pending transactions and set to autocommit mode.        m_poSession->ClearTransaction();    }#endif......	調試發現在調用CPLDebug函數時,傳入的兩個參數均為NULL導致CPLDebug函數崩潰,此處加一個判斷就可以了。如果不啟用調試應該也不會出問題。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 锦屏县| 扎赉特旗| 岳西县| 连云港市| 贵港市| 黄大仙区| 长治市| 邵武市| 嘉鱼县| 舟曲县| 清镇市| 辽中县| 巴马| 邵阳市| 吉安市| 乌拉特后旗| 浪卡子县| 宜章县| 银川市| 恩施市| 岫岩| 彰化县| 怀来县| 禹城市| 岳阳县| 永安市| 浦江县| 建始县| 崇义县| 锦州市| 大港区| 永登县| 霍邱县| 成安县| 洞口县| 沐川县| 苍山县| 盖州市| 平凉市| 揭阳市| 铁岭市|