青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評(píng)論-22  文章-0  trackbacks-0
VC++下使用ADO編寫數(shù)據(jù)庫程序
 
準(zhǔn)備:
(1)、引入ADO   

 在stdafx.h中加入如下語句:
#import  "c:\program  files\common  files\system\ado\msado15.dll"  \
no_namespace  
\
rename  
("EOF",  "adoEOF")         
   
(2)、初始化COM
 
MFC中可以用AfxOleInit();非MFC環(huán)境中用:  
CoInitialize(NULL);
CoUnInitialize();
 
(3)#import  包含后就可以用3個(gè)智能指針了:_ConnectionPtr、_RecordsetPtr和_CommandPtr 

1
.連接和關(guān)閉數(shù)據(jù)庫

 (1)連接  
一般在App類成員函數(shù)InitInstance()里初始化
例子:連接Access數(shù)據(jù)庫
           
AfxOleInit();//初始化
           HRESULT  hr
;
           
try
           
{
                       hr  
=  m_pConnection.CreateInstance("ADODB.Connection");///創(chuàng)建Connection對(duì)象
                       
if(SUCCEEDED(hr))
                       
{
                                   m_pConnection
->ConnectionTimeout  =  0;
                                   hr  
=  m_pConnection->Open(
"Provider=Microsoft.Jet.OLEDB.4.0;Data  Source=db.mdb",  "",  "",  adModeUnknown);
                                   
//m_pConnection->PutDefaultDatabase  ((_bstr_t)"DB");//設(shè)置默認(rèn)數(shù)
據(jù)庫
 
                                   m_pCommand
.CreateInstance(__uuidof(Command));
                                   m_pCommand
->CommandTimeout  =  5;
                                   m_pCommand
->ActiveConnection  =  m_pConnection;
                       
}
           
}
           
catch(_com_error  e)///捕捉異常
           
{
                       
CString  errormessage;
                       errormessage
.Format("連接數(shù)據(jù)庫失敗!\r\n錯(cuò)誤信息:%s",e.ErrorMessage());
                       
AfxMessageBox(errormessage);///顯示錯(cuò)誤信息
         
return FALSE;
           
}
 
 
(2)、關(guān)閉  
 
一般在App類成員函數(shù)InitInstance()里關(guān)閉數(shù)據(jù)庫連接
//如果數(shù)據(jù)庫連接有效
if(  m_pConnection->State  )
                       m_pConnection
->Close();
m_pConnection  
=  NULL;    
 
(3)、設(shè)置連接時(shí)間  //設(shè)置連接時(shí)間-----------------------------------  
pConnection
->put_ConnectionTimeout(long(5));

2.打開一個(gè)結(jié)果集
(1)打開,首先創(chuàng)建一個(gè)_RecordsetPtr實(shí)例,然后調(diào)用Open()得到一條SQL語句的執(zhí)行結(jié)果
_RecordsetPtr            m_pRecordset
;
m_pRecordset
.CreateInstance(__uuidof(Recordset));
 
//  在ADO操作中建議語句中要常用try...catch()來捕獲錯(cuò)誤信息,
//  因?yàn)樗袝r(shí)會(huì)經(jīng)常出現(xiàn)一些意想不到的錯(cuò)誤。jingzhou  xu
try
{
           m_pRecordset
->Open("SELECT  *  FROM  DemoTable",//  查詢DemoTable表中所有字段
           m_pConnection
.GetInterfacePtr(),    //  獲取庫接庫的IDispatch指針
           adOpenDynamic
,
           adLockOptimistic
,
           adCmdText
);
}
catch(_com_error  *e)
{
           
AfxMessageBox(e->ErrorMessage());
}
                       
(2)關(guān)閉結(jié)果集  m_pRecordset->Close();
  m_pRecordset
= NULL;
 
3.操作一個(gè)結(jié)果集
(1)、遍歷(讀取)
a
)、用pRecordset->adoEOF來判斷數(shù)據(jù)庫指針是否已經(jīng)移到結(jié)果集的末尾了;m_pRecordset->BOF判斷是否  在第一
條記錄前面:  while(!m_pRecordset->adoEOF)
{
           
var  =  m_pRecordset->GetCollect("Name");
           
if(var.vt  !=  VT_NULL)
                       strName  
=  (LPCSTR)_bstr_t(var);
           
var  =  m_pRecordset->GetCollect("Age");
           
if(var.vt  !=  VT_NULL)
                       strAge  
=  (LPCSTR)_bstr_t(var);
           m_AccessList
.AddString(  strName  +  "  -->  "+strAge  );
           m_pRecordset
->MoveNext();
}
                       
