一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ADO.NET

 jinzaiya 2011-04-13
學(xué)了很長一段時間的ADO.Net,知道其強(qiáng)大的數(shù)據(jù)訪問和操作能力!但是對ado.net的背景卻了解很少。。。

下面引用一下閱讀到得一些知識點(diǎn):

ADO(ActiveX Data Object的簡稱)是Microsoft為最新和最強(qiáng)大的數(shù)據(jù)訪問范例OLE DB而設(shè)計(jì)的,是一個便于使用的應(yīng)用程序?qū)咏涌凇DO通過OLE DB提供訪問和操作數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)。ADO不僅可以訪問關(guān)系型數(shù)據(jù)庫,還可以訪問非關(guān)系型數(shù)據(jù)庫。同時由于OLE DB是基于COM接口的技術(shù),使用這種技術(shù)可以直接對數(shù)據(jù)庫的驅(qū)動程序進(jìn)行訪問,從而大大提供了訪問速度。與眾多的數(shù)據(jù)庫編程接口比較,ADO具有易于使 用、速度快、內(nèi)存支出少和磁盤遺跡小等優(yōu)點(diǎn)。

但由于Microsoft并沒有提供有關(guān)ADO的類,更不幸的是微軟所提供的ADO文檔幾乎沒有關(guān)于 Visual C++的內(nèi)容,這使得Visual C++程序開發(fā)人員要想利用ADO訪問數(shù)據(jù)庫相對比較麻煩。然而這又是每個Visual C++程序員不可回避的問題。解決這個問題的比較可行的辦法就是自己編寫這個類。本文將介紹如何具體編寫自己的ADO類。

(1) 在使用ADO前必須使用#import引入ADO庫文件,其中ADO庫文件的路徑視實(shí)際情況而定,同時為了避免常數(shù)沖突,通常將常數(shù)EOF改名為 adoEOF。

#import "c:\program files\commonfiles\system\ado\msado15.dll" no_namespace rename ("EOF","adoEOF")

(2) 在使用ADO之前還必須初始化OLE庫。Visual C++ .net已經(jīng)在CWinApp::InitInstance()中對OLE庫進(jìn)行了初始化。但是如果使用的Visual C++ 6.0,則必須初始化OLE庫。

if (!AfxOleInit())
{
    AfxMessageBox(“初始化OLE庫失敗”);
}

(3) ADO庫包含三個智能指針:_ConnectionPtr、_CommandPtr和_RecordsetPtr。_ConnectionPtr通常被用 來創(chuàng)建一個數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的SQL語句。_CommandPtr返回一個記錄集,它提供了一種簡單的方法來執(zhí)行返回記錄集的存儲過程和 SQL語句。_RecordsetPtr是一個記錄集對象,它對記錄集提供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。創(chuàng)建Connection對象和 Recordset對象方法如下:

_ConnectionPtr m_pConnection; // 連接接口
_RecordsetPtr m_pRecordset;   // 記錄集指針
HRESULT hr;
hr = m_pConnection.CreateInstance("ADODB.Connection");
if (!SUCCEEDED(hr))
{
    AfxMessageBox("創(chuàng)建 Connection對象失敗");
}
hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (!SUCCEEDED(hr))
{
    AfxMessageBox("創(chuàng)建Recordset對象失敗");
}

(4) 連接不同數(shù)據(jù)庫。參數(shù)sConnection為連接屬性設(shè)置標(biāo)準(zhǔn)。它隨數(shù)據(jù)源類型的不同而變化。以下是其常見值:

1. 訪問ODBC數(shù)據(jù):

"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

2. 訪問ACCESS 97數(shù)據(jù)庫:

"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=databaseName;User ID=userName;Password=userPassword;"

3. 訪問ACCESS 2000數(shù)據(jù)庫:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"

4. 訪問MS SQL數(shù)據(jù)庫:

"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"

5. 訪問ORACLE數(shù)據(jù)庫:

"Provider=MSDAORA.1;Data Source=serverName;User ID=userName;Password=userPassword;"

inline BOOL ConnectDB(CString sConnection)
{
    try
    {
        m_pConnection->Open(_bstr_t(sConnection), "", "", adModeUnknown);
    }
    catch (_com_error e)
    {
        AfxMessageBox("連接數(shù)據(jù)庫失敗,錯誤信息:%s", e.ErrorMessage());
        return FALSE;
    }
    return TRUE;
}

(5) 查詢:

BOOL Query(CString SqlCommand)
{
    try
    {
        m_pRecordset->Open((_bstr_t) SqlCommand, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error* e)
    {
        AfxMessageBox(e->ErrorMessage());
        return FALSE;
    }
    return TRUE;
}

(6) 修改記錄:

_variant_t vNULL;
CString SqlCommand = "UPDATE TableName SET …[ WHERE…]";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(7) 添加記錄:

_variant_t vNULL;
CString SqlCommand = "INSERT INTO TableName (…) VALUES (…)[ WHERE…]";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(8) 刪除記錄:

_variant_t vNULL;
CString SqlCommand = "DELETE FROM TableName WHERE …";
m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);

(9) 統(tǒng)計(jì)。參數(shù)SqlCommand的形式如下:

1. 統(tǒng)計(jì)紀(jì)錄數(shù):SELECT COUNT(*) FROM TableName[ WHERE…]

2. 統(tǒng)計(jì)字段總和:SELECT SUM FieldName FROM TableName[ WHERE…]

3. 統(tǒng)計(jì)字段平均值:SELECT AVG FieldName FROM TableName[ WHERE…]

4. 統(tǒng)計(jì)字段最大值:SELECT MAX FieldName FROM TableName[ WHERE…]

5. 統(tǒng)計(jì)字段最小值:SELECT MIN FieldName FROM TableName[ WHERE…]

inline _variant_t Statistics(CString SqlCommand)
{
    _variant_t vNULL;
    _RecordsetPtr pRecordset;
    pRecordset = m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    _variant_t vCount = pRecordset->GetCollect((_variant_t) (long) 0);
    pRecordset->Close();
    Recordset.Release();
    return vCount;
}



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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产精品免费视频专区| 亚洲国产婷婷六月丁香| 日韩精品人妻少妇一区二区| 国产在线视频好看不卡| 正在播放玩弄漂亮少妇高潮| 男生和女生哪个更好色| 四季精品人妻av一区二区三区| 久草视频这里只是精品| 狠狠亚洲丁香综合久久| 熟女白浆精品一区二区| 国产精品免费视频专区| 亚洲天堂有码中文字幕视频| 在线懂色一区二区三区精品| 国产成人精品国产成人亚洲| 久久永久免费一区二区| 天堂网中文字幕在线观看| 视频一区二区黄色线观看| 久久国内午夜福利直播| 中文字幕人妻一区二区免费| 儿媳妇的诱惑中文字幕| 久久99亚洲小姐精品综合| 亚洲五月婷婷中文字幕| 黄色片一区二区在线观看| 日本深夜福利在线播放| 久久国产人妻一区二区免费| 日韩一本不卡在线观看| 欧美日韩亚洲精品内裤| 日韩三级黄色大片免费观看| 日韩精品中文字幕在线视频| 加勒比人妻精品一区二区| 好吊色免费在线观看视频| 免费在线成人激情视频| 国产91色综合久久高清| 欧美国产亚洲一区二区三区| av一区二区三区天堂| 尹人大香蕉中文在线播放| 欧美大粗爽一区二区三区| 欧美精品在线播放一区二区| 亚洲一区在线观看蜜桃| 欧美激情中文字幕综合八区| 97人妻精品一区二区三区免|