要做上位了,今天嘗試下用VC6.0在後台連結SQL 資料庫,參考了《Visual C++資料庫通用模組開發與系統移植》的第一章內容,下面簡單說下步驟:
1.建立一個MFC基於對話方塊的程式,工程名為data.
2.開啟SQL SERVER,建立一個data1的資料庫。
3.在stdafx.h檔案中最後輸入:#import "c:\program files\common files\system\ado\msadO15.dll" no_namespace rename("EOF","adoEOF")
注意不要有分號
4.在自動產生的CdataApp類源檔案中,即在data.cpp源檔案的前面,定義兩個全域變數:
#endif _ConnectionPtr m_pConnection; //添加在此處,記住啊_RecordsetPtr m_pRecordset;
書上說的是在產生的應用程式的標頭檔中定義,可是我試過,在data.h中定義的時候,在CdataDlg類訪問這兩個變數時會出錯,所以我就改在data.cpp的前面定義了,然後在CdataDlg.cpp 源檔案的前面 用extern聲明下就可以了使用了。
5.在data.cpp的初始化函數中添加COM初始化代碼:
BOOL CDataApp::InitInstance(){ if(!AfxOleInit()){AfxMessageBox("OLE初始化出錯!"); return FALSE;}AfxEnableControlContainer(); //初始化COM對象CoInitialize(NULL);
......
之後接著上面,添加如下代碼,試著建立一個名為學生資訊的表:
try{m_pConnection.CreateInstance("ADODB.Connection");//"ADODB.Connection" _uuidof(Connection)m_pRecordset.CreateInstance("ADODB.Recordset");//定義資料庫連接字串,m_pConnection->Open("driver={SQL Server};Server=(local);DATABASE=data1","","",adModeUnknown);//!!!!!!!!!
}
//COM錯誤取得,當執行COM功能的時候,如果出錯,則可以撲捉到_com_error的異常catch(_com_error &e){::CoUninitialize(); ::AfxMessageBox(e.ErrorMessage());return FALSE;}
在注釋為!!!!!!!的地方一定要注意,如果你安裝 SQL的時候沒有設密碼,這裡要把UID 和 PWD取消掉,如果有密碼,則按下面方式,我之前用的是下面的方式,調試時一直出現idispatch #3149,後來把那兩個去掉就沒事了。
m_pConnection->Open("driver={SQL Server};Server=(local);DATABASE=data1;UID=sa;PWD=000","","",adModeUnknown);
6.在資源清單中的對話方塊中,添加一個按鈕,並添加相應函數,在這個函數中添加如下代碼,實現建立一個表並添加一個記錄和返回記錄個數的功能:
void CDataDlg::OnBtnTable() {// TODO: Add your control notification handler code here_variant_t ra;m_pConnection->Execute("CREATE TABLE 學生資訊(學號 INTEGER,姓名 TEXT,年齡 INTEGER,生日 DATETIME)",&ra,adCmdText);//往表格裡添加記錄,m_pConnection->Execute("INSERT INTO 學生資訊(學號,姓名,年齡,生日) VALUES(200202,'周華',22,'1978-08-16')",&ra,adCmdText);//執行SQL統計命令m_pRecordset=m_pConnection->Execute("SELECT COUNT(*) FROM 學生資訊",&ra,adCmdText);_variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)(0));m_pRecordset->Close();CString message;message.Format("共有%d條記錄",vCount.lVal);AfxMessageBox(message);}
編輯運行就可以看到資料庫data1有一個學生資訊的表了,並且裡面有一條記錄。
我剛才又試了一下,其實沒必要在data.cpp中定義下面兩個變數:
_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;
可以直接在dataDlg.cpp的前面直接定義,將初始化COM對象的那段移到dataDlg.cpp的初始化函數中,一樣可以實現。大家可以多試下,我也只是個新手,不足的地方請多指教。
總結:多思考,多動手,多嘗試,不要完全相信書上的內容,多試幾遍,其實沒你想的那麼難。