VC 下使用ADO編寫資料庫程式

2021-07-05 17:40:13 字數 4496 閱讀 4755

(1)、引入ado類

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

no_namespace\

rename("eof", "adoeof")   

(2)、初始化com

在mfc中可以用afxoleinit();非mfc環境中用:coinitialize(null);

couninitialize();

(3)#import包含後就可以用3個智慧型指標了:_connectionptr、_recordsetptr和_commandptr

1.連線和關閉資料庫

(1)連線

例子:連線access資料庫

_connectionptr m_pconnection;

m_pconnection.createinstance(__uuidof(connection));

try                

catch(_com_errore)

(2)、關閉

//如果資料庫連線有效

if(m_pconnection->state)

m_pconnection->close();

m_pconnection=null; 

2.開啟乙個結果集

(1)開啟,首先建立乙個_recordsetptr例項,然後呼叫open()得到一條sql語句的執行結果

_recordsetptr   m_precordset;

m_precordset.createinstance(__uuidof(recordset));

// 在ado操作中建議語句中要常用try...catch()來捕獲錯誤資訊,

// 因為它有時會經常出現一些意想不到的錯誤。jingzhouxu

try

catch(_com_error*e)

(2)關閉結果集m_precordset->close();

3.操作乙個結果集

(1)、遍歷(讀取)

a)、用precordset->adoeof來判斷資料庫指標是否已經移到結果集的末尾了;m_precordset->bof判斷是否在第一條記錄前面: while(!m_precordset->adoeof)

b)、取得乙個欄位的值的辦法有兩種辦法

一是 //表示取得第0個字段的值m_precordset->getcollect("name");

或者m_precordset->getcollect(_variant_t(long(0));

二是 precordset->get_collect("column_name");

或者precordset->get_collect(long(index));

(2)、新增

a)、呼叫m_precordset->addnew();

b)、呼叫m_precordset->putcollect();給每個字段賦值

c)、呼叫m_precordset->update();確認

(3)、修改

(4)、刪除

a)、把記錄指標移動到要刪除的記錄上,然後呼叫delete(adaffectcurrent)try

catch(_com_error*e)

4.直接執行sql語句,除了要用到結果集其餘的大部分功能都可以直接用sql語言實現

(1)、用_commandptr和_recordsetptr配合

_commandptr     m_pcommand;

m_pcommand.createinstance(__uuidof(command));

// 將庫連線賦於它

m_pcommand->activeconnection= m_pconnection; 

// sql語句

m_pcommand->commandtext= "select * from demotable"; 

// 執行sql語句,返回記錄集

m_precordset= m_pcommand->execute(null, null,adcmdtext);  

(2)、直接用_connectionptr執行sql語句

_recordsetptrconnection15::execute ( _bstr_t commandtext,

variant * recordsaffected,

longoptions )

其中commandtext是命令字串,通常是sql命令。

引數recordsaffected是操作完成後所影響的行數,

引數options表示commandtext中內容的型別,options可以取如下值之一:

adcmdtext:表明commandtext是文字命令

adcmdtable:表明commandtext是乙個表名

adcmdproc:表明commandtext是乙個儲存過程

adcmdunknown:未知

例子:

_variant_trecordsaffected;

m_pconnection->execute("updateusers set old = old+1",&recordsaffected,adcmdtext); 

5.呼叫儲存過程

(1)、利用_commandptr

_commandptr m_pcommand;

m_pcommand.createinstance(__uuidof(command));

m_pcommand->activeconnection= m_pconnection;  // 將庫連線賦於它

m_pcommand->commandtext= "demo"; 

m_pcommand->execute(null,null,adcmdstoredproc);   

(2)、直接用_connectionptr直接呼叫(見4.(2))

6.遍歷資料庫中的所有表名_connectionptr m_pconnect;

_recordsetptrpset;

hresulthr;

try

pset->movenext();   

}  pset->close(); 

}  m_pconnect->close(); 

}catch(_com_errore)///捕捉異常

7.遍歷乙個表中的所有字段

field *   field = null;    

hresult   hr;

fields*  fields = null;

hr =m_precordset->get_fields (&fields);    //得到記錄集的字段集和 

if(succeeded(hr))

fields->get_count(&colcount);  

//得到記錄集的字段集合中的字段的總個數 

for(i=0;iitem[i]->get_name(&bstrcolname);   //得到記錄集//中的欄位名

strcolname=bstrcolname;

namefield = strcolname;

m_fieldslist.addstring(namefield); }

if(succeeded(hr))

fields->release();//釋放指標

附: 1、_variant_t

(1)、一般傳給這3個指標的值都不是mfc直接支援的資料型別,而要用_variant_t轉換一下

_variant_t(xx)可以把大多數型別的變數轉換成適合的型別傳入:

(2)、_variant_tvar;_variant_t -> long: (long)var;

_variant_t-> cstring: cstring strvalue = (lpcstr)_bstr_t(var);

cstring-> _variant_t: _variant_t(strsql);

2、bstr寬字串與cstring相互轉換

bstrbstr;

cstringstrsql;

cstring-> bstr: bstr = strsql.allocsysstring();

bstr-> cstring: strsql = (lpcstr)bstr;

3、_bstr_t與cstring相互轉換

_bstr_tbstr;

cstringstrsql;

cstring-> _bstr_t: bstr = (_bstr_t)strsql;

_bstr_t-> cstring: strsql = (lpcstr)bstr;

4、關於時間

access:表示時間的字串#2004-4-5#

sql:表示時間的字串''2004-4-5''

datefield(時間字段)select * from my_table where datefield > 2004-4-10

VC 下使用ADO編寫資料庫程式

準備 1 引入ado類 import c program files common files system ado msado15.dll no namespace rename eof adoeof 2 初始化com 在mfc中可以用afxoleinit 非mfc環境中用 coinitializ...

VC 下使用ADO編寫資料庫程式

準備 1 引入ado類 import c program files common files system ado msado15.dll no namespace rename eof adoeof 2 初始化com 在mfc中可以用afxoleinit 非mfc環境中用 coinitializ...

VC 下使用ADO編寫資料庫程式

vc 下使用ado編寫資料庫程式 準備 1 引入ado類 import c program files common files system ado msado15.dll no namespace rename eof adoeof 2 初始化com 在mfc中可以用afxoleinit 非mf...