久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

VC |ADO數(shù)據(jù)庫(kù)(Access)編程

 2017helloworld 2018-02-16

目錄

1 新建數(shù)據(jù)庫(kù)

2 添加和編輯對(duì)話框資源

3 初始化OLE/COM庫(kù)

4 創(chuàng)建Connection對(duì)象,、打開(kāi)數(shù)據(jù)源,建立同數(shù)據(jù)源的連接

5 執(zhí)行SQL命令,、使用結(jié)果集

6 終止連接

1 新建數(shù)據(jù)庫(kù)

新建一簡(jiǎn)單Access數(shù)據(jù)庫(kù)student.mdb,,內(nèi)有一studentinfo表。

VC |ADO數(shù)據(jù)庫(kù)(Access)編程

2 添加和編輯對(duì)話框資源

創(chuàng)建一個(gè)基于對(duì)話框的MFC工程,,工程名為Ch15Demo1,。

VC |ADO數(shù)據(jù)庫(kù)(Access)編程

單選按鈕“添加記錄”的屬性需要勾選“組”才可以關(guān)聯(lián)變量,,如下:

VC |ADO數(shù)據(jù)庫(kù)(Access)編程

對(duì)話框中的控件變量如下:

VC |ADO數(shù)據(jù)庫(kù)(Access)編程

“添加記錄”按鈕默認(rèn)為選中狀態(tài),代碼如下:

CCh15Demo1Dlg::CCh15Demo1Dlg(CWnd* pParent /*=NULL*/)

: CDialog(CCh15Demo1Dlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CCh15Demo1Dlg)

m_StuNo = _T('');

m_StuName = _T('');

m_StuAddress = _T('');

m_StuTel = _T('');

m_Status = _T('');

m_radio = 0;//添加記錄單選按鈕選中

//}}AFX_DATA_INIT

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

初始化其它按鈕狀態(tài):

BOOL CCh15Demo1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

...

GetDlgItem(IDC_REMOVE)->EnableWindow(false);//禁用刪除按鈕

GetDlgItem(IDC_CHECKIN)->EnableWindow(false);//禁用提交按鈕

//禁用導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(false);//禁用第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(false);//禁用下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(false);//禁用上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(false);//禁用最后一條按鈕

return TRUE;

}

3 初始化OLE/COM庫(kù)

ADO是一組動(dòng)態(tài)鏈接庫(kù),,因此在使用之前還必須導(dǎo)入ADO并且初始化,。

// stdafx.h : include file for standard system include files,

#import 'C:\program files\common files\system\ado\msado15.dll' no_namespace rename('EOF','adoEOF')

// Ch15Demo1.cpp : implementation file

BOOL CCh15Demo1App::InitInstance()

{

AfxEnableControlContainer();

//初始化OLE DLLs

if (!AfxOleInit())

{

AfxMessageBox('初始化OLE DLL失敗,!');

return FALSE;

}

...

}

4 創(chuàng)建Connection對(duì)象,,打開(kāi)數(shù)據(jù)源,建立同數(shù)據(jù)源的連接

創(chuàng)建一個(gè)Connection對(duì)象,,定義用于連接的字符串信息,,包括數(shù)據(jù)源名稱、用戶ID,、口令,、連接超時(shí)、默認(rèn)數(shù)據(jù)庫(kù)以及光標(biāo)的位置,。一個(gè)Connection對(duì)象代表了同數(shù)據(jù)源的一次會(huì)話,。

在頭文件CH15Demo1Dlg.h中定義一處指向Connection對(duì)象的指針:

// Ch15Demo1Dlg.h : header file

class CCh15Demo1Dlg : public CDialog

{

public:

_ConnectionPtr m_pConnection;//連接對(duì)象

_RecordsetPtr m_pRecordset; //記錄集對(duì)象

...

}

在文件Ch15Demo1Dlg.cpp的OnInitDialog()中通過(guò)Connection對(duì)象連接創(chuàng)建的數(shù)據(jù)庫(kù)Student.mdb:

// Ch15Demo1Dlg.cpp : implementation file

BOOL CCh15Demo1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

