首页 > C/C++开发工具专区 > VC技术 > VC中使用ADO连接MSSQL
2012
07-22

VC中使用ADO连接MSSQL

 

1. 在stdfx.h中导入MSADO15.DLL,如下:

 

  1. #pragma warning(disable:4146)  
  2. #import "C:/Program Files/Common Files/System/ADO/MSADO15.DLL" rename_namespace("ADOClient") rename("EOF","adoEOF")  
  3. using namespace ADOClient;  
  4. // 重定义MSADO15库中的结束标志,避免和vc关键字相同  
  5. rename("EOF","adoEOF")  

 

2. 定义连接对象

 

  1. _ConnectionPtr m_pADOCon;  
  2. _CommandPtr m_pADOCmd;  
  3. _RecordsetPtr m_pRecordSet;  

 

3. 创建连接对象,并用_CommandPtr查询数据库.

 

  1. //设置数据库连接参数  
  2. BOOL CADOManager::SetDBServer(LPSTR lpHost, LPSTR lpDataName, LPSTR lpName, LPSTR lpPsw)  
  3. {  
  4.     if( m_pADOCon == NULL )  
  5.      return FALSE;  
  6.      m_pADOCon ->CommandTimeout = 20;  
  7.      m_pADOCon ->CursorLocation = adUseClient;  
  8.      HRESULT hr = -1;  
  9.      _bstr_t bstrCon( "Driver={SQL Server};Server=" );  
  10.      bstrCon += lpHost;  
  11.      bstrCon += ";Database=";  
  12.      bstrCon += lpDataName;  
  13.      bstrCon += ";UID=";  
  14.      bstrCon += lpName;  
  15.      bstrCon += ";PWD=";  
  16.      bstrCon += lpPsw;  
  17.      //PORT=3306;Option=131072;  
  18.      hr = m_pADOCon ->Open( bstrCon, "","",adModeUnknown);  
  19.     if (SUCCEEDED(hr))  
  20.     {  
  21.        hr = m_pADOCmd.CreateInstance( "ADODB.Command" );  
  22.        if (SUCCEEDED(hr))  
  23.        {  
  24.           m_pADOCmd ->ActiveConnection = m_pADOCon;  
  25.           hr = m_pRecordSet.CreateInstance( "ADODB.Recordset" );  
  26.           if (SUCCEEDED(hr))  
  27.           {  
  28.              return TRUE;  
  29.            }  
  30.        }    
  31.      }  
  32.      return FALSE;  
  33. }  
  34. // 初始化, 设置连接参数  
  35. CADOManager::CADOManager()  
  36. {  
  37.    ::CoInitialize(0);  
  38.    HRESULT hr = m_pADOCon.CreateInstance( "ADODB.Connection" );  
  39.    if (FAILED(hr))  
  40.    {  
  41.       ::MessageBox(NULL, "数据库连接初始化失败!","错误", MB_OK );  
  42.     }  
  43.     SetDBServer( "SQLServerName""DATABASEName""LoginName""LoginPWD" );  
  44. }  
  45. //进行SQL查询等  
  46. BOOL CADOManager::Query(LPSTR lpSQL)  
  47. {  
  48.    if ((m_pADOCmd == NULL) || (m_pRecordSet == NULL))  
  49.      return FALSE;  
  50.    
  51.    _variant_t varNULL;  
  52.    varNULL.vt = VT_ERROR;  
  53.    varNULL.scode = DISP_E_PARAMNOTFOUND;  
  54.    m_pADOCmd ->CommandText = _bstr_t(lpSQL);  
  55.    _bstr_t bstrShow = "";  
  56.    m_pRecordSet = m_pADOCmd ->Execute( &varNULL, &varNULL, adCmdText );  
  57.    //long lCount = m_pRecordSet ->GetRecordCount();  
  58.    long lCount = 0;  
  59.    HRESULT hr = m_pRecordSet ->get_RecordCount( &lCount );  
  60.    long lSize = 0;  
  61.    Fields * pFields = NULL;  
  62.    //得到记录集的字段集和  
  63.    hr = m_pRecordSet ->get_Fields( &pFields );  
  64.    //获取每条记录长度  
  65.    if (SUCCEEDED(hr)){  
  66.       hr = pFields ->get_Count( &lSize );         
  67.    }  
  68.    while (!m_pRecordSet->adoEOF)  
  69.    {  
  70.       _variant_t varTmp;  
  71.       for (long j = 0; j < lSize; j++)  
  72.       {  
  73.          varTmp = m_pRecordSet ->GetCollect(_variant_t(j));  
  74.          if (j > 0){  
  75.             bstrShow += ",";  
  76.          }  
  77.          bstrShow += _bstr_t(varTmp);  
  78.        }  
  79.        m_pRecordSet ->MoveNext();  
  80.     }  
  81.     ::MessageBox( NULL, bstrShow,"查询结果", MB_OK );  
  82.   
  83.     return TRUE;  
  84. }  

  

 

4. ADO连接MSSQL,发现GetRecordCount()返回-1

 

一般情况下当ADO不能确定记录条数,或者连接提供者、游标类型都不支持RecordCount的时候,RecordCount属性都将返回-1。而在一个已经关闭了的Recordset上读取这个属性会引起错误。
为了使用RecordCount属性,我们需要在Open()调用前设置好游标(静态/客户).例如:
在m_pSet->Open()前加上:
m_pSet->CursorType = adOpenStatic;
m_pSet->CursorLocation = adUseClient;


留下一个回复