///////////////////////////////////////////////////////////////////////// //名称:GetExcelDriver //功能:获取ODBC中Excel驱动 //日期:2014-3-5 ///////////////////////////////////////////////////////////////////////// CString GetExcelDriver() { char szBuf[2001]; WORD cbBufMax = 2000; WORD cbBufOut; char *pszBuf = szBuf; CString sDriver; //获取已安装驱动的名称(函数在odbcinst.h里) if(!SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut)) return ""; //检索已安装的驱动是否有Excel... do { if(strstr(pszBuf,"Excel") != 0) { //发现! sDriver = CString(pszBuf); break; } pszBuf=strchr(pszBuf,'\0') + 1; } while (pszBuf[1]!='\0'); return sDriver; }
BOOL INSTAPI SQLGetInstalledDriversW (LPWSTR lpszBuf, WORD cbBufMax, WORD * pcbBufOut) { char *path; BOOL ret; inst_logClear(); path = calloc( cbBufMax, 1 ); ret = SQLGetInstalledDrivers( path, cbBufMax, pcbBufOut ); if ( ret ) { _multi_string_copy_to_wide( lpszBuf, path, cbBufMax ); } free( path ); return ret; }
static void test_SQLInstallerError(void) { RETCODE sql_ret; /* MSDN states that the error number should be between 1 and 8. Passing 0 is an error */ sql_ret = SQLInstallerError(0, NULL, NULL, 0, NULL); ok(sql_ret == SQL_ERROR, "SQLInstallerError(0...) failed with %d instead of SQL_ERROR\n", sql_ret); /* However numbers greater than 8 do not return SQL_ERROR. * I am currently unsure as to whether it should return SQL_NO_DATA or "the same as for error 8"; * I have never been able to generate 8 errors to test it */ sql_ret = SQLInstallerError(65535, NULL, NULL, 0, NULL); ok(sql_ret == SQL_NO_DATA, "SQLInstallerError(>8...) failed with %d instead of SQL_NO_DATA\n", sql_ret); /* Force an error to work with. This should generate ODBC_ERROR_INVALID_BUFF_LEN */ ok(!SQLGetInstalledDrivers(0, 0, 0), "Failed to force an error for testing\n"); sql_ret = SQLInstallerError(2, NULL, NULL, 0, NULL); ok(sql_ret == SQL_NO_DATA, "Too many errors when forcing an error for testing\n"); /* Null pointers are acceptable in all obvious places */ sql_ret = SQLInstallerError(1, NULL, NULL, 0, NULL); ok(sql_ret == SQL_SUCCESS_WITH_INFO, "SQLInstallerError(null addresses) failed with %d instead of SQL_SUCCESS_WITH_INFO\n", sql_ret); }