1. 程式人生 > >vc6.0 ADO訪問資料庫

vc6.0 ADO訪問資料庫

最近做一個蛋疼的專案會用到ACCESS資料並從中讀取資料,由於之前沒搞過VC的專案,經過幾番磕磕碰碰總算搞好了,遂將解決流程記錄下來:

首先吐槽下微軟在版本相容性方面的缺陷,搞得我是蛋疼得不得了啊,若非高人相助現在已可能經吐血身亡了

廢話少說上程式碼:

以下程式碼環境:win7 32位+VC6.0

目標環境:       XP 32位 無VC

新增標頭檔案:

#import "C:\program files\common files\system\ado\msado15.dll" rename_namespace("ADONameSpace") rename("EOF","adoEOF")

實現程式碼:

BOOL CTest2::fnGetTestResult(E_FAILTYPE &eGetResultError)
{
 CString csFilePath ;
 CString csErrorInfo;
 CString csInfo;
 BOOL    bIsFind = FALSE;
 if (" "==m_csTestReortFile)
 {
  return FALSE;
 }
 ADONameSpace::_ConnectionPtr pConnection;
 ADONameSpace::_CommandPtr    pCommand;
 ADONameSpace::_RecordsetPtr pRecordset;

 ::CoInitialize(NULL);           //初始化COM環境
 HRESULT hr;
 try
 {
  //hr=pConnection.CreateInstance(__uuidof(ADONameSpace::Connection));  //這兩句CreateInstance我試過都可以
  hr=pConnection.CreateInstance("ADODB.Connection");

if(FAILED(hr))
  {

        _com_error e(hr);
       AfxMessageBox(e.ErrorMessage()); //打印出錯資訊
       return false;
   }

   csErrorInfo.Format("建立資料庫連線例項成功\r\n");
   OutputText(1,csErrorInfo,RGB(1,0,0));
   //m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
   pConnection->ConnectionTimeout=5;//等待連線的時間為5s
   hr=pConnection->Open((_bstr_t)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_csTestReortFile),"","",ADONameSpace::adConnectUnspecified);//m_csTestReortFile是要開啟的資料庫檔案絕對目錄

        if(FAILED(hr))
       {
            csErrorInfo.Format("開啟檔案 \"%s\"  失敗\r\n",csFilePath);
            OutputText(1,csErrorInfo,RGB(255,0,0));
            return false;
       }
  }
  hr = pRecordset.CreateInstance(__uuidof(ADONameSpace::Recordset));
  pRecordset->Open("SELECT * FROM CaseTable",pConnection.GetInterfacePtr (),ADONameSpace::adOpenDynamic,  \

ADONameSpace::adLockOptimistic,ADONameSpace::adCmdText);//CaseTable是ACCESS資料庫中的一個表格
  while(VARIANT_FALSE == pRecordset->adoEOF)
  {
   CString csResult;
   CString csCaseName;
   _variant_t vFieldValue;
   vFieldValue = pRecordset->GetCollect("LastResult");//獲取LastResult列對應的值
   csResult = (char*)_bstr_t(vFieldValue);
   vFieldValue = pRecordset->GetCollect("CaseName");
   csCaseName = (char*)_bstr_t(vFieldValue);
   if (csCaseName == m_csTestUnitText)
   {
    bIsFind = TRUE;
    if ("RPT_BLOCK" == csResult)
    {
     eGetResultError = GET_RESULT_BLOCK;
     break;
    }
    else if ("RPT_NG" == csResult )
    { 
     eGetResultError = GET_RESULT_NG;
     break;
    }
    else if ("RPT_OK" == csResult )
    { 
     eGetResultError = GET_RESULT_OK;
     break;
    }
   }
   pRecordset->MoveNext();                           //移到CaseTable中的下一行
  }
  if (FALSE == bIsFind)
  {
   eGetResultError = GET_RESULT_NOTFIND;
  }
   
 }
 catch(_com_error e)
 {
  eGetResultError = GET_RESULT_OTHER;
  return FALSE;
 }
 return TRUE;
}

程式碼在win7 32位+VC6.0中執行毫無問題,但是拿到XP上就出問題了

