啪啪拉拉噼里啪啦

          初學者天堂資料匯集

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

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

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

            二、建庫

            首先在SQL2000企業管理中,建立一個數據庫student,并創建一個表stu_info字段和值如下:

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

            三、訪問

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

          /*******************************************************************
          利用ADO訪問MS SQL2000
          要求: 【1】輸出stu_info表內的每一條記錄
          【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]; //學號
            char sname[10]; //姓名
            char ssex[2]; //姓別
            long sage; //年齡
            char smajor[20]; //專業
           public:
            STU(){}
            ~STU(){}
          };

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

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

            _variant_t vsnum,vsname,vsage,vssex,vsmajor; //對應庫中的snum,sname,sage,ssex,smajor
            cout << "學號 姓名 年齡 姓別 專業";
            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請輸入你要添加的學生信息\n";
            cout << "學號:";
            cin >> student.snum;
            cout << "\n姓名:";
            cin >> student.sname;
            cout << "\n年齡:";
            cin >> student.sage;
            cout << "\n姓別:";
            cin >> student.ssex;
            cout << "\n專業:";
            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執行sql語句來刪除
            m_pRecordset->Close(); // 關閉記錄集
           }

           // 捕捉異常
           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 噼里啪啦的世界 閱讀(138) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 增城市| 连城县| 石阡县| 喜德县| 鄯善县| 隆林| 汽车| 保亭| 乌鲁木齐市| 泗阳县| 秭归县| 扎鲁特旗| 岫岩| 南川市| 武义县| 梁河县| 鹤壁市| 紫云| 无棣县| 桐梓县| 讷河市| 天等县| 长武县| 乐清市| 长垣县| 宜章县| 通海县| 米泉市| 双江| 荃湾区| 泰兴市| 柘城县| 兴安县| 宜良县| 铜梁县| 锡林浩特市| 凤台县| 平谷区| 元谋县| 沂水县| 二手房|