ado使用方法
一、直接使用控件:
就是普通的OCX控件操作,簡單的要命。首先選中菜單Project->Add To Project->Components And Control…,在對話框中選中Registered ActiveX Controls目錄下的Microsoft ADO Data Control 6.0 (SP4) (OLEDB)然后點擊Insert,把ADO控件的類文件導入到當前工程之中。此時你的控件工具條(Controls工具條)上就多了一個淺綠色的控件,把拖到你的對話框中,……(作者此處刪去500字)。
需要注意的是不要忘記包含各個導入類的頭文件,否則編譯通不過。
二、使用ADO的智能指針:
雖然相關介紹滿天飛,為了保持文章的完整,還是簡單介紹一下吧!
1、引入ADO庫文件,一般是在stdAfx.h文件中添加
#import <msado15.dll> no_namespace rename( "EOF", "adoEOF" )
這條語句會在工程所在目錄生成msado15.tlh和msado15.tli兩個文件。
2、初始化Com環境
在CMyApp::InitInstance()函數中加入:
if ( FAILED(::CoInitialize(NULL)) )
{
::AfxMessageBox( "Com Init Fail !" );
::exit(0);
}
在CMyApp::ExitInstance()函數中加入
m_pRS -> Close();
m_pRS = NULL;
m_pConn -> Close();
m_pConn = NULL:
::CoUninitialize();
3、在你的類聲明文件中加入智能指針對象實例的定義,做為成員變量,
_ConnectionPtr m_pConn;
_RecordsetPtr m_pRs;
A、使用之前先初始化,
//初始化ADO成員
TESTHR( m_pConn.CreateInstance(__uuidof(Connection ) ) );
TESTHR( m_pRs.CreateInstance(__uuidof( Recordset) ) );
其中TESTHR定義如下:
void TESTHR(HRESULT x) {
??? if FAILED(x)
???? _com_issue_error(x);
??? };
B、然后就是連接數據庫,獲取Recordset……用不著我多說了吧,代碼如下:
//Open Connection
TESTHR( m_pConn->Open( strConn/*連接字符串*/, "", "", adConnectUnspecified ) );
//Open table
TESTHR( m_pRs->Open( SQL/*SQL查詢語句*/,
_variant_t((IDispatch*)m_pConn, true),
adOpenKeyset,//adOpenForwardOnly,
adLockReadOnly,
adCmdText) );
三、常用操作
1、打開記錄集:
m_pRS=m_pConn->Execute(CommandText,RecordsAffected,Options)
說明如下:
CommandText:包含要執行的SQL語句,表名、存儲過程名或特定提供者的文本;
RecordsAffected:可選,長整型,提供者返回操作的影響的記錄數目;
Options:常量,可選,長整型,具體如下:
adCmdText:指示提供者應將CommandText賦值為命令的文本定義
adCmdTable:返回CommandText命名的表中的所有行
adCmdTableDirect:與上類同,返回表的所有行
adCmdStoredProc:應將CommandText賦值為存儲過程
adCmdUnknown:CommandText參數中的命令類型未知
adExecuteAsync:命令應異步執行
adFetchAsync:指示CacheSize屬性指定的初始數量之后的行應異步提取。
例:m_pRS=m_pConn->Execute(L"select * from p_users",NULL,adCmdText);
2、使用記錄集
A、讀取數據
_variant_t varValue;
varValue=m_pRS->GetFields()->GetItem((long)i)->Value;//讀取當前記錄的第i+1個字段的值
varValue=m_pRS->GetFields()->GetItem((long)i)->Name;//讀取當前記錄的第i+1個字段的名字
也可根據字段名來訪問該字段的值:
varValue=m_pRS->GetCollect(L"字段名"); //讀取當前記錄的第i+1個字值的值
B、更新數據
_bstr_t bstrValue="新數據";
m_pRS->GetFields()->GetItem((long)i)->Value=bstrValue; //更新當前記錄第i+1個字段的值
m_pRS->Update();
C、添加數據
if (m_pRS->Support(adAddNew)&&m_pRS->Support(adUpdate))
{
m_pRS->AddNew();//插入一條新記錄
m_pRS->GetFields()->GetItem((long)0)->Value=L"YP00100"; //為每個字段賦值
m_pRS->GetFields()->GetItem((long)1)->Value=L"速效感冒膠囊";
m_pRS->GetFields()->GetItem((long)2)->Value=L"SXGMJN";
m_pRS->Update();//更新記錄集
}
D、刪除數據
m_pRS->Delete(adAffectCurrent);//默認,僅刪除當前記錄
m_pRS->Delete(adAffectGroup);//刪除滿足當前Filter屬性設置的記錄。
以上操作相對麻煩,采用Connection對象的Execute方法,可能更簡單些,舉例如下:
添加數據:
CString sSql,sName,sXingBie,sStipend,sID;
sName="張三";
sXingBie="男";
sStipend="2200";
sID="5";
sSql.Format("insert into 員工信息表 Value(%s,%s,%s,%s)",sName,sXingBie,sStipend,sID);
m_pRS=m_pConn->Execute((_bstr_t)sSql,NULL,adCmdText);
其它操作類同。
四、使用Visual C++ Extensions for ADO(以下簡稱ADO Extensions)操作數據表。
這東東是專為VC++程序言準備的,筆者認為使用起來很方便。可遺憾的是相關介紹少之又少,連微軟的MSDN上也只是寥寥數筆,真讓人摸不著頭腦。所以只好根據使用經驗講講。
要使用ADO Extensions 首先要完成以上第二種方法的所有步驟,實現ADO的智能指針調用,然后再實現一個IADORecordBinding類型的指針,用它將一個Recordset和一個定義好的類綁定到一起,這樣你就可以象操作C++的類一樣操作數據表了,還免去了自己處理VARIANT變量類型的諸多不便。
首先定義一個與數據表相對應的類,用于綁定,
#include <icrsint.h>//Head File Of IADORecordBinding
class CTabClass : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTabClass)
//( 列序號,字段類型,緩沖區,…)
ADO_NUMERIC_ENTRY ( 1, adDecimal, m_nWID, 38/*精度*/, 0/*小數位*/, s_nWID,false)
ADO_VARIABLE_LENGTH_ENTRY2( 2, adVarChar, m_Word, sizeof(m_Word), s_Word,??? TRUE)
ADO_FIXED_LENGTH_ENTRY ( 3, adSmallInt, m_nLWord,s_nLWord, TRUE)
ADO_VARIABLE_LENGTH_ENTRY2( 4, adChar, m_Attr, sizeof(m_Attr), s_Attr, TRUE)
ADO_FIXED_LENGTH_ENTRY?? ( 7,adInteger,m_nType, s_nType,TRUE)
END_ADO_BINDING()
public:
//與各字段對應的變量
DECIMAL m_nWID;???
CHAR m_Word[MAX_WORD+1];
INT m_nLWord;??
INT m_nType;????
CHAR m_Attr[MAX_ATTR+1];
//以上各變量綁定后的狀態
ULONG s_nWID;???
ULONG s_nLWord;
ULONG s_Word;???
ULONG s_Attr;
ULONG s_nType;??
public:
//成員函數
CTabWord()
{
InitTab();
}
void InitTab();??? //初始化各成員變量的值。
};
注意,將 begin_ado_binding 和 end_ado_binding 宏之間的綁定條目用括號括起。不要在綁定條目結尾使用逗號或分號,因為這些定界符僅限在宏中使用。
ado_variable_length_binding
_entry2的參數說明如下:
參數1:按順序的字段號碼,1為標識記錄集中第一字段,2為標識記錄集中第二字段,依此類推。
參數2:儲存已轉換字段的變量的數據類型。
參數3:臨時的工作緩沖區,用于將字段值從 variant轉換為c/c++ 變量。
參數4:變長變量所需的字節數。
參數5:指示字段轉換是否成功。
參數6:布爾標志。如果為 true,則表明 ado 可以更新綁定的字段。如只檢查字段而不將其更改,可設置為 false。
其中第5個參數為狀態參數,它可告訴你從 recordset 字段到c或c++變量的轉換是否成功以及變量的內容是否有效。該參數的兩個最重要的值是adfldok(意味著轉換成功)和adfldnull(意味著字段是null,即無值可供轉換)。程序中要檢測該參數以決定c或c++變量是否有效。例如,如果字段具有有效的行內容,狀態將會是adfldok,如果移動到另一個字段為 null 的行,則狀態將是 adfldnull。
這里順便再提一句:IADORecordBinding與IRecordset是由同一個類實現的不同接口,所以當你移動的記錄指針時不要忘記另一個接口的記錄指針也被移動了。
總結
- 上一篇: java截取文件名后缀
- 下一篇: Git 客户端的安装与使用