高分求教:OleDB访问SQL2000的问题
我有一段代码原来是通过OLEDB访问Access数据库没有问题。
我现在改为连接SQL2000数据库,运行也没有问题,但是返回的记录集是空的。
请问是什么原因造成的,应如何修改?
如果分数不够可以继续加。。。
以下是原代码:
//对象定义
CCommand<CManualAccessor, CRowset, CMultipleResults> m_rsCmd; //执行sql命令的OLE DB模板类实例
SDBCmdExeContext m_RsContext; //执行一条查询类型的sql语句的上下文环境
//执行查询的SQL语句
BOOL CGeneralDBCmd::ExecQuerySql(CString &strSql)
{
USES_CONVERSION;
TRY
{
m_rsCmd.Close();
//释放原先的Command执行时开辟的内存
freeContext();
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);
// 打开但是不绑定
if (m_rsCmd.Open(m_Session, strSql, &propset, NULL, DBGUID_DBSQL, FALSE) != S_OK)
{
AfxMessageBox(_T("不能打开行集!"));
return FALSE;
}
// If a valid rowset is not returned (i.e. like running an INSERT
// statement, then exit the routine
if (m_rsCmd.m_spRowset == NULL)
{
AfxMessageBox(_T("执行成功,无行集返回!"));
return FALSE;
}
// Get the column information
if (m_rsCmd.GetColumnInfo(&m_RsContext.ulColumns, &m_RsContext.pColumnInfo, &m_RsContext.pStrings) != S_OK)
AfxThrowOLEDBException(m_rsCmd.m_spRowset, IID_IColumnsInfo);
//动态绑定缓冲
ULONG ulBindBufLen = 0;
CString strTip;
DBTYPE dtBindType;
//计算所需的绑定缓冲的大小
for (ULONG l = 0; l < m_RsContext.ulColumns; l++)
{
if (m_RsContext.pColumnInfo[l].ulColumnSize > 255)
{
ulBindBufLen += 255;
}
else
{
ulBindBufLen += (m_RsContext.pColumnInfo[l].ulColumnSize + 10);
}
}
//如果绑定缓冲的长度大于0
if (ulBindBufLen > 0)
{
m_RsContext.piBindLen = (int*)new int[m_RsContext.ulColumns];
m_RsContext.pdwStatus = (DWORD*)new DWORD[m_RsContext.ulColumns];
m_RsContext.pszBindBufPos = (TCHAR**)malloc(sizeof(TCHAR*) * m_RsContext.ulColumns);
m_RsContext.szBindBuf = new TCHAR[ulBindBufLen];
memset(m_RsContext.szBindBuf, 0, sizeof(TCHAR) * ulBindBufLen );
memset(m_RsContext.pdwStatus, 0, sizeof(DWORD) * m_RsContext.ulColumns);
m_RsContext.piBindLen[0] = 0;
m_RsContext.pszBindBufPos[0] = m_RsContext.szBindBuf;
//计算各字段绑定缓冲的偏移量
for (l = 0; l < m_RsContext.ulColumns; l++)
{
if (m_RsContext.pColumnInfo[l].ulColumnSize > 255)
{
m_RsContext.piBindLen[l] = 255;
}
else
{
m_RsContext.piBindLen[l] = m_RsContext.pColumnInfo[l].ulColumnSize + 10;
}
if (l + 1 < m_RsContext.ulColumns)
m_RsContext.pszBindBufPos[l + 1] = m_RsContext.pszBindBufPos[l] + m_RsContext.piBindLen[l];
//strTip.Format("piBindLen[%u] = %d, pszBindBufPos[] = %x", l, piBindLen[l] - 10, pszBindBufPos[l]);
//AfxMessageBox(strTip);
} // end for
}
m_rsCmd.CreateAccessor(m_RsContext.ulColumns, m_RsContext.szBindBuf, ulBindBufLen);
for ( l = 0; l < m_RsContext.ulColumns; l++)
{
dtBindType = DBTYPE_STR;
//因为按字符串绑定浮点精度的字段会出现问题,因此改为
if (m_RsContext.pColumnInfo[l].wType == DBTYPE_R8) //2006-10-18
dtBindType = DBTYPE_R8;
// 原来的第一个参数为l+1,现改为l;
m_rsCmd.AddBindEntry(l, dtBindType, m_RsContext.piBindLen[l], m_RsContext.pszBindBufPos[l], NULL, &m_RsContext.pdwStatus[l]);
}
m_rsCmd.Bind();
}
CATCH(COLEDBException, e)
{
/* CErrorsDialog dlg;
dlg.Init(e->m_lpUnk, e->m_iid);
dlg.DoModal(); */
}
END_CATCH
return TRUE;
}
程序连接SQL2000单步调试不报错,但m_rsCmd返回的记录集没有记录,
请问是什么问题,应该怎么修改。