b
)、取得一個(gè)字段的值的辦法有兩種辦法
 
一是
 
//表示取得第0個(gè)字段的值  m_pRecordset->GetCollect("Name");
 
或者  m_pRecordset->GetCollect(_variant_t(long(0));
 
二是
pRecordset
->get_Collect("COLUMN_NAME");
 
或者  pRecordset->get_Collect(long(index));
 
(2)、添加
 
a
)、調(diào)用m_pRecordset->AddNew();
b
)、調(diào)用m_pRecordset->PutCollect("Name",_variant_t(m_szName));給每個(gè)字段賦值(m_szName為控件所對(duì)應(yīng)的字符串變量)
c
)、調(diào)用m_pRecordset->Update();確認(rèn)
 
// 添加完后可讀取顯示
 
對(duì)于MFC有些控件顯示需要更新(比如ListBox)

(3)、修改
(4)、刪除
a
)、把記錄指針移動(dòng)到要?jiǎng)h除的記錄上,然后調(diào)用Delete(adAffectCurrent)  try
{
           
//  假設(shè)刪除第二條記錄
           m_pRecordset
->MoveFirst();
           m_pRecordset
->Move(1);                
           
//  從0開始
           m_pRecordset
->Delete(adAffectCurrent);    
           
//  參數(shù)adAffectCurrent為刪除當(dāng)前記錄
           m_pRecordset
->Update();
}
catch(_com_error  *e)
{
           
AfxMessageBox(e->ErrorMessage());
}
 
4.直接執(zhí)行SQL語句,除了要用到結(jié)果集其余的大部分功能都可以直接用SQL語言實(shí)現(xiàn)
 
(1)、用_CommandPtr_RecordsetPtr配合
_CommandPtr                        m_pCommand
;
m_pCommand
.CreateInstance(__uuidof(Command));
//  將庫連接賦于它
m_pCommand
->ActiveConnection  =  m_pConnection;    
//  SQL語句
m_pCommand
->CommandText  =  "SELECT  *  FROM  DemoTable";    
//  執(zhí)行SQL語句,返回記錄集
m_pRecordset  
=  m_pCommand->Execute(NULL,  NULL,adCmdText);              
(2)、直接用_ConnectionPtr執(zhí)行SQL語句
_RecordsetPtr  
Connection15::Execute  (  _bstr_t  CommandText,  
                                                                           VARIANT  
*
RecordsAffected,  
                                                                           
long  Options  )  
 
其中CommandText是命令字串,通常是SQL命令。  
參數(shù)RecordsAffected是操作完成后所影響的行數(shù),  
參數(shù)Options表示CommandText中內(nèi)容的類型,Options可以取如下值之一:  
adCmdText
:表明CommandText是文本命令  
adCmdTable
:表明CommandText是一個(gè)表名  
adCmdProc
:表明CommandText是一個(gè)存儲(chǔ)過程  
adCmdUnknown
:未知
                                   
例子:
_variant_t  
RecordsAffected;
m_pConnection
->Execute("UPDATE  users  SET  old  =  old+1",&RecordsAffected,adCmdText);              
 
5.調(diào)用存儲(chǔ)過程
(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直接調(diào)用(見4.(2))
 
6.遍歷數(shù)據(jù)庫中的所有表名  _ConnectionPtr  m_pConnect;  
_RecordsetPtr  pSet
;  
HRESULT  hr
;  
try  
{    
           hr  
=  m_pConnect.CreateInstance("ADODB.Connection");        
           
if(SUCCEEDED(hr))    
           
{      
                       
CString  dd;      
                       dd
.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data  Source=%s",file);      
                       hr  
=  m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);      
                       pSet  
=  m_pConnect->OpenSchema(adSchemaTables);            
                       
while(!(pSet->adoEOF))      
                       
{                  
                                   
//獲取表格        
                                   _bstr_t  table_name  
=  pSet->Fields->GetItem("TABLE_NAME")-
>Value;
                                   
                                   
//獲取表格類型                
                                   _bstr_t  table_type  
=  pSet->Fields->GetItem("TABLE_TYPE")-
>Value;
                                   
                                   
//過濾一下,只輸出表格名稱,其他的省略
                                   
if  (  strcmp(((LPCSTR)table_type),"TABLE")==0){
                                               
CString  tt;
                                               tt
.Format("%s",(LPCSTR)table_name);          
                                               
AfxMessageBox(tt);                
                                   
}              
                                   pSet
->MoveNext();        
                       
}      
                       pSet
->Close();    
           
}    
           m_pConnect
->Close();    
}catch(_com_error  e)///捕捉異常  
{    
           
CString  errormessage;    
           errormessage
.Format("連接數(shù)據(jù)庫失敗!rn錯(cuò)誤信息:%s",e.ErrorMessage());
 
           
AfxMessageBox(errormessage);
           
return  -1;
}            
            
