VC++以ADO方式串連SQL SERVER

來源:互聯網
上載者:User

VC++以ADO方式串連SQL SERVER

 

一、引用ADO庫

     用#import引入ADO庫檔案,在程式的標頭檔中引用它(例如:stdafx.h)。

 

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

 

 

二、初始化COM庫

 

::CoInitialize(NULL);

 

 

三、使用ADO庫中採用的介面

     ADO庫包含三個基本介面:_ConnectionPtr介面、_CommandPtr介面和_RecordsetPtr介面。

_ConnectionPtr介面返回一個記錄集或一個null 指標。通常使用它來建立一個資料連線或執行一條不返回任何結果的SQL語句,如一個預存程序。使用_ConnectionPtr介面返回一個記錄集不是一個好的使用方法。通常同CDatabase一樣,使用它建立一個資料連線,然後使用其它對象執行資料輸入輸出操作。

_CommandPtr介面返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的預存程序和SQL語句。在使用_CommandPtr介面時,你可以利用全域_ConnectionPtr介面,也可以在_CommandPtr介面裡直接使用串連串。如果你只執行一次或幾次資料訪問操作,後者是比較好的選擇。但如果你要頻繁訪問資料庫,並要返回很多記錄集,那麼,你應該使用全域_ConnectionPtr介面建立一個資料連線,然後使用_CommandPtr介面執行預存程序和SQL語句。

_RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr介面一樣,它不一定要使用一個已經建立的資料連線,可以用一個串連串代替串連指標賦給_RecordsetPtr的connection成員變數,讓它自己建立資料連線。如果你要使用多個記錄集,最好的方法是同Command對象一樣使用已經建立了資料連線的全域_ConnectionPtr介面,然後使用_RecordsetPtr執行預存程序和SQL語句。

1、使用_ConnectionPtr串連資料庫(兩種方式)

 

串連資料庫代碼

在程式標頭檔中,定義對象
  _ConnectionPtr m_pConnection;//連線物件
在程式中,串連資料庫的程式如下:
   HRESULT hr; 
   try 
   { 
     hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));//建立Connection對象 

    if(SUCCEEDED(hr)) 
    { 
     hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=servername;SERVER=database;UID=sa;PWD=;","","",adModeUnknown);
     //這是採用非DSN方式串連資料庫字串,其中servername,"資料庫伺服器名";database,"資料庫名";UID,"使用者名稱";PWD,"密碼";
     //hr=m_pConnection->Open("DSN=database;UID=sa;PWD=;","","",adModeUnknown);     
     //這是採用DSN方式串連資料庫字串,其中database,"在DSN中定義的資料來源"
    }
    else
    {
      AfxMessageBox(_T("串連不成功!"));
    }
  }
  catch(_com_error e)///捕捉異常 
  { 
   CString errormessage; 
   errormessage.Format(_T("串連資料庫失敗!\r\n錯誤資訊:%s"),e.ErrorMessage()); 
   AfxMessageBox(errormessage);///顯示錯誤資訊 
  } 

 

 

  2、使用_RecordsetPtr介面

 

擷取表資料代碼

_RecordsetPtr MySet;  //定義記錄集對象
MySet.CreateInstance(__uuidof(Recordset));
MySet->Open("SELECT * FROM some_table",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//下面代碼我們用_RecordsetPtr介面擷取記錄集資料並填充這個ListBox控制項(m_list):
_variant_t Holder
try{
  while(!MySet->adoEOF)
  {
    Holder = MySet->GetCollect("FIELD_1");                 //資料庫中表欄位名
    if(Holder.vt!=VT_NULL)
    m_List.AddString((char*)_bstr_t(Holder));
    MySet->MoveNext();
  }
}
catch(_com_error * e) 
{
  CString Error = e->ErrorMessage();
  AfxMessageBox(e->ErrorMessage());
}

 

  3、使用_CommandPtr介面

 

以命令及資料集方式擷取表中資料代碼

_CommandPtr pCommand;
_RecordsetPtr MySet;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=m_pConnection;
pCommand->CommandText="select * from some_table";
pCommand->CommandType=adCmdText; 
pCommand->Parameters->Refresh();
MySet=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t TheValue = MySet->GetCollect("FIELD_1");
CString sValue=(char*)_bstr_t(TheValue);

 

 

4、資料類型轉換

     由於COM對象是跨平台的,它使用了一種通用的方法來處理各種類型的資料,因此CString 類和COM對象是不相容的,我們需要一組API來轉換COM對象和C++類型的資料。_vatiant_t和_bstr_t就是這樣兩種對象。它們提供了通用的方法轉換COM對象和C++類型的資料。

 

 

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.