生活,在繼續……
          真正的生活,應該是不斷的向前!
          posts - 11,comments - 75,trackbacks - 0

          一、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 2006-03-10 13:31 生活,在繼續……勿要停! 閱讀(172) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 渝中区| 牡丹江市| 邢台县| 东明县| 九龙城区| 慈利县| 长宁县| 广西| 白沙| 大荔县| 德庆县| 开阳县| 偃师市| 牙克石市| 云霄县| 义乌市| 吕梁市| 澎湖县| 册亨县| 肇源县| 镇雄县| 法库县| 长沙市| 辛集市| 武夷山市| 衡阳县| 合江县| 白银市| 青冈县| 温州市| 南漳县| 南澳县| 田东县| 色达县| 息烽县| 石狮市| 聊城市| 灌云县| 梅河口市| 汪清县| 富顺县|