7.遍歷一個(gè)表中的所有字段
Field  *      field  =  NULL;                        
HRESULT      hr
;
Fields  *    fields  =  NULL;
hr  
=  m_pRecordset->get_Fields  (&fields);            //得到記錄集的字段集和            
             
if(SUCCEEDED(hr))  
       fields
->get_Count(&ColCount);            
 
//得到記錄集的字段集合中的字段的總個(gè)數(shù)            
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個(gè)指針的值都不是MFC直接支持的數(shù)據(jù)類型,而要用_variant_t轉(zhuǎn)換一下
_variant_t
(XX)可以把大多數(shù)類型的變量轉(zhuǎn)換成適合的類型傳入:
(2)、_variant_t  var;_variant_t  ->  long:  (long)var;
_variant_t  
->  CString:  CString  strValue  =  (LPCSTR)_bstr_t(var);
CString  ->  _variant_t:  _variant_t(strSql);
2BSTR寬字符串與CString相互轉(zhuǎn)換
 
BSTR  bstr
;
CString  strSql;
CString  ->  BSTR:  bstr  =  strSql.AllocSysString();
BSTR  
->  CString:  strSql  =  (LPCSTR)bstr;
3_bstr_tCString相互轉(zhuǎn)換
 
_bstr_t  bstr
;
CString  strSql;
CString  ->  _bstr_t:  bstr  =  (_bstr_t)strSql;
_bstr_t  
->  CString:  strSql  =  (LPCSTR)bstr;
4、關(guān)于時(shí)間
Access:表示時(shí)間的字符串#2004-4-5#
Sql:表示時(shí)間的字符串''2004-4-5''
DateField(時(shí)間字段)  select  *  from  my_table  where  DateField  >  #2004-4-10#
 
 
 
           
try
           
{
                       m_pCommand
->CommandText  =  "INSERT  INTO  tTest(age)  VALUES('23f2')  ";
                       m_pRecordset  
=  m_pCommand->Execute(NULL,NULL,  adCmdText);    
           
}
           
catch(_com_error  e)///捕捉異常
           
