SQL數據庫開發基礎

1.MFC ODBC數據庫開發技術

 

1.利用ODBC建立數據源

2.數據庫連接

    1).包含頭文件    #include <afxdb.h>

    2).對數據源進行操作之前需要定義一個CDatabase對象,代碼如下

        CDatabase m_db;

    3).調用CDatabase的成員函數OpenEx建立和數據源的連接,代碼如下

 

        try
       {
            m_db.OpenEx(L"DSN=test;UID=sa;PWD=", CDatabase::noOdbcDialog);
       } 
       catch(_com_error e)
      {
            MessageBox(L"連接數據庫失敗");
      } 

      其中DSN爲數據源名稱,UID數據庫用戶名,PWD爲相應的密碼

3.數據庫操作

 

查詢記錄

CRecordset rs(&m_db);    //CRecordset rs; rs = &m_db;

rs.Open(CRecordset::dynaset, L"SELECT * FROM test");   //詳見MSDN

 

獲得字段值   

GetFieldValue

 

添加,刪除,修改記錄方法如下

1.先定義相應操作的SQL語句

2.調用ExecuteSQL函數即可

 

 

ADO數據庫開發技術

 

 

 

1.ADO是Windows環境中比較流行的數據庫編程技術。它是建立在OLE DB底層技術之上的高級編程接口,因而具有強大的數據處理功能和簡單易用的編程接口,並且得到了廣泛的應用。

ADO的底層是OLE DB(微軟的戰略性的通向不同的數據源的低級應用程序接口),所以不僅能訪問關係型數據庫,也可以訪問非關係型數據庫,更是現在最快速的數據庫訪問中間層。

 

2.ADO主要對象介紹

1).

Connection Object(連接對象)

Command Object(命令對象)

RecordSet Object(記錄集對象)

Field Object(字段對象)

Record Object(記錄對象)

Error Object(錯誤對象)

Parameter Object(參數對象)

Property Object(屬性對象)

Stream Object(流對象)

其中最重要的是Connection Object(連接對象),Command Object(命令對象),RecordSet Object(記錄集對象)

 

Connection Object:連接對象代表了一個和數據源的連接,之後的數據庫操作都是建立在這個連接上。

Command Object:命令對象用來處理數據庫的一些操作,在某些方面具有和連接對象相同的功能,例如都可以可行標準的SQL語句以及存儲過程,不過命令對象可以返回帶有記錄集的結果。

RecordSet Object:記錄集對象代表了一個記錄集,用來訪問記錄集。

在使用這三個對象之前,需要定義與之對應的3個職能指針,分別爲_ConnectionPtr, _CommandPtr, _RecordsetPtr,然後調用它們的CreateInstance函數進行實例化,從而創建這3個對象的實例。

 

2)._bstr和_variant_t類

在利用ADO進行數據庫開發時,_bstr_t和_variant_t兩個類很有用,從來省去了BSTR和VARIANT類型轉換的麻煩。

COM編程不適用CString類,因爲COM必須設計成跨平臺,它需要一種更普遍的方式來處理字符串以及其他數據類型。

 

3).引入ADO庫

在StdAfx.h末尾處引入ADO庫文件

#import "C:/Program Files/Common Files/System/ado" no_namespace rename("EOF", "adoEOF")

使用預處理指令import使程序在編譯過程中引入ADO動態庫(msado115.dll).no_namespace表明不使用命名空間。rename("EOF", "adoEOF")表明把ADO中用到EOF改爲adoEOF,防止發生命名衝突。 

注意:利用應用程序嚮導進行ADO數據庫開發時,需要在程序嚮導的第二步選擇(Automation)選項,使應用程序能夠支持“自動操作”的方式。

 

數據庫連接

_ConnectionPtr m_pConnection;    //定義一個_ConnectionPtr指針

m_pConnection.CreateInstance(_uuidof(Connection));    //調用CreateInstance方法實例化

最後,調用Connection對象的Open函數創建數據庫連接,Open函數原型如下。

