我使用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;
}
请高手指点迷津!
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;
}
请高手指点迷津!
解决方案 »
- 轻量级网络引擎styleman_network v1.0发布
- 请问我想将这个文本保存到数组里中间如何添加,有点难度
- 怎样获取笔记本内置电池的电压,等参数
- 如何调用函数格式化U盘?
- 请指教。。。。。
- 串口的问题,请看代码!
- 我做了一个容器程序,用来打开Word文档,请问高手,有什么办法可以禁止使用CTRL-C来复制Word文档的内容?
- 请软技术支持中心解答?CoCreateInstance的问题。 着急等待中。。。
- ftp的问题,帮帮我,各位大蟹
- 高分!请教一些学习方法
- 怎样得到系统中存在的串口个数?在线等待
- 请教诸位大侠:DataGrid组件(v6.0),怎样改变列的宽度,我要给每列设定不同的宽度,不是要固定的那种
select sount(*) from sphone ?