hr=pConnection.CreateInstance("ADODB.Connection");詞句出錯提示不支援此介面;

開始懷疑是xp上的msado15.dll檔案損壞,在網上找了點方法驗證了下:

1.在C:\Program Files\Common Files\System\ado下找到msado15.dll

在命令列輸入命令: regsvr32 C:\Program Files\Common Files\System\ado\msado15.dll  (注意命令列裡面不支援空格,所以最好還是按下面方法進行)
回車後,註冊該ado模組(如果註冊失敗,可以將當前路徑先到
C:\Program Files\Common Files\System\ado目錄再進行註冊)
   運用後能正常。
2.如果上述方式已然不行,那說本臺電腦的這個檔案可能有問題,
可以去找一臺沒有問題的電腦,把這個檔案拷貝過來,
然後操作1的步驟即可解決!

經過上面步驟驗證msado15.dll沒有問題,後來又檢視win7上的該檔案大小比XP上的翻了倍,所以開始懷疑是版本不匹配,

用OLE View->Type Libraries 檢視Microsoft ActiveX Data Objects *.* Library 版本從2.0到6.1的都有,

我標頭檔案裡恰好是引用的"C:\program files\common files\system\ado\msado15.dll" 這個檔案,所以我引用的是6.1版本,同樣的方法在xp上檢視只有2.8版本,再到WIN7下檢視2.8版本

再將我的標頭檔案改為

#import "C:\program files\common files\system\ado\msado28.tlb" rename_namespace("ADONameSpace") rename("EOF","adoEOF")

再次編譯到XP上執行,問題解決;

相關推薦

vc6.0 ADO訪問資料庫

最近做一個蛋疼的專案會用到ACCESS資料並從中讀取資料,由於之前沒搞過VC的專案,經過幾番磕磕碰碰總算搞好了,遂將解決流程記錄下來: 首先吐槽下微軟在版本相容性方面的缺陷,搞得我是蛋疼得不得了啊,若非高人相助現在已可能經吐血身亡了 廢話少說上程式碼: 以下程式碼環境:wi

ado訪問資料庫的最簡模型

環境:vc++ 6.0, MFC exe, 開始: 第一步:  在標頭檔案中找到 StdAfx.h,在 #endif  下面  新增 #import "c:\Program Files\Common Files\System\ado\msado15.

Windows下使用Python通過ODBC/ADO訪問資料庫

關鍵詞:Python 資料庫 ODBC ADO Python的確是一個很好的指令碼語言,簡潔而且功能很強。可惜文件資料奇缺,最近學Python,手裡唯一 的一本《Python技術參考大全》已經過時很久了。想用Pytho

VC6.0利用ado元件 向oracle資料庫插入圖片

oracle 資料庫中用Bolb儲存圖片 一、資料庫表設定 1、建立表 create table epoliceadmin.ep_image(image_id number(10) not null primary key, image blob); 2、建立序列 crea

VC6.0 通過ado連線access資料庫

  我們可以使用AfxOleInit()來初始化COM庫,這項工作通常在CWinApp::InitInstance()的過載函式中完成,請看如下程式碼:: public: _ConnectionPtr m_pConnection

VC++ ado連線資料庫(可以在VC6.0使用,以access資料庫為例項)(1)

很多新手對資料庫連線迷茫了,怎麼我寫的就連線不上資料庫呢?或者有些功能就實現不了(感覺這太奇葩了吧),下面就怎麼連線資料庫進行說明。 看以下程式碼和解說步驟:(後面附帶一個完整的類給大家進行下載,便於直接進行呼叫) 1.首先新建一個類,方便下次使用,編寫了一次就不用再編寫。

《B/S模式下ADO.NET資料庫訪問技術的設計及應用》論文筆記(十七)

一、基本資訊 標題:B/S模式下ADO.NET資料庫訪問技術的設計及應用 時間:2014 來源:電子測試 關鍵詞:B/S模式; ADO.NET資料庫訪問技術; 設計; 應用; 二、研究內容 1.ADO.NET資料庫訪問技術的兩種模式: 連線模式下的資料庫訪問技術:

