我使用ATL的类进行数据库操作,同样的程序,执行如下面的语句select nindex,ndate from sphone就没有任何错误:但是如果执行如:select sount(*) from sphone 或者 select sum(nsum) from sphone 就会产生:“多步 OLE DB 操作产生错误,请检查每个OLE DB 状态值, 没有工作被完成。 ”的错误。错误号是-2147217887具体程序如下:数据库连接
HRESULT hr;
CDBPropSet dbinit(DBPROPSET_DBINIT); //设置属性
dbinit.AddProperty(DBPROP_AUTH_USERID, strUserID); //Oracle要求
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, strPsw); //Oracle要求
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, strHost); //Oracle要求
dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_TIMEOUT, (long)60);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, OLESTR(""));
dbinit.AddProperty(DBPROP_OUTPUTPARAMETERAVAILABILITY, DBPROPVAL_OA_ATROWRELEASE);
dbinit.AddProperty(DBPROP_MULTIPLESTORAGEOBJECTS, VARIANT_TRUE);
//支持多返回值
dbinit.AddProperty(DBPROP_MULTIPLERESULTS, DBPROPVAL_MR_SUPPORTED);
try
{
if (m_nDbType == DB_TYPE_ORACLE)
{
dbinit.AddProperty(DBPROP_ORDERBYCOLUMNSINSELECT, VARIANT_FALSE);//支持order by 语句,只对Oracle有用
dbinit.AddProperty(DBPROP_PROCEDURETERM, _T("PL/SQL Stored Procedure"));
dbinit.AddProperty(DBPROP_PROVIDERFRIENDLYNAME, _T("Oracle Provider for OLE DB"));
dbinit.AddProperty(DBPROP_PROVIDERNAME, _T("OraOLEDB.dll"));
hr = m_DataSource.Open(_T("MSDAORA.1"), &dbinit);//打开数据源
}
else
{
dbinit.AddProperty(DBPROP_MULTIPLEPARAMSETS, VARIANT_TRUE);//支持多参数,在Oracle的存储过程中不能使用,添加到这里
dbinit.AddProperty(DBPROP_INIT_CATALOG, pszDatebase); //Oracle不要求
hr = m_DataSource.Open(_T("SQLOLEDB.1"),&dbinit);//打开数据源
}
if (FAILED(hr))
{
GetLastError(m_szLastErrorDesc);
AfxGetMainWnd()->SendMessage(WM_SET_DB_STATUS, 0, 0);
return FALSE;
}
//打开会话。
hr = m_session.Open(m_DataSource);
if(FAILED(hr))
{
m_DataSource.Close();
GetLastError(m_szLastErrorDesc);
AfxGetMainWnd()->SendMessage(WM_SET_DB_STATUS, 0, 0);
return FALSE;
} }
catch(...)
{
GetLastError(m_szLastErrorDesc);
AfxGetMainWnd()->SendMessage(WM_SET_DB_STATUS, 0, 0);
return FALSE;
}
m_bConnect = TRUE; 执行SQL语句:
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(ORAPROP_PLSQLRSet, true);
propset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);

CCommand<CManualAccessor> rs;
HRESULT hr = rs.Open(m_session, strSQL, &propset, NULL, DBGUID_DBSQL, FALSE);
if (FAILED(hr))
{//执行带sql server 的函数是会在这里出错
GetLastError(m_szLastErrorDesc);
SetStatus(m_szLastErrorDesc);
return FALSE;
}
请高手指点迷津!