學習ADO和ODBC訪問資料庫的一些思路整理

來源:互聯網
上載者:User
ado|odbc|訪問|資料|資料庫

  最近一直在學習研究用vc++訪問資料庫的問題,使用過ADO,也使用過ODBC。就這兩種串連資料來源的介面都有好幾種方式,可以利用database,也可以利用dataset。利用這個word把我學習的思路整理一下。

  一、使用ADO串連資料來源

  一般來說當建立基於對話方塊的應用程式時,都選擇使用ADO比較方便(這純屬個人習慣問題)。

  1.直接在應用程式中建立與資料庫的connection

  2.自己寫一個ADOConnection類作為應用程式操作資料庫的介面,這樣操作的層次更明顯,程式的分層思想也體現較好。

  下面分別就這兩種方法做個總結。

  1.直接在應用程式中建立與資料庫的connection

  在應用程式中要使用ADO,則需要引入ADO的動態串連庫。其方法為:

在StdAfx.h中:

   #import "c:\program files\common files\system\ado\msado15.dll"\

    no_namespace\

    rename("EOF","adoEOF")

  目的:產生msado15.tlh和msado15.tli兩個標頭檔來定義ADO庫。

    定義好ADO庫後,應初始化COM庫環境。其方法為:

  在C***APP::InitInstance中定義_ConnectionPtr m_pConnection;

    AfxOleInit();//使用AfxOleInit初始化OLE/COM庫環境

  //建立ADO串連

    m_pConnection.CreateInstance(_uuidof(Connection));

    //在ADO操作中使用try...catch捕獲錯誤

    try

    {      m_pConnection->Open("provider=SQLOLEDB;server=ZENGYH;database=postms;uid=sa;pwd=hongyi","","",adModeUnknown);

    }

    catch (_com_error e)

    {

       AfxMessageBox("串連資料庫失敗!");

       return FALSE;

    }

  而相應的釋放資料庫的串連:

在C***APP:: ExitInstance中:

m_pConnection->Close();

    ::OleUninitialize();

  至此,關於資料庫的串連與斷開就能順利實現,接下來將是對資料庫中表的操作,即對記錄集操作。 當操作資料庫的表時,需先聲明資料集指標:_RecordsetPtr m_pRecordset; 與建立ADO串連類似,需要在所操作的對話方塊類的OnInitDialog()中建立記錄集對象:

