這都是以前為了做那個項目測試ADO連接MySQL數據功能的,這里發文分享一下。
實際運行如下圖所示,具有列表顯示數據庫內容,添加,刪除,修改功能,點擊列表框的任一欄就可以就行修改或者刪除,功能算是有點小全面吧。
我們可以從MySQL自帶的MySQL workbench看看源數據庫里的數據,如圖所示。如果沒有接觸過的可以嘗試一下在這里建立數據庫,添加刪除數據等,操作成功后我們再用VC進行操作,看看我們寫的程序可不可以刪除修改等操作,關於MySQL workbench這里不介紹。
我們首先建立一個VC工程,選擇對話框,添加資源如下圖所示
注意列表框VIEW要選擇report模式)
在stdafx.h文件中要添加如下代碼,因為要包含數據庫相關的函數,以及ADO操作的DLL動態鏈接庫
#include <afxdb.h> // MFC Automation classes
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
對於列表框我們要在對話框的初始化函數里進行操作,如添加第一行項目以及擴展風格修改
int i;
CString listonetable[]={_T("姓名"),\
_T("性別"),\
_T("賬戶"),\
_T("密碼"),\
_T("班級")};
for( i=0;i<5;i++)
{
m_listone.InsertColumn(i,listonetable[i],LVCFMT_CENTER,90);//添加項目欄
}
DWORD dwStyle = m_listone.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)
m_listone.SetExtendedStyle(dwStyle); //設置擴展風格
我們要把數據從MySQL數據庫讀取出來,然后顯示到列表框中,該操作大致函數如下,我們應該在對話框的初始化函數中調用,讓程序一運行就把數據列表顯示出來。
CAdoConnect m_ADO;
m_ADO.OnInitADOConn();
//設置SELECT語句
_bstr_t vSQL="select * from TestSql";
_RecordsetPtr m_pRecordset;
m_pRecordset=m_ADO.GetRecordSet(vSQL);
if(!m_pRecordset->adoBOF)
{
m_pRecordset->MoveFirst();
}
_variant_t valuetl;
i=0;
try
{
while(!m_pRecordset->adoEOF)
{
CString str;
valuetl=m_pRecordset->GetFields()->GetItem("name")->Value;
str=(LPCTSTR)(_bstr_t)valuetl;
m_listone.InsertItem(i,str);
valuetl=m_pRecordset->GetFields()->GetItem("sex")->Value;
str=(LPCTSTR)(_bstr_t)valuetl;
m_listone.SetItemText(i,1,str);
valuetl=m_pRecordset->GetFields()->GetItem("loginid")->Value;
str=(LPCTSTR)(_bstr_t)valuetl;
m_listone.SetItemText(i,2,str);
valuetl=m_pRecordset->GetFields()->GetItem("loginpw")->Value;
str=(LPCTSTR)(_bstr_t)valuetl;
m_listone.SetItemText(i,3,str);
valuetl=m_pRecordset->GetFields()->GetItem("class")->Value;
str=(LPCTSTR)(_bstr_t)valuetl;
m_listone.SetItemText(i,4,str);
i++;
m_pRecordset->MoveNext();
}
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
m_ADO.ExitConnect();
m_pRecordset=NULL;
然后我們要對列表框單擊消息進行處理,使得單擊后列表框下面一排的編輯框能夠實時顯示選擇的一行的信息,正如第一張截圖所示,也為了修改信息做准備。進入MFC ClassWizard對列表框添加NM_CLICK消息,並編輯代碼,如圖所示
編輯代碼如下
void CListmysqlDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int i=m_listone.GetNextItem(-1, LVIS_SELECTED);//得到選中的行
if(i>=0)//有選中
{
m_name = m_listone.GetItemText(i,0);
m_sex = m_listone.GetItemText(i,1);
m_ID = m_listone.GetItemText(i,2);
m_PW = m_listone.GetItemText(i,3);
m_class = m_listone.GetItemText(i,4);//獲取列表框信息
UpdateData(FALSE);//更新數據到編輯框
}
*pResult = 0;
}
再分析一下單擊添加按鈕,首先讀取要添加的編輯框里的內容,然后和數據庫內容作比較,如果數據庫已經存在該數據,那么表示重復,是不允許添加的,防止添加重復無效的數據。
void CListmysqlDlg::OnButtonAdd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CAdoConnect m_ADO;
m_ADO.OnInitADOConn();
//設置SELECT語句
_bstr_t vSQL;
CString Cstrsql;
Cstrsql.Format(_T("select * from testsql where name = '%s'"),m_name);
vSQL= _bstr_t((LPCTSTR)Cstrsql);
_RecordsetPtr m_pRecordsetCheck(__uuidof(Recordset));
m_pRecordsetCheck->CursorLocation = adUseClient;
m_pRecordsetCheck->Open(vSQL,m_ADO.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
int i=m_pRecordsetCheck->RecordCount;
if(i>0)
{
m_pRecordsetCheck->Close();
m_ADO.ExitConnect();
::MessageBox(NULL,_T("記錄已存在,請檢查!"),_T("添加失敗"),MB_OK|MB_ICONWARNING);
return;
}
else
{
m_pRecordsetCheck->Close();
m_pRecordsetCheck=NULL;
vSQL="select * from testsql";
_RecordsetPtr m_pRecordset;
m_pRecordset=m_ADO.GetRecordSet(vSQL);
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("name",_variant_t(m_name));
m_pRecordset->PutCollect("sex",_variant_t(m_sex));
m_pRecordset->PutCollect("loginid",_variant_t(m_ID));
m_pRecordset->PutCollect("loginpw",_variant_t(m_PW));
m_pRecordset->PutCollect("class",_variant_t(m_class));
m_pRecordset->Update();
m_pRecordset->MoveLast();
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
m_ADO.ExitConnect();
m_pRecordset=NULL;
i= m_listone.GetItemCount();
m_listone.InsertItem(i,m_name);
m_listone.SetItemText(i,1,m_sex);
m_listone.SetItemText(i,2,m_ID);
m_listone.SetItemText(i,3,m_PW);
m_listone.SetItemText(i,4,m_class);
AfxMessageBox("添加記錄成功!");
}
}
附:ADO連接MySQL,這里有幾個比較重要的函數,把它們封裝到一起,便於使用
#include "stdafx.h"
#include "listmysql.h"
#include "AdoConnect.h"
CAdoConnect::CAdoConnect()
{
}
CAdoConnect::~CAdoConnect()
{
}
void CAdoConnect::OnInitADOConn()
{
// 初始化OLE/COM庫環境
::CoInitialize(NULL);
try
{
// 創建Connection對象
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open("DSN=Testmysqllist;Server= localhost;Database=test","root","root",adModeUnknown);
}
// 捕捉異常
catch(_com_error e)
{
// 顯示錯誤信息
AfxMessageBox(e.Description());
}
}
_RecordsetPtr& CAdoConnect::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 連接數據庫,如果Connection對象為空,則重新連接數據庫
if(m_pConnection==NULL)
OnInitADOConn();
// 創建記錄集對象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的記錄
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉異常
catch(_com_error e)
{
// 顯示錯誤信息
AfxMessageBox(e.Description());
}
// 返回記錄集
return m_pRecordset;
}
// 執行SQL語句,Insert Update _variant_t
BOOL CAdoConnect::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
try
{
// 是否已經連接數據庫
if(m_pConnection == NULL)
OnInitADOConn();
// Connection對象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 參數RecordsAffected是操作完成后所影響的行數,
// 參數Options表示CommandText的類型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存儲過程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
void CAdoConnect::ExitConnect()
{
// 關閉記錄集和連接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset=NULL;
m_pConnection=NULL;
// 釋放環境
::CoUninitialize();
}
整個工程代碼下載:http://www.kuaipan.com.cn/file/id_47425243630796802.htm
用到的數據庫下載:http://www.kuaipan.com.cn/file/id_47425243630796803.htm
注意:本程序需要MySQL數據庫才可以運行,將下載的數據庫導入並建立數據源,注意數據源必須和下圖一致,不能填錯,用戶名密碼都設為root,該操作請參考上一篇文章:windows下MySQL數據庫安裝 導入 導出以及數據源建立詳細教程