2011年12月21日

          將數組存入數據庫的解決方法及用VC與數據庫交互

          implode()  ---把數組轉換成字符串  
          explode() ---把字符串轉換成數組
          對于一維數組可以簡單的用
          implode()
          explode()
          函數做數組——串的變換,但需注意分隔符要使用數組中不存在的字符
          對于多維數組可以用序列化函數處理
          serialize()
          unserialize()
          ---------------------------------------
          ADO連接數據庫,使用控件
          Microsoft ADO Data Control 6.0 (SP6) (OLEDB)
          ADO庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
          聲明兩個變量:
          _ConnectionPtr l_pConnection;
          _RecordsetPtr l_pRecordset;
          下面開始連接數據庫
          l_pConnection.CreateInstance("ADODB.Connection");
          也可以是l_pConnection.CreateInstance(__uuidof(Connection));二者選一。

          下面列出了連接三種數據庫的語句
          CString strConn;
          1、連接SQL SERVER
          strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);
          strServer是服務器名,如果訪問本地數據庫,可是設strServer = “172.0.0.1”或”.”;這是我試過的,都可以。
          dbName是數據庫名稱,user, psw是用戶名和密碼。
          2、連接ORACLE
          trConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);
          dbName, user, psw分別是數據庫名,用戶名,密碼。
          3、連接ACCESS
          strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;
          Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);
          "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fnamepath","","",adModeUnknown
          dbName是數據庫路徑名,如“F:\\DB\\hermes.mdb”,psw是密碼。

          設置了連接語句,下面要和數據庫進行連接了,對于上面三種數據庫都是要執行下面這個連接的,下面語句是打一開連接的語句。
          connPtr->Open((_bstr_t)strConn, "", "", adModeUnknown);
          adModeUnknown:缺省。當前的許可權未設置
          adModeRead:只讀
          adModeWrite:只寫
          adModeReadWrite:可以讀寫
          adModeShareDenyRead:阻止其它Connection對象以讀權限打開連接
          adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接
          adModeShareExclusive:阻止其它Connection對象以讀寫權限打開連接
          adModeShareDenyNone:阻止其它Connection對象以任何權限打開連接

          4、連接UDL
          CString strConnect = "File Name=" + udlDir;
          connPtr->Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);
          字符串udlDir是udl文件路徑,user和pssw是udl連接數據庫的用戶名和密碼。

          得到記錄集:
          l_pRecordset.CreateInstance("ADODB.Recordset");
          l_pRecordset->Open(_bstr_t(l_strSQLConn),
          _variant_t((IDispatch*)l_pConnection, true),
          adOpenStatic, adLockOptimistic, adCmdText);
          l_strSQLConn是select語句

          // 遍歷結果集
          while( !l_pRecordset->adoEOF)
          {
          ……// 在這里添加操作結果集的代碼如:
          strTemp = (LPCSTR)(_bstr_t)l_pRecordsetTable->GetCollect(_variant_t((long)i));// 得到某個字段的記錄。
          l_pRecordset->MoveNext();
          }
          對數據庫的操作一般使用異常機制。也就是try{…}catch(){..}
          注意,一個_RecordsetPtr的對象只能得到一個記錄集,重復用時就會出錯。當要打開兩個數據庫時最好定義兩個_RecordsetPtr對象

          四、關閉記錄集和連接
          關閉記錄集:
          l_pRecordsetTable->Close();
          l_pRecordsetTable = NULL;

          關閉連接:
          l_pConnection->Close();
          l_pConnection = NULL;

          // 釋放環境
          ::CoUninitialize();
          附加:
          l_pRecordset執行select語句后就可以得到表的字段名,字段數,字段大小,我寫了三個函數,分別得到指定表的字段數,
          指定字段的字段名及字段大小。

          // 得到字段名
          BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)
          {
          if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
          _variant_t vt((long)nField);
          strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));
          return true;
          }

          // 得到字段大小
          int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)
          {
          if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;
          _variant_t vt((long)nField);
          int nSize = RcdPtr->GetFields()->Item[vt]->DefinedSize; // 返回已聲明的字段大小
          //int nSize = RcdPtr->GetFields()->Item[vt]->ActualSize; // 返回給定字段中數據的實際大小
          return nSize;
          }
          SQL 語句:
          得到SQL SERVER的所有用戶類型的表
          select name from sysobjects where xtype='U'

          得到ORACLE的所有用戶表
          select tname from tab where tabtype='TABLE'

          得到ACCESS的所有用戶建的表
          SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1
          SELECT MSysObjects.Name FROM MSysObjects WHERE Type=1

          posted @ 2011-12-21 11:09 weisa 閱讀(292) | 評論 (0)編輯 收藏

          僅列出標題  
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          主站蜘蛛池模板: 吉林省| 阜阳市| 黄平县| 文成县| 阳西县| 阳朔县| 合水县| 巴林左旗| 郑州市| 泽库县| 湘潭县| 碌曲县| 剑河县| 灵台县| 庄河市| 扎赉特旗| 滨州市| 桑植县| 望江县| 建阳市| 赣榆县| 吉林省| 泸州市| 益阳市| 广平县| 麻栗坡县| 灌阳县| 隆化县| 司法| 龙州县| 长岭县| 德昌县| 廊坊市| 濮阳市| 德江县| 长武县| 镇沅| 乌审旗| 南召县| 镇平县| 修水县|