Ubuntu Server 18 解除安裝MySQL5.*安裝MySQL8.0,實現遠端訪問資料庫

如果你在Ubuntu18直接用 sudo apt-get install mysql-client mysql-server 系統預設會安裝MySQL會預設安裝5.7,但是MySQL5.7版本最高只適配到Ubuntu17.04,而MySQL8.0最高適配到Ubuntu18.04。

使用ADO.NET訪問資料庫 使用ADO.NET訪問資料庫

使用ADO.NET訪問資料庫   Program using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks

ADO.NET訪問資料庫

一.ADO.NET :用於連線資料庫的技術 1.ADO.NET分為兩大元件 DataSet:資料集 .NET FRAMWORK :用於連線到資料庫,傳送命令,檢索結果 2.ADO.NET四大核心物件 Connection Command DataAdapter DataReader 二.使用AD

看“高手”如何理解ADO.NET資料庫訪問技術

ADO.NET資料庫訪問技術是系統開發的一項必備技能,如何輕鬆理解它的精髓呢?其實就是3個步驟4個要點。 1、使用連線物件Connection連線資料來源 2、使用命令物件Command執行SQL語句操縱資料庫 3、使用資料讀取器物件DataReader讀取資料 4、使用資料集物件DataSet和

ADO.net資料庫訪問技術(一)

          現在,幾乎所有的管理軟體都會和資料庫打交道,ADO.net是新一代的資料存取技術,是一個全新的資料庫訪問模型,支援記憶體中的離線訪問!記得之前敲過的機房收費系統,基本上每個窗體都會

VC++中ADO方式訪問資料庫datetime欄位(不帶毫秒時間與帶毫秒時間)

    //取得列名    bstrColName = m_pRSet->GetFields()->Item[nCol]->GetName() ;    strColname = (char*)bstrColName ;    //取得當前行當前列值    varCounter.lVal =

VBA中用ADO訪問SQL SERVER資料庫:資料查詢

本程式的作用是:使用資料物件ADO訪問SQL資料庫,從而進行資料查詢,並將查詢的資料返回到EXCEL中,由於此程式需用到SQL資料庫,所以只供大家參考,不便執行,但大家可以看出其精華!    Private Sub CommandButton1_Click()   Dim cn As New ADODB.Co

痛苦的歷程:Ado訪問PARADOX資料庫

前面接手一個專案,需要用VC訪問已經存在的PARADOX資料庫。在接手這個專案前,對於PARADOX的理解少之又少,只知道有這麼一種資料庫,並不瞭解它的結構是什麼。真正對它進行操作的時候,才發現是如此之難。有幾次差點都放棄了,但最後一咬牙,總算堅持過來了。在這期間,我走了不少

VC6.0通過ADO呼叫SQL Server 2000的儲存過程出現引數過多的問題

今天在做畢業設計的時候遇到一個很奇怪的問題,我以前通過傳遞三個引數的儲存過程呼叫都還是很成功的,為什麼今天就不行了呢?程式碼如下: HRESULT hr; if (m_pCmd == NULL) { hr = m_pCmd.Creat

VC6.0中用ado連接數據庫出錯

連接 sta 可能 cti mod ole dll jet enable 1. 在stdafx.h中添加 #import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace re

VC6.0在Win10下的兼容性問題設置(可以試試)

log 可執行 ros .com 機器語言 默認安裝 program lang 軟件開發工具 Microsoft Visual C++ 6.0,簡稱VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機器語言(低級語言)”的程 序。Visual C++是一個功能

ThinkPHP5.0---URL訪問

參數 模塊 server 設置 地址 中控 默認 gte 配置 ThinkPHP 5.0 在沒有啟用路由的情況下典型的URL訪問規則是(采用 PATH_INFO 訪問地址): http://serverName/index.php(或者其它應用入口文件)/模塊/控制器

Ado訪問sqlserver 端口號非1433時 連接串的寫法

security tro size uri hostname false info ide ado Ado訪問sqlserver 端口號非1433時 連接串的寫法 Provider=SQLOLEDB.1;Persist Security Info=False;Data So