編者注:本文是作者對不久前發布的一篇文章的補充,在閱讀本文之前,最好先看一下原來的文章:“一個完善的ODBC數據庫程序”。
從方便用戶的角度考慮,應該在程序中采用動態創建數據源。經過編者的提醒,我查找了一些資料,還好最終實現了。代碼如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //取的數據庫的路徑(參考徐景周的〈直接通過DAO讀寫Access文件〉 CString sPath; GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath.ReleaseBuffer (); int nPos; nPos=sPath.ReverseFind (''\\''); sPath=sPath.Left (nPos); CString lpszFile = sPath + "\\student.mdb"; //在用SQLConfigDataSource()函數時,有一個需要注意的地方,因為在函數中用到Cstring //變量,由於本身是字符串,最後有\0,所以用下面的方法處理: char* szDesc; int mlen; szDesc=new char[256]; sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","not",lpszFile,sPath); //not為數據源名你可以改動。但必須與CString CLhwySet::GetDefaultConnect() //{ // return _T("ODBC;DSN=not"); //} //中的數據源名保持一致,你可以改變一下。 mlen = strlen(szDesc); for (int i=0; i<mlen; i++) { if (szDesc[i] == ''?'') szDesc[i] = ''\0''; } //SQLConfigDataSource()函數用法參考:《用Visual C++程序實現設置ODBC數據源 》 下面//兩種用法都不成功 // if(FALSE==SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0","DSN=AbbDBQ=lpszFileDEFAULTDIR=sPath\0")) // if(FALSE==SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0","DSN=Abb\0DBQ=lpszFile\0DEFAULTDIR=sPath\0\0")) if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc)) AfxMessageBox("Failed"); return 0; }
需要注意的兩點:
1.在開頭需要包含頭文件:#include <odbcinst.h>。
2.Student.mdb 必須和lhwy應用程序在同一目錄下。
你還可以做一個讓用戶從一個對話框向程序輸入ODBC數據源名、以及通過浏濫文件目錄選擇所需數據庫,試一下。但一定注意CString的處理方法。