高分求教:OleDB访问SQL2000的问题

GoldFox 2008-05-07 04:15:22
我有一段代码原来是通过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返回的记录集没有记录,
请问是什么问题,应该怎么修改。
...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2008-05-08
  • 打赏
  • 举报
回复
试试propset.AddProperty(DBPROP_CLIENTCURSOR, VARIANT_TRUE);
Kudeet 2008-05-08
  • 打赏
  • 举报
回复
试试添加
propset.AddProperty(DBPROP_CLIENTCURSOR, VARIANT_TRUE);
Kudeet 2008-05-08
  • 打赏
  • 举报
回复
试试添加
propset.AddProperty(DBPROP_CLIENTCURSOR, VARIANT_TRUE);
GoldFox 2008-05-08
  • 打赏
  • 举报
回复
SQL语句确定没有问题,肯定有记录,
单步调试发现在执行m_rsCmd.Bind(); 语句后就没有记录了
应该是绑定出了问题,但不知道问题出在哪里
请高手指点!!!!!
Eleven 2008-05-08
  • 打赏
  • 举报
回复
或是将SQL语句写入文本文件,再在查询分析器中执行一下,已确定真的有记录存在。
Eleven 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoujianhei 的回复:]
将你的SQL 语句先在查询分析器中执行一下,已确定真的有记录存在。
[/Quote]
GoldFox 2008-05-08
  • 打赏
  • 举报
回复
SQL语句没有问题,在查询分析器中执行也有记录
在程序中执行也有没有问题,但只返回了表结构,没有记录
zhoujianhei 2008-05-08
  • 打赏
  • 举报
回复
将你的SQL 语句先在查询分析器中执行一下,已确定真的有记录存在。
GoldFox 2008-05-08
  • 打赏
  • 举报
回复
执行Select查询 就没有记录返回 与事务无关
Walker-cheng 2008-05-07
  • 打赏
  • 举报
回复
有没有提交事务呀...
scq2099yt 2008-05-07
  • 打赏
  • 举报
回复
两者主要差别就是连接字符串不一样。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