啪啪拉拉噼里啪啦

          初學(xué)者天堂資料匯集

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            16 隨筆 :: 73 文章 :: 16 評論 :: 0 Trackbacks
          一、ADO簡介

            ADO(ActiveX Data Object)是Microsoft數(shù)據(jù)庫應(yīng)用程序開發(fā)的新接口,是建立在OLE DB之上的高層數(shù)據(jù)庫訪問技術(shù),不僅簡單易用,并且不失靈活性.不失為C++利用數(shù)據(jù)庫快速開發(fā)的不錯選擇。

            理論就不用我在這兒費話了,網(wǎng)上有很多,但光是理論,也不是不夠的,ADO訪問數(shù)據(jù)的方法很靈活,容易讓人混淆.網(wǎng)上大部分的實例都是基于MFC的,數(shù)據(jù)庫也是ACCESS多,這兒我寫了一個C++語言訪問MS SQL2000的實例,希望對比我還菜鳥的菜鳥有所幫助。

            二、建庫

            首先在SQL2000企業(yè)管理中,建立一個數(shù)據(jù)庫student,并創(chuàng)建一個表stu_info字段和值如下:

          snum  sname sage ssex smajor 
          200113801 本拉登 23  男  計算機科學(xué)
          200104205 張巧巧 25  女 旅游管理 
          200113802 張學(xué)友  26  男  計算機科學(xué) 

            三、訪問

            程序清單如下:(win2000+VC6.0)

          /*******************************************************************
          利用ADO訪問MS SQL2000
          要求: 【1】輸出stu_info表內(nèi)的每一條記錄
          【2】添加一條新記錄
          【3】刪除名字為"本拉登"的記錄
          */
          #import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
          no_namespace rename("EOF", "EndOfFile")
          #include <iostream>
          #include <iomanip> //for setw()
          using namespace std;
          class STU
          {
           public:
            char snum[10]; //學(xué)號
            char sname[10]; //姓名
            char ssex[2]; //姓別
            long sage; //年齡
            char smajor[20]; //專業(yè)
           public:
            STU(){}
            ~STU(){}
          };

          int main()
          {
           STU student;
           ::CoInitialize(NULL); // 初始化OLE/COM庫環(huán)境 ,為訪問ADO接口做準(zhǔn)備

           _RecordsetPtr m_pRecordset("ADODB.Recordset");
           _ConnectionPtr m_pConnection("ADODB.Connection");

           _bstr_t bstrSQL("select * from stu_info"); //查詢語句
           char * query_cmd = "DELETE FROM stu_info WHERE sname = '本拉登'";

           try
           {
            // 創(chuàng)建Connection對象
            m_pConnection.CreateInstance("ADODB.Connection");
            // 設(shè)置連接字符串,必須是BSTR型或者_bstr_t類型
            _bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=student; uid=sa; pwd=123;";
            //若數(shù)據(jù)庫在網(wǎng)絡(luò)上則Server為形如(192.168.1.5,3340)
            //用戶sa和密碼123只是針對我的庫
            m_pConnection->Open(strConnect,"","",adModeUnknown);
            if(m_pConnection==NULL)
             cerr<<"Lind data ERROR!\n";
            // 創(chuàng)建記錄集對象
            m_pRecordset.CreateInstance(__uuidof(Recordset));
            // 取得表中的記錄
            m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
            adOpenDynamic,adLockOptimistic,adCmdText);

            _variant_t vsnum,vsname,vsage,vssex,vsmajor; //對應(yīng)庫中的snum,sname,sage,ssex,smajor
            cout << "學(xué)號 姓名 年齡 姓別 專業(yè)";
            cout << "\n----------------------------------------------------------------\n";

            while (!m_pRecordset->EndOfFile)
            {
             vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//這兒給字段編號和字段名都可以
             vsname = m_pRecordset->GetCollect("sname");
             vsage = m_pRecordset->GetCollect("sage");
             vssex = m_pRecordset->GetCollect("ssex");
             vsmajor = m_pRecordset->GetCollect("smajor");
             if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
          && vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
             {
              cout.setf(ios::left);
              cout << setw(14) << (char*)(_bstr_t)vsnum;
              cout << setw(14) << (char*)(_bstr_t)vsname;
              cout << setw(8) << vsage.lVal;
              cout << setw(8) << (char*)(_bstr_t)vssex;
              cout <<setw(20) << (char*)(_bstr_t)vsmajor;
              cout.unsetf(ios::left);
              cout << endl;
             }
             m_pRecordset->MoveNext(); ///移到下一條記錄
            }
            cout << "\n----------------------------------------------------------------\n";
            cout << "\n請輸入你要添加的學(xué)生信息\n";
            cout << "學(xué)號:";
            cin >> student.snum;
            cout << "\n姓名:";
            cin >> student.sname;
            cout << "\n年齡:";
            cin >> student.sage;
            cout << "\n姓別:";
            cin >> student.ssex;
            cout << "\n專業(yè):";
            cin >> student.smajor;
            m_pRecordset->MoveFirst(); //移動到第一條記錄
            m_pRecordset->AddNew(); ///添加新記錄
            m_pRecordset->PutCollect("snum",_variant_t(student.snum));
            m_pRecordset->PutCollect("sname",_variant_t(student.sname));
            m_pRecordset->PutCollect("sage",_variant_t(student.sage));
            m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
            m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
            m_pRecordset->Update();

            m_pConnection->Execute(query_cmd,NULL,1); //用Execute執(zhí)行sql語句來刪除
            m_pRecordset->Close(); // 關(guān)閉記錄集
           }

           // 捕捉異常
           catch(_com_error e)
           { 
            // 顯示錯誤信息
            cerr << "\nERROR:" << (char*)e.Description();//拋出異常
           }
           if(m_pConnection->State)
            m_pConnection->Close();

           ::CoUninitialize();

           return 0;
          }

          posted on 2005-04-01 06:57 噼里啪啦的世界 閱讀(140) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 营山县| 禄丰县| 临沭县| 西贡区| 安塞县| 正镶白旗| 泾川县| 淮滨县| 万州区| 卓资县| 连江县| 哈巴河县| 星子县| 咸宁市| 红河县| 滦南县| 苏州市| 大庆市| 额尔古纳市| 咸宁市| 桦南县| 景谷| 万盛区| 潍坊市| 九龙城区| 甘泉县| 廉江市| 公安县| 永年县| 光山县| 体育| 扶绥县| 双城市| 鹤庆县| 通榆县| 罗田县| 射洪县| 循化| 武乡县| 宾阳县| 上杭县|