{
                       
CString  errormessage;
                       errormessage
.Format("連接數(shù)據(jù)庫失敗!\r\n錯(cuò)誤信息:%s",e.ErrorMessage());
                       
AfxMessageBox(errormessage);///顯示錯(cuò)誤信息
           
}
posted on 2009-07-20 10:59 Bluesea 閱讀(953) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产一成人久久精品| 亚洲欧美日韩一区在线| 国产精品视频1区| 在线视频国产日韩| 亚洲女同在线| 亚洲免费观看| 欧美sm视频| 伊人一区二区三区久久精品| 亚洲高清视频一区| 欧美一区午夜精品| 亚洲一区日韩在线| 欧美午夜免费影院| 亚洲视频精选在线| 在线视频免费在线观看一区二区| 久久夜精品va视频免费观看| 亚洲国产精品一区二区www在线| 欧美国产日韩二区| 久久视频这里只有精品| 国产精品视频免费观看| 一区二区三区偷拍| 亚洲免费观看高清完整版在线观看熊 | 一区二区激情视频| 亚洲欧洲日本mm| 欧美激情四色| 亚洲视频久久| 亚洲一区三区电影在线观看| 欧美精品videossex性护士| 亚洲二区免费| 亚洲国产欧美在线| 欧美日韩理论| 亚洲免费中文| 午夜免费久久久久| 狠狠色噜噜狠狠色综合久| 久久精品电影| 久久夜色精品国产欧美乱| 永久域名在线精品| 亚洲国产欧美一区二区三区久久| 久久综合电影| 一区二区国产在线观看| 一本色道久久99精品综合| 国产精品av免费在线观看| 亚洲一线二线三线久久久| 亚洲网站在线播放| 噜噜噜噜噜久久久久久91| 欧美成人免费在线| 久久夜色精品国产欧美乱| 91久久在线| 亚洲视频福利| 伊人久久婷婷| 亚洲色图在线视频| 狠狠久久亚洲欧美| 日韩亚洲视频在线| 国内精品久久久| 亚洲欧洲在线播放| 国产亚洲精品久| 亚洲日本成人网| 国产一区二区三区精品欧美日韩一区二区三区 | 在线中文字幕一区| 亚洲欧洲在线播放| 国产一区观看| 一区二区三区日韩欧美精品| 国产精品观看| 亚洲国产精品综合| 国产亚洲一级| 亚洲天堂免费观看| 亚洲日本电影在线| 欧美综合国产| 性色一区二区三区| 欧美日韩国产综合视频在线观看中文 | 欧美二区在线| 狠狠色伊人亚洲综合成人| 亚洲国产精品一区二区第一页 | 亚洲国产精品专区久久| 欧美日韩一卡二卡| 久久综合九色综合欧美狠狠| 一区二区三区偷拍| 在线看片成人| 亚洲午夜视频在线观看| 狠狠色丁香久久婷婷综合_中| 蜜臀久久99精品久久久久久9| 欧美成人按摩| 久久精品国产久精国产思思| 久久爱www| 亚洲午夜一区| 欧美一区二区在线播放| 99国产精品久久久| 久久九九免费视频| 午夜精品www| 欧美国产综合| 久久只精品国产| 国产精品一区二区女厕厕| 欧美成人一二三| 国产综合色产在线精品| 麻豆成人综合网| 国产精品免费小视频| 免费成人美女女| 亚洲女性喷水在线观看一区| 亚洲三级性片| 欧美中在线观看| 亚洲人成网站在线播| 欧美劲爆第一页| 午夜国产一区| 亚洲视频在线播放| 亚洲风情亚aⅴ在线发布| 欧美成人午夜激情视频| 洋洋av久久久久久久一区| 久久久国产精品一区二区三区| 在线视频日本亚洲性| 欧美欧美在线| 亚洲黄一区二区三区| 亚洲免费精品| 欧美另类在线播放| 亚洲激情一区二区三区| 影音先锋成人资源站| 欧美成人精品福利| 亚洲国产黄色片| 欧美日韩一区二区视频在线| 老司机aⅴ在线精品导航| 激情五月***国产精品| 午夜精品久久久久久久白皮肤| 欧美一级久久久| 国产婷婷色一区二区三区在线| 欧美在线视频一区二区| 午夜精品久久久久久| 国产精品久久久久久久第一福利 | 欧美大片免费看| 国产精品亚洲综合久久| 久久福利视频导航| 午夜久久电影网| 1000部国产精品成人观看| 亚欧成人在线| 亚洲第一伊人| 欧美一区二区三区免费观看| 欧美日韩在线免费观看| 牛人盗摄一区二区三区视频| 国产综合色一区二区三区| 久久大逼视频| 欧美激情亚洲一区| 欧美一区亚洲二区| 91久久黄色| 国产日韩精品一区二区三区| 宅男噜噜噜66国产日韩在线观看| 老鸭窝毛片一区二区三区 | 午夜精品av| 亚洲精品自在在线观看| 欧美精品高清视频| 久久精品中文字幕一区| 欧美激情一区二区三区在线| 亚洲高清在线观看一区| 在线观看欧美日本| 欧美在线观看网址综合| 亚洲欧洲一区二区三区久久| 亚洲激情av在线| 国产欧美日韩91| 欧美国产日韩a欧美在线观看| 午夜亚洲福利在线老司机| 麻豆成人91精品二区三区| 亚洲欧美偷拍卡通变态| 在线观看视频一区二区| 欧美性大战久久久久| 久久精品中文字幕免费mv| 亚洲在线一区二区三区| 女女同性女同一区二区三区91| 欧美亚洲综合久久| 日韩一级黄色大片| 亚洲理伦电影| 欧美激情国产精品| 欧美不卡三区| 亚洲午夜伦理| 一区二区三区高清在线观看| 另类av导航| 久久精品国产精品亚洲综合| 在线一区二区三区四区五区| 国产精品视频男人的天堂| 欧美视频导航| 欧美激情亚洲激情| 欧美日韩国产天堂| 久久综合久久综合久久| 欧美在线视频免费| 夜夜嗨av一区二区三区网站四季av | 亚洲国产视频一区二区| 欧美小视频在线| 欧美激情精品久久久| 久久人人爽爽爽人久久久| 久久精品国产99国产精品澳门| 日韩一级二级三级| 亚洲少妇一区| 亚洲社区在线观看| 亚洲欧美激情一区二区| 亚洲日韩视频| 亚洲黄色成人久久久| 在线免费观看日本一区| 国产视频一区在线| 狠狠操狠狠色综合网| 国产精品自在在线| 激情视频一区| 亚洲三级毛片| 午夜精品久久久久久久白皮肤| 一本一道久久综合狠狠老精东影业 | 欧美成人性网|