...

HRESULT hr;

try

{

hr = m_pConnection.CreateInstance('ADODB.Connection');//創(chuàng)建Connection對(duì)象

if(SUCCEEDED(hr))

{

hr = m_pConnection->Open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Student.mdb','','',adModeUnknown);///連接數(shù)據(jù)庫(kù)

//hr = m_pConnection->Open('studb','','',adModeUnknown);

}

}

catch(_com_error e)///捕捉異常

{

CString errormessage;

errormessage.Format('連接數(shù)據(jù)庫(kù)失敗!\r\n錯(cuò)誤信息:%s',e.ErrorMessage());

AfxMessageBox(errormessage);///顯示錯(cuò)誤信息

}

_variant_t RecordsAffected;

return TRUE;

}

5 執(zhí)行SQL命令、使用結(jié)果集,。

5.1 自定義一個(gè)顯示記錄的函數(shù)

// Ch15Demo1Dlg.h : header file

class CCh15Demo1Dlg : public CDialog

{

protected:

void ShowRecord();//顯示記錄

}

// Ch15Demo1Dlg.cpp : implementation file

void CCh15Demo1Dlg::ShowRecord()

{

m_StuNo=(char*)_bstr_t(m_pRecordset->GetCollect('stuNo'));

m_StuName=(char*)_bstr_t(m_pRecordset->GetCollect('stuname'));

m_StuAddress=(char*)_bstr_t(m_pRecordset->GetCollect('stuaddress'));

m_StuTel=(char*)_bstr_t(m_pRecordset->GetCollect('stuphone'));

UpdateData(false);

}

5.2 各控件消息響應(yīng)函數(shù)

先在頭文件中定義公共指針和變量

// Ch15Demo1Dlg.h : header file

class CCh15Demo1Dlg : public CDialog

{

public:

_ConnectionPtr m_pConnection;//連接對(duì)象

_RecordsetPtr m_pRecordset; //記錄集對(duì)象

int count;//記錄數(shù)

int curNo;//當(dāng)前操作記錄

...

}

// Ch15Demo1Dlg.cpp : implementation file

void CCh15Demo1Dlg::OnRadio1()

{

// TODO: Add your control notification handler code here

m_radio=0;

GetDlgItem(IDC_ADD)->EnableWindow(true);//激活添加按鈕

GetDlgItem(IDC_REMOVE)->EnableWindow(false);//禁用刪除按鈕

GetDlgItem(IDC_CHECKIN)->EnableWindow(false);//禁用提交按鈕

//禁用導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(false);//禁用第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(false);//禁用下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(false);//禁用上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(false);//禁用最后一條按鈕

m_StuNo=m_StuName=m_StuAddress=m_StuTel='';

UpdateData(false);

}

void CCh15Demo1Dlg::OnRadio2()

