日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ado使用方法

發(fā)布時(shí)間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ado使用方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、直接使用控件:

就是普通的OCX控件操作,簡單的要命。首先選中菜單Project->Add To Project->Components And Control…,在對話框中選中Registered ActiveX Controls目錄下的Microsoft ADO Data Control 6.0 (SP4) (OLEDB)然后點(diǎn)擊Insert,把ADO控件的類文件導(dǎo)入到當(dāng)前工程之中。此時(shí)你的控件工具條(Controls工具條)上就多了一個(gè)淺綠色的控件,把拖到你的對話框中,……(作者此處刪去500字)。
需要注意的是不要忘記包含各個(gè)導(dǎo)入類的頭文件,否則編譯通不過。

二、使用ADO的智能指針:

雖然相關(guān)介紹滿天飛,為了保持文章的完整,還是簡單介紹一下吧!

1、引入ADO庫文件,一般是在stdAfx.h文件中添加
#import <msado15.dll> no_namespace rename( "EOF", "adoEOF" )

這條語句會(huì)在工程所在目錄生成msado15.tlh和msado15.tli兩個(gè)文件。

2、初始化Com環(huán)境
在CMyApp::InitInstance()函數(shù)中加入:
if ( FAILED(::CoInitialize(NULL)) )
{
::AfxMessageBox( "Com Init Fail !" );
::exit(0);
}

在CMyApp::ExitInstance()函數(shù)中加入
m_pRS -> Close();
m_pRS = NULL;
m_pConn -> Close();
m_pConn = NULL:
::CoUninitialize();


3、在你的類聲明文件中加入智能指針對象實(shí)例的定義,做為成員變量,
_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、然后就是連接數(shù)據(jù)庫,獲取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:包含要執(zhí)行的SQL語句,表名、存儲(chǔ)過程名或特定提供者的文本;
 RecordsAffected:可選,長整型,提供者返回操作的影響的記錄數(shù)目;
 Options:常量,可選,長整型,具體如下:
  adCmdText:指示提供者應(yīng)將CommandText賦值為命令的文本定義
  adCmdTable:返回CommandText命名的表中的所有行
  adCmdTableDirect:與上類同,返回表的所有行
  adCmdStoredProc:應(yīng)將CommandText賦值為存儲(chǔ)過程
  adCmdUnknown:CommandText參數(shù)中的命令類型未知
  adExecuteAsync:命令應(yīng)異步執(zhí)行
  adFetchAsync:指示CacheSize屬性指定的初始數(shù)量之后的行應(yīng)異步提取。
 例:m_pRS=m_pConn->Execute(L"select * from p_users",NULL,adCmdText);

2、使用記錄集
 A、讀取數(shù)據(jù)
  _variant_t varValue;
  varValue=m_pRS->GetFields()->GetItem((long)i)->Value;//讀取當(dāng)前記錄的第i+1個(gè)字段的值
  varValue=m_pRS->GetFields()->GetItem((long)i)->Name;//讀取當(dāng)前記錄的第i+1個(gè)字段的名字
  也可根據(jù)字段名來訪問該字段的值:
  varValue=m_pRS->GetCollect(L"字段名"); //讀取當(dāng)前記錄的第i+1個(gè)字值的值
 B、更新數(shù)據(jù)
  _bstr_t bstrValue="新數(shù)據(jù)";
  m_pRS->GetFields()->GetItem((long)i)->Value=bstrValue; //更新當(dāng)前記錄第i+1個(gè)字段的值
  m_pRS->Update();
 C、添加數(shù)據(jù)
  if (m_pRS->Support(adAddNew)&&m_pRS->Support(adUpdate))
  {
    m_pRS->AddNew();//插入一條新記錄
    m_pRS->GetFields()->GetItem((long)0)->Value=L"YP00100"; //為每個(gè)字段賦值
    m_pRS->GetFields()->GetItem((long)1)->Value=L"速效感冒膠囊";
    m_pRS->GetFields()->GetItem((long)2)->Value=L"SXGMJN";
    m_pRS->Update();//更新記錄集
  }
 D、刪除數(shù)據(jù)
  m_pRS->Delete(adAffectCurrent);//默認(rèn),僅刪除當(dāng)前記錄
  m_pRS->Delete(adAffectGroup);//刪除滿足當(dāng)前Filter屬性設(shè)置的記錄。

 以上操作相對麻煩,采用Connection對象的Execute方法,可能更簡單些,舉例如下:
 添加數(shù)據(jù):
  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)操作數(shù)據(jù)表。