m_pRecordset.CreateInstance(_uuidof(Recordset));

    如此之後將可以使用m_pRecordset來查詢,修改,刪除資料庫等。

    開啟要操作的表可使用m_pRecordset的open函數m_pRecordset->Open("select * from STUDENTS",theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

  記錄集的查詢操作:

  使用可以使用如下的函數來實現記錄集的移動Movefirst, movenext , moveprev,movelast。

  提取列屬性:getcollect(“列名”),注意:此處的傳回值類型為:_variant_t,這個類型類包含了許多與c++所支援的類型的轉換函式,較常用的是與cstring類型的轉換(LPCSTR)_bstr_t(_variant_t類型變數)。

  記錄集的增加操作:

  確保要操作的記錄集開啟之後,首先調用m_pRecordset->addnew(),addnew之後將自動產生一個供記錄集域值使用的新的空記錄,來存放即將增加的資料資訊,系統將自動執行sql的insert語句來插入記錄。

  然後通過設定列屬性:putcollect(“列名”,_variant_t &pvar)來設定記錄資訊

  設定之後一定要調用m_pRecordset->update來更新記錄集

  記錄集的修改操作:

  修改操作與增加操作類似,唯一不同之處在於不用先調用addnew,而直接將記錄集指標移動到需要修改的記錄處,執行putcollect操作。

  之後再update。

  記錄集的刪除操作:

  當找到需要刪除的記錄時,利用m_pRecordset->Delete(adAffectCurrent);可以刪除當前的記錄。 再update即可。

  當然,在每次需要對記錄集操作之前應當開啟需要操作的表的記錄集,操作完畢應關閉相應記錄集,這樣可以保證只聲明一個記錄集指標,每次只操作一個記錄集,可以節約資源。

  另外,在修改和刪除操作中也可能需要查詢滿足條件的記錄,可以這樣實現:

str.Format("select * from STUDENTS where StuID='%s'",m_StuID);      m_pRecordset->Open(str.AllocSysString(),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

  2.自己寫一個ADOConnection類作為應用程式操作資料庫的介面

  通過自訂的ADOConnection類封裝與應用程式操作資料庫的介面(在這個類中應首先聲明_connectionptr 和_recordsetptr指標),這個類中要實現的功能包括:定義ADO庫,初始化與ADO的串連,釋放串連,初始化記錄集(方法1的初始化是在相應類的OnInitDialog()中實現),執行SQL語句

  定義ADO庫,初始化與ADO的串連,釋放串連與方法1一致;

  初始化記錄集:

_RecordsetPtr & CAdoConnection::GetRecordset(_bstr_t mySql)

{

    try

    {

       if (m_pConnection==NULL)

       {

           OnInitAdoConneciton();

       }

       m_pRecordset.CreateInstance(_uuidof(Recordset));

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

    }

    catch (_com_error *e)

    {

       AfxMessageBox(e->ErrorMessage());

    }

    return m_pRecordset;

}

  執行SQL語句主要使用connection來實現(不同於方法1利用記錄集來實現)

bool CAdoConnection::ExecuteSql(_bstr_t mySql)

{ m_pConnection->Execute(mySql,NULL,adCmdText);}

  至此,在應用程式中可以通過定義這個ADOConnection的執行個體來完成相應的操作。

  查詢操作:

  首先定義ADOConnection,執行初始化ADO串連; 根據查詢條件取得記錄集指標:

_bstr_t mySql="select * from COURSES where CouID='"+m_CouID+"'";

_RecordsetPtr myRecordset=myConnection.GetRecordset(mySql);

  根據指標的返回情況進行處理。

  添加操作:

  首先根據實際情況判斷所要添加的記錄是否存在(類似查詢); 若返回的指標是為空白,則說明要添加的記錄不存在,則可以執行insert:

mySql="insert into COURSES values('"+m_CouID+"','"+m_CouName+"',"+CouScore+","+CouTea+",'"+m_CouKind+"')";

myConnection.ExecuteSql(mySql);

  修改操作、刪除操作:

  與添加操作類似,執行update和delete語句

  說明:每個函數中的初始化ADOConnection和釋放應相對應。

    與方法1相比,不需要單條操作記錄集,記錄集指標也可以聲明多個,執行sql語句更方便。

  記錄集的初始化可以通用到ADOConnection類中,而無需方法1中在不同的類中初始化各自的記錄集。

  二、使用ODBC串連資料來源

  一般來說建立基於文檔視圖的應用程式時,使用此方法串連資料來源。

  1.使用CDatabase類中的executesql執行SQL語句

  當建立基於單文檔的應用程式時,若在第二步選擇database view with file support,則需要配置ODBC資料來源(如student表),並且產生的應用程式的基類為recordview。那麼產生的應用程式的Doc類中將自動產生所繫結資料集類(cstudentset m_studentset),View類中將自動產生(cstudentset *m_pset)。

  串連資料庫:

  對資料庫的串連要重載BOOL CStudentDoc::OnNewDocument():

  在該函數中加入這樣的代碼(m_database是我在文檔類中定義的成員變數CDatabase):

if(m_pStudentSet==NULL)

    {

       m_pStudentSet=new CStudentSet(&m_database);

       CString strConnect=m_pStudentSet->GetDefaultConnect();

       m_database.Open(NULL,false,false,strConnect,false);

    }

  這裡m_pStudentSet是在該文檔類中重新定義的一個CStudentSet記錄集指標,至此可以建立應用程式與資料庫的串連。 添加記錄操作:

  在相應函數中聲明CDatabase m_database

  在函數中定義CStudentSet mySet(&m_database);

  再開啟記錄集myset.open();

mySet.AddNew();

    CString mySql;

    mySql="insert into STUDENTS(StuID,StuName) values('"+m_pSet->m_StuID+"','"+m_pSet->m_StuName+"')";

    m_database.ExecuteSQL(mySql);

    mySet.Update();

  刪除記錄、修改記錄操作:

  在函數中定義CStudentSet mySet(&m_database);

  再開啟記錄集myset.open();

mySet.Edit();

mysql=…….

m_database.ExecuteSQL(mySql);

mySet.Update();

  查詢記錄操作:

  仍然可以選用記錄集指標的移動,getcollect來實現。

  最後,不要忘記myset.close()。

  當然也可以使用CRecordset類來執行查詢、刪除、修改、添加操作。基本方法跟前面所提到的一致。這是我第一次在部落格裡面發文章,對於不成熟或者不正確的思想還請大家提出,謝謝。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。