HRESULT Open(

    _bstr_t ConnectiongString,

    _bstr_t UserID,

    _bstr_t Password,

    long Options);

其中,ConnectionString是一個包含連接信息的字符串,UerID是訪問數據庫的用戶名,Password是訪問數據庫的祕密,Options爲可選參數。如果在ConnectiongString中包含了數據庫用戶名和密碼,UerID和Password值可以爲空。

 

下面附上一些代碼說明(代碼爲我寫的“壁虎桌面日曆”部分代碼)

連接數據庫

m_pConn.CreateInstance(__uuidof(Connection));
 
 wchar_t wPath[200];
 GetModuleFileName(NULL,wPath,200);
 PathRemoveFileSpec(wPath);
 wcscat(wPath,L"//AnyCaler.mdb");
 wchar_t wConn[400];
 wsprintf(wConn,L"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = %s; Persist Security Info=FALSE",wPath);
 
 try
 {
  m_pConn->Open(wConn, "", "", adConnectUnspecified);
 }
 catch(_com_error e)
 {
  /*
  CString errorMsg;
  errorMsg.Format(_T("連接數據庫失敗!/n%s"), e.ErrorMessage());
  LPCTSTR errMsg;
  errMsg = (const WCHAR*)(errorMsg.AllocSysString());
  AfxMessageBox(errMsg);*/
  MessageBox(NULL,L"數據庫連接失敗!",L"警告",MB_ICONWARNING);
  exit(0);
 }

 

查詢 添加記錄 修改記錄

_RecordsetPtr rst;
   _variant_t var;
   HRESULT hr;

   rst.CreateInstance(_uuidof(Recordset));  //打開連接
   char sqlStr[100] = {0};
   sprintf(sqlStr, "SELECT * FROM MemoInfo WHERE Date = '%d-%d-%d'", 
    m_MemoDlg.m_year, m_MemoDlg.m_month, m_MemoDlg.m_date);


   try
   {
    hr = rst->Open(sqlStr, m_pConn.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText);
   }
   catch(_com_error *e)
   {
    AfxMessageBox(e->ErrorMessage());
   }
   if (rst->adoEOF)
   {
    rst->AddNew();
    rst->PutCollect("Date", _variant_t(tempDateStr));
    rst->PutCollect("Time", _variant_t(tempTimeStr));
    rst->PutCollect("Memo", _variant_t(m_memo));
    rst->PutCollect("Warn", _variant_t(m_MemoDlg.checkRemind));
    rst->PutCollect("Shark", _variant_t(m_MemoDlg.checkShake));
    rst->PutCollect("Card", _variant_t(m_MemoDlg.checkPopWindow));
    rst->PutCollect("Sound", _variant_t(m_MemoDlg.checkPopWindow));
    rst->PutCollect("Del", _variant_t("1"));
    rst->Update();
   }
   else
   {
    rst->PutCollect("Date", _variant_t(tempDateStr));
    rst->PutCollect("Time", _variant_t(tempTimeStr));
    rst->PutCollect("Memo", _variant_t(m_memo));
    rst->PutCollect("Warn", _variant_t(m_MemoDlg.checkRemind));
    rst->PutCollect("Shark", _variant_t(m_MemoDlg.checkShake));
    rst->PutCollect("Card", _variant_t(m_MemoDlg.checkPopWindow));
    rst->PutCollect("Sound", _variant_t(m_MemoDlg.checkPopWindow));
    rst->PutCollect("Del", _variant_t("1"));
    rst->Update();
   }
   rst->Close();
   rst = NULL;

 

刪除

rst->Delete(adAffectCurrent);

 

備註:_ConnectionPtr對象可申明爲全局變量,在App的InitInstance函數中連接數據源,在ExitInstance斷開數據源連接;每個_RecordSet指針在使用完之後記得Close並附空值。

 

 

還可以利用ADO數據控件進行數據庫編程,具體參考Visual C++++++ SQL Server數據庫開發與實例

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章