這東東是專為VC++程序言準(zhǔn)備的,筆者認(rèn)為使用起來很方便??蛇z憾的是相關(guān)介紹少之又少,連微軟的MSDN上也只是寥寥數(shù)筆,真讓人摸不著頭腦。所以只好根據(jù)使用經(jīng)驗(yàn)講講。

要使用ADO Extensions 首先要完成以上第二種方法的所有步驟,實(shí)現(xiàn)ADO的智能指針調(diào)用,然后再實(shí)現(xiàn)一個(gè)IADORecordBinding類型的指針,用它將一個(gè)Recordset和一個(gè)定義好的類綁定到一起,這樣你就可以象操作C++的類一樣操作數(shù)據(jù)表了,還免去了自己處理VARIANT變量類型的諸多不便。

首先定義一個(gè)與數(shù)據(jù)表相對應(yīng)的類,用于綁定,

#include <icrsint.h>//Head File Of IADORecordBinding

class CTabClass : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTabClass)
//( 列序號(hào),字段類型,緩沖區(qū),…)
ADO_NUMERIC_ENTRY ( 1, adDecimal, m_nWID, 38/*精度*/, 0/*小數(shù)位*/, 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:

//與各字段對應(yīng)的變量
DECIMAL m_nWID;???
CHAR m_Word[MAX_WORD+1];
INT m_nLWord;??
INT m_nType;????
CHAR m_Attr[MAX_ATTR+1];

//以上各變量綁定后的狀態(tài)
ULONG s_nWID;???
ULONG s_nLWord;
ULONG s_Word;???
ULONG s_Attr;
ULONG s_nType;??

public:

//成員函數(shù)
CTabWord()
{
InitTab();
}

void InitTab();??? //初始化各成員變量的值。
};

注意,將 begin_ado_binding 和 end_ado_binding 宏之間的綁定條目用括號(hào)括起。不要在綁定條目結(jié)尾使用逗號(hào)或分號(hào),因?yàn)檫@些定界符僅限在宏中使用。

ado_variable_length_binding
_entry2的參數(shù)說明如下:

  參數(shù)1:按順序的字段號(hào)碼,1為標(biāo)識(shí)記錄集中第一字段,2為標(biāo)識(shí)記錄集中第二字段,依此類推。
  參數(shù)2:儲(chǔ)存已轉(zhuǎn)換字段的變量的數(shù)據(jù)類型。
  參數(shù)3:臨時(shí)的工作緩沖區(qū),用于將字段值從 variant轉(zhuǎn)換為c/c++ 變量。
  參數(shù)4:變長變量所需的字節(jié)數(shù)。
  參數(shù)5:指示字段轉(zhuǎn)換是否成功。
  參數(shù)6:布爾標(biāo)志。如果為 true,則表明 ado 可以更新綁定的字段。如只檢查字段而不將其更改,可設(shè)置為 false。

  其中第5個(gè)參數(shù)為狀態(tài)參數(shù),它可告訴你從 recordset 字段到c或c++變量的轉(zhuǎn)換是否成功以及變量的內(nèi)容是否有效。該參數(shù)的兩個(gè)最重要的值是adfldok(意味著轉(zhuǎn)換成功)和adfldnull(意味著字段是null,即無值可供轉(zhuǎn)換)。程序中要檢測該參數(shù)以決定c或c++變量是否有效。例如,如果字段具有有效的行內(nèi)容,狀態(tài)將會(huì)是adfldok,如果移動(dòng)到另一個(gè)字段為 null 的行,則狀態(tài)將是 adfldnull。

這里順便再提一句:IADORecordBinding與IRecordset是由同一個(gè)類實(shí)現(xiàn)的不同接口,所以當(dāng)你移動(dòng)的記錄指針時(shí)不要忘記另一個(gè)接口的記錄指針也被移動(dòng)了。


總結(jié)

以上是生活随笔為你收集整理的ado使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。