• <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>
            隨筆-380  評論-37  文章-0  trackbacks-0
            VC++下使用ADO編寫數(shù)據庫程序

            作者:未知 來源:月光軟件站加入時間:2005-6-5 月光軟件站

             



            準備:
            (1)、引入ADO類

            #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個智能指針了:_ConnectionPtr、_RecordsetPtr和_CommandPtr

            1.連接和關閉數(shù)據庫 (1)連接

            例子:連接Access數(shù)據庫
            AfxOleInit();//初始化
            HRESULT hr;
            try
            {
            hr = m_pConnection.CreateInstance("ADODB.Connection");///創(chuàng)建Connection對象
            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ù)據庫

            m_pCommand.CreateInstance(__uuidof(Command));
            m_pCommand->CommandTimeout = 5;
            m_pCommand->ActiveConnection = m_pConnection;
            }
            }
            catch(_com_error e)///捕捉異常
            {
            CString errormessage;
            errormessage.Format("連接數(shù)據庫失敗!\r\n錯誤信息:%s",e.ErrorMessage());
            AfxMessageBox(errormessage);///顯示錯誤信息
            }


            (2)、關閉

            //如果數(shù)據庫連接有效
            if( m_pConnection->State )
                  m_pConnection->Close();
            m_pConnection = NULL; 

            (3)、設置連接時間 //設置連接時間-----------------------------------
            pConnection->put_ConnectionTimeout(long(5));
            2.打開一個結果集

            (1)打開,首先創(chuàng)建一個_RecordsetPtr實例,然后調用Open()得到一條SQL語句的執(zhí)行結果
            _RecordsetPtrm_pRecordset;
            m_pRecordset.CreateInstance(__uuidof(Recordset));

            // 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤信息,
            // 因為它有時會經常出現(xiàn)一些意想不到的錯誤。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)關閉結果集 m_pRecordset->Close();

            3.操作一個結果集

            (1)、遍歷(讀取)
            a)、用pRecordset->adoEOF來判斷數(shù)據庫指針是否已經移到結果集的末尾了;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)、取得一個字段的值的辦法有兩種辦法

            一是

            //表示取得第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
            {
            // 假設刪除第二條記錄
            m_pRecordset->MoveFirst();
            m_pRecordset->Move(1);       
            // 從0開始
            m_pRecordset->Delete(adAffectCurrent); 
            // 參數(shù)adAffectCurrent為刪除當前記錄
            m_pRecordset->Update();
            }
            catch(_com_error *e)
            {
            AfxMessageBox(e->ErrorMessage());
            }

            4.直接執(zhí)行SQL語句,除了要用到結果集其余的大部分功能都可以直接用SQL語言實現(xiàn)

            (1)、用_CommandPtr和_RecordsetPtr配合
            _CommandPtrm_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中內容的類型,Options可以取如下值之一:
            adCmdText:表明CommandText是文本命令
            adCmdTable:表明CommandText是一個表名
            adCmdProc:表明CommandText是一個存儲過程
            adCmdUnknown:未知

            例子:
            _variant_t RecordsAffected;
            m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
            5.調用存儲過程
            (1)、利用_CommandPtr
            _CommandPtrm_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.遍歷數(shù)據庫中的所有表名 _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ù)據庫失敗!rn錯誤信息:%s",e.ErrorMessage());

            AfxMessageBox(errormessage);
            return -1;
            }
            7.遍歷一個表中的所有字段
            Field *   field = NULL;
            HRESULT   hr;
            Fields *  fields = NULL;
            hr = m_pRecordset->get_Fields (&fields);//得到記錄集的字段集和
             
            if(SUCCEEDED(hr))
                fields->get_Count(&ColCount);

            //得到記錄集的字段集合中的字段的總個數(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個指針的值都不是MFC直接支持的數(shù)據類型,而要用_variant_t轉換一下
            _variant_t(XX)可以把大多數(shù)類型的變量轉換成適合的類型傳入:
            (2)、_variant_t var;_variant_t -> long: (long)var;
            _variant_t -> CString: CString strValue = (LPCSTR)_bstr_t(var);
            CString -> _variant_t: _variant_t(strSql);
            2、BSTR寬字符串與CString相互轉換

            BSTR bstr;
            CString strSql;
            CString -> BSTR: bstr = strSql.AllocSysString();
            BSTR -> CString: strSql = (LPCSTR)bstr;
            3、_bstr_t與CString相互轉換

            _bstr_t bstr;
            CString strSql;
            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#

            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ù)據庫失敗!\r\n錯誤信息:%s",e.ErrorMessage());
            AfxMessageBox(errormessage);///顯示錯誤信息
            }

            posted on 2010-01-22 19:02 小王 閱讀(421) 評論(0)  編輯 收藏 引用 所屬分類: VC
            久久国产精品偷99| 四虎国产精品免费久久久| 久久天天日天天操综合伊人av| 99久久精品国产一区二区蜜芽| 久久人人爽人人澡人人高潮AV| 久久婷婷国产剧情内射白浆| 久久久久无码精品国产不卡| 日本一区精品久久久久影院| 久久久精品国产Sm最大网站| 久久久久青草线蕉综合超碰| 一本久久a久久精品综合夜夜| 久久久国产打桩机| 久久本道综合久久伊人| 日日躁夜夜躁狠狠久久AV| 久久se精品一区精品二区国产| 亚洲中文字幕无码久久精品1 | 俺来也俺去啦久久综合网| 久久久久亚洲精品中文字幕| 1000部精品久久久久久久久| 久久久国产精华液| 成人综合久久精品色婷婷| 国产成人香蕉久久久久| 99久久精品国内| 久久婷婷五月综合97色| 久久精品综合网| 日韩电影久久久被窝网| 久久成人国产精品一区二区| 好久久免费视频高清| 99久久99这里只有免费的精品| 一本久久a久久精品亚洲| 久久久久亚洲AV无码观看| 午夜精品久久久久9999高清| 久久精品这里只有精99品| 成人午夜精品久久久久久久小说| 久久久久亚洲AV成人片 | 思思久久好好热精品国产| 国产精品久久久久一区二区三区| 99久久精品午夜一区二区| 国产精品久久久久久久久免费| 久久99国产综合精品| 国产精品视频久久久|