{

// TODO: Add your control notification handler code here

m_radio=1;

GetDlgItem(IDC_ADD)->EnableWindow(false);//禁用添加按鈕

GetDlgItem(IDC_REMOVE)->EnableWindow(true);//激活刪除按鈕

GetDlgItem(IDC_CHECKIN)->EnableWindow(false);//禁用提交按鈕

//激活導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(true);//激活第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(true);//激活下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(true);//激活上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(true);//激活最后一條按鈕

_variant_t RecordsAffected;

m_pRecordset =m_pConnection->Execute('SELECT COUNT(*) FROM studentinfo',&RecordsAffected,adCmdText);

//&RecordsAffected是執(zhí)行命令后的返回值,,表明符合命令的的行數(shù),可選參數(shù)

//adCmdTex指明執(zhí)行命令的類(lèi)型,,可選參數(shù)

_variant_t vIndex = (long)0;

_variant_t vCount = m_pRecordset->GetCollect(vIndex); //取得第一個(gè)字段的值放入vCount變量

count=vCount.lVal;//獲取記錄集的

m_pRecordset->Close();///關(guān)閉記錄集

if(count==0)//記錄為0

{

GetDlgItem(IDC_REMOVE)->EnableWindow(false);//禁用刪除按鈕

//禁用導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(false);//禁用第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(false);//禁用下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(false);//禁用上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(false);//禁用最后一條按鈕

m_Status='表中沒(méi)有數(shù)據(jù),!';

UpdateData(false);

return;

}

m_pRecordset.CreateInstance(__uuidof(Recordset));//創(chuàng)建記錄集對(duì)象

CString strSQL='SELECT * FROM studentinfo';

try

{

//從數(shù)據(jù)庫(kù)中打開(kāi)表

m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch (_com_error e)

{

CString strError;

strError.Format('警告:打開(kāi)數(shù)據(jù)表時(shí)發(fā)生異常。錯(cuò)誤信息:%s',e.ErrorMessage());

AfxMessageBox(strError);

return;

}

m_pRecordset->MoveFirst();//移到第一條記錄

curNo=1;

m_Status.Format('共有%d條記錄,,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

void CCh15Demo1Dlg::OnRadio3()

{

// TODO: Add your control notification handler code here

m_radio=2;

GetDlgItem(IDC_ADD)->EnableWindow(false);//禁用添加按鈕

GetDlgItem(IDC_REMOVE)->EnableWindow(false);//禁用刪除按鈕

GetDlgItem(IDC_CHECKIN)->EnableWindow(true);//激活提交按鈕

//激活導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(true);//激活第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(true);//激活下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(true);//激活上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(true);//激活最后一條按鈕

_variant_t RecordsAffected;

m_pRecordset =m_pConnection->Execute('SELECT COUNT(*) FROM studentinfo',&RecordsAffected,adCmdText);

_variant_t vIndex = (long)0;

_variant_t vCount = m_pRecordset->GetCollect(vIndex); //取得第一個(gè)字段的值放入vCount變量

count=vCount.lVal;

m_pRecordset->Close();///關(guān)閉記錄集

if(count==0)//記錄為0

{

GetDlgItem(IDC_CHECKIN)->EnableWindow(false);//禁用提交按鈕

//禁用導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(false);//禁用第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(false);//禁用下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(false);//禁用上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(false);//禁用最后一條按鈕

return;

}

m_pRecordset.CreateInstance(__uuidof(Recordset));

CString strSQL='SELECT * FROM studentinfo';

try

{

//從數(shù)據(jù)庫(kù)中打開(kāi)表

m_pRecordset->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch (_com_error e)

{

CString strError;

strError.Format('警告:打開(kāi)數(shù)據(jù)表時(shí)發(fā)生異常,。 錯(cuò)誤信息: %s',e.ErrorMessage());

AfxMessageBox(strError);

return;

}

m_pRecordset->MoveFirst();//移到第一條記錄

curNo=1;

m_Status.Format('共有%d條記錄,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

void CCh15Demo1Dlg::OnAdd()

{

// TODO: Add your control notification handler code here

_variant_t RecordsAffected;

UpdateData();

if(m_StuNo.IsEmpty())

{

AfxMessageBox('學(xué)號(hào)不能為空,!');

return;

}

CString strSQL;

strSQL.Format('INSERT INTO studentinfo(stuNo,stuname,stuaddress,stuphone) VALUES ('%s', '%s','%s','%s')',m_StuNo,m_StuName,m_StuAddress,m_StuTel);

m_pConnection->Execute((_bstr_t)strSQL,&RecordsAffected,adCmdText);

m_Status='成功添加了一行記錄,!';

m_StuNo=m_StuName=m_StuAddress=m_StuTel='';

UpdateData(false);

}

//因?yàn)镃OM必須設(shè)計(jì)成跨平臺(tái),所以它需要一種更普遍的方式來(lái)處理字符串以及其他數(shù)據(jù),。在ADO技術(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作時(shí),,數(shù)據(jù)庫(kù)中保存的都是COM類(lèi)型的變量,其特有的數(shù)據(jù)類(lèi)型為VARIANT和BSTR類(lèi)型

//_variant_t類(lèi)封裝和管理Variant數(shù)據(jù)類(lèi)型,,在使用ADO對(duì)象模型操作數(shù)據(jù)庫(kù)時(shí),,如果對(duì)象的方法或者屬性接受某個(gè)值,則聲明該值的形式為_(kāi)variant_t,,而非一般CString,,二者可以強(qiáng)制轉(zhuǎn)換

void CCh15Demo1Dlg::OnCheckin()

{

// TODO: Add your control notification handler code here

UpdateData();

m_pRecordset->PutCollect('stuNo',_variant_t(m_StuNo));

m_pRecordset->PutCollect('stuname',_variant_t(m_StuName));

m_pRecordset->PutCollect('stuaddress',_variant_t(m_StuAddress));

m_pRecordset->PutCollect('stuphone',_variant_t(m_StuTel));

m_pRecordset->Update();//提交記錄

m_Status='成功修改了一條記錄!';

UpdateData(false);

}

void CCh15Demo1Dlg::OnRemove()

{

// TODO: Add your control notification handler code here

m_pRecordset->Delete(adAffectCurrent);

m_Status='成功刪除了一行記錄,!';

count=count-1;

UpdateData(false);

OnFirst();

}

//當(dāng)?shù)玫接涗浖瘯r(shí),,需要從各條記錄中讀出數(shù)據(jù),,必須在記錄集中移動(dòng)光標(biāo),使要訪問(wèn)的記錄成為當(dāng)前記錄,。ADO的記錄集對(duì)象中提供了幾種在記錄集中移動(dòng)記錄指針的方法(函數(shù)),,使用這些方法可以方便地得到要訪問(wèn)的記錄。

void CCh15Demo1Dlg::OnFirst()

{

// TODO: Add your control notification handler code here

if(count==0)//記錄為0

{

m_StuNo=m_StuName=m_StuAddress=m_StuTel='';

UpdateData(false);

GetDlgItem(IDC_REMOVE)->EnableWindow(false);//禁用刪除按鈕

//禁用導(dǎo)航按鈕控件

GetDlgItem(IDC_FIRST)->EnableWindow(false);//禁用第一條按鈕

GetDlgItem(IDC_NEXT)->EnableWindow(false);//禁用下一條按鈕

GetDlgItem(IDC_PREV)->EnableWindow(false);//禁用上一條按鈕

GetDlgItem(IDC_LAST)->EnableWindow(false);//禁用最后一條按鈕

return;

}

m_pRecordset->MoveFirst();//移到第一條記錄

curNo=1;

m_Status.Format('共有%d條記錄,,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

void CCh15Demo1Dlg::OnLast()

{

// TODO: Add your control notification handler code here

m_pRecordset->MoveLast();//移到最后一條記錄

curNo=count;

m_Status.Format('共有%d條記錄,,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

void CCh15Demo1Dlg::OnNext()

{

// TODO: Add your control notification handler code here

if(curNo<>

{

m_pRecordset->MoveNext();//移到下一條記錄

curNo++;

if(m_pRecordset->adoEOF)

{

m_pRecordset->MoveLast();

}

m_Status.Format('共有%d條記錄,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

}

void CCh15Demo1Dlg::OnPrev()

{

// TODO: Add your control notification handler code here

if(curNo>1)

{

m_pRecordset->MovePrevious();//移到上一條記錄

curNo--;

if(m_pRecordset->BOF)

{

m_pRecordset->MoveFirst();

}

m_Status.Format('共有%d條記錄,,當(dāng)前第%d條',count,curNo);

UpdateData(false);

ShowRecord();//顯示記錄

}

}

6 關(guān)閉記錄集和連接

使用ClassWizard,,重載對(duì)話框類(lèi)WM_DESTROY消息響應(yīng)函數(shù)DestroyWindow(),并添加如下代碼:

BOOL CCh15Demo1Dlg::DestroyWindow()

{

// TODO: Add your specialized code here and/or call the base class

if(m_pRecordset!=NULL)

{

m_pRecordset->Close();//關(guān)閉記錄集對(duì)象

m_pRecordset=NULL;

}

if(m_pConnection->State)

{

m_pConnection->Close();//關(guān)閉連接對(duì)象

m_pConnection=NULL;

}

return CDialog::DestroyWindow();

}

-End-

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多