1. 在stdfx.h中导入MSADO15.DLL,如下:
#pragma warning(disable:4146)
#import "C:/Program Files/Common Files/System/ADO/MSADO15.DLL" rename_namespace("ADOClient") rename("EOF","adoEOF")
using namespace ADOClient;
// 重定义MSADO15库中的结束标志,避免和vc关键字相同
rename("EOF","adoEOF")2. 定义连接对象
_ConnectionPtr m_pADOCon; _CommandPtr m_pADOCmd; _RecordsetPtr m_pRecordSet;
3. 创建连接对象,并用_CommandPtr查询数据库.
//设置数据库连接参数
BOOL CADOManager::SetDBServer(LPSTR lpHost, LPSTR lpDataName, LPSTR lpName, LPSTR lpPsw)
{
if( m_pADOCon == NULL )
return FALSE;
m_pADOCon ->CommandTimeout = 20;
m_pADOCon ->CursorLocation = adUseClient;
HRESULT hr = -1;
_bstr_t bstrCon( "Driver={SQL Server};Server=" );
bstrCon += lpHost;
bstrCon += ";Database=";
bstrCon += lpDataName;
bstrCon += ";UID=";
bstrCon += lpName;
bstrCon += ";PWD=";
bstrCon += lpPsw;
//PORT=3306;Option=131072;
hr = m_pADOCon ->Open( bstrCon, "","",adModeUnknown);
if (SUCCEEDED(hr))
{
hr = m_pADOCmd.CreateInstance( "ADODB.Command" );
if (SUCCEEDED(hr))
{
m_pADOCmd ->ActiveConnection = m_pADOCon;
hr = m_pRecordSet.CreateInstance( "ADODB.Recordset" );
if (SUCCEEDED(hr))
{
return TRUE;
}
}
}
return FALSE;
}
// 初始化, 设置连接参数
CADOManager::CADOManager()
{
::CoInitialize(0);
HRESULT hr = m_pADOCon.CreateInstance( "ADODB.Connection" );
if (FAILED(hr))
{
::MessageBox(NULL, "数据库连接初始化失败!","错误", MB_OK );
}
SetDBServer( "SQLServerName", "DATABASEName", "LoginName", "LoginPWD" );
}
//进行SQL查询等
BOOL CADOManager::Query(LPSTR lpSQL)
{
if ((m_pADOCmd == NULL) || (m_pRecordSet == NULL))
return FALSE;
_variant_t varNULL;
varNULL.vt = VT_ERROR;
varNULL.scode = DISP_E_PARAMNOTFOUND;
m_pADOCmd ->CommandText = _bstr_t(lpSQL);
_bstr_t bstrShow = "";
m_pRecordSet = m_pADOCmd ->Execute( &varNULL, &varNULL, adCmdText );
//long lCount = m_pRecordSet ->GetRecordCount();
long lCount = 0;
HRESULT hr = m_pRecordSet ->get_RecordCount( &lCount );
long lSize = 0;
Fields * pFields = NULL;
//得到记录集的字段集和
hr = m_pRecordSet ->get_Fields( &pFields );
//获取每条记录长度
if (SUCCEEDED(hr)){
hr = pFields ->get_Count( &lSize );
}
while (!m_pRecordSet->adoEOF)
{
_variant_t varTmp;
for (long j = 0; j < lSize; j++)
{
varTmp = m_pRecordSet ->GetCollect(_variant_t(j));
if (j > 0){
bstrShow += ",";
}
bstrShow += _bstr_t(varTmp);
}
m_pRecordSet ->MoveNext();
}
::MessageBox( NULL, bstrShow,"查询结果", MB_OK );
return TRUE;
}4. ADO连接MSSQL,发现GetRecordCount()返回-1
一般情况下当ADO不能确定记录条数,或者连接提供者、游标类型都不支持RecordCount的时候,RecordCount属性都将返回-1。而在一个已经关闭了的Recordset上读取这个属性会引起错误。
为了使用RecordCount属性,我们需要在Open()调用前设置好游标(静态/客户).例如:
在m_pSet->Open()前加上:
m_pSet->CursorType = adOpenStatic;
m_pSet->CursorLocation = adUseClient;