C++操作ADO中关于Command执行结果返回的Recordset的疑问?!

dawei_sun 2009-03-03 11:43:59
如果Command执行的是具有返回数据条目的SQL语句。如:SELECT语句。那么Recordset比较好理解。

但是如果Command执行的是一个DELETE或是UPDATE语句或是其它的存储过程的话,那么返回的Recordset对象指针是什么呢?
如果不知道Command执行的是什么SQL语句的情况下如何判断呢?

比如下面的函数

_RecordsetPtr GetRecordset(_ConnectionPtr& pConn,_bstr_t str_sql)
{
HRESULT hr = S_OK;

_CommandPtr pCmd = NULL;
hr = pCmd.CreateInstance(__uuidof(Command));


if(hr != S_OK)
{
//记录集创建失败
//char* err_buf = "EE记录集创建失败";
//send(sock,err_buf,strlen(err_buf)+1,0);
return;
}

pCmd->ActiveConnection = pConn;
pCmd->CommandText = strsql;

return pCmd->Execute(NULL,NULL,adCmdUnknown);
}

如果strsql传的是一个SELECT语句。那么返回的Recordset对象指针自然好办。
如果strsql传的是一个UPDATE或是DELETE语句。那么此时返回的Recordset对象指针是什么呢?
...全文
335 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-03-03
  • 打赏
  • 举报
回复
知道是Update,Delete操作等,就可以不用处理返回的记录集...
qiangorqiang 2009-03-03
  • 打赏
  • 举报
回复
可以建两个函数。一个是需要返回记录集,另一个返回void。
操作时根据情况选择调用的函数。
ding1188 2009-03-03
  • 打赏
  • 举报
回复
空的数据集
dawei_sun 2009-03-03
  • 打赏
  • 举报
回复
问题已经解决了.
当Execute执行Update这类语句的时候如果不设置adExecuteNoRecords的时候.返回一个已经关闭的Recordset.如果设置了adExecuteNoRecords返回Nothing

MDSN原话:If the command is not intended to return results (for example, an SQL UPDATE query) the provider returns Nothing as long as the option adExecuteNoRecords is specified; otherwise Execute returns a closed Recordset. Some application languages allow you to ignore this return value if no Recordset is desired.

dawei_sun 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]
引用 9 楼 dawei_sun 的回复:
引用 5 楼 qiangorqiang 的回复:
引用 4 楼 dawei_sun 的回复:
我这个strsql是客气端传来一个字符串,我怎么知道传来的会是SELECT还是UPDATE啊

可以在传过来的数据中加一个标志,然后服务器检查这个标志。
或者在字符串的前面检查是否有"select"字符串。


如果客户端传来的标志位是"SELECT",然而传来的SQL语句却是UPDATE怎么办?

所以这样做会造成冗余.数据不一致.

这…
[/Quote]

赞同,你做法保证民标志位和SQL语句匹配.
oyljerry 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawei_sun 的回复:]
引用 5 楼 qiangorqiang 的回复:
引用 4 楼 dawei_sun 的回复:
我这个strsql是客气端传来一个字符串,我怎么知道传来的会是SELECT还是UPDATE啊

可以在传过来的数据中加一个标志,然后服务器检查这个标志。
或者在字符串的前面检查是否有"select"字符串。


如果客户端传来的标志位是"SELECT",然而传来的SQL语句却是UPDATE怎么办?

所以这样做会造成冗余.数据不一致.
[/Quote]
这个应该客户端来判断等,比如客户端有个查询按钮,那么对应的就是SELECT,如果有个更新按钮,对应的就是UPDATE,你不应该去区分,由它区分。

On the other hand, 你执行完了,就直接把数据返回给客户端,有客户端自己根据他的请求来处理对应的结果,它应该知道当前返回的是查询结果,还是做了更新动作等.
dawei_sun 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qiangorqiang 的回复:]
引用 4 楼 dawei_sun 的回复:
我这个strsql是客气端传来一个字符串,我怎么知道传来的会是SELECT还是UPDATE啊

可以在传过来的数据中加一个标志,然后服务器检查这个标志。
或者在字符串的前面检查是否有"select"字符串。
[/Quote]

如果客户端传来的标志位是"SELECT",然而传来的SQL语句却是UPDATE怎么办?

所以这样做会造成冗余.数据不一致.
liuzxchina 2009-03-03
  • 打赏
  • 举报
回复
不管是什么sql语句,他们都调用同一个函数,
select语句返回recordset,那么其他sql语句也必须返回recordset,
update,delete返回的recordset应该是空的。
dawei_sun 2009-03-03
  • 打赏
  • 举报
回复
我是这样想的。如果返回的是“有效”的Recordset。那么我就把Recordset中的数据一条一条的发送给客户端。
如果返回的不是“有效”的Recordset(如Update或是Delete执行结果),那就告诉客户端执行的结果(是成功还是失败,如果失败把失败的原因发给客户端)。

所以当然我就是需要通过这个Execute的返回_RecordsetPtr对象指针来判断到底执行的是何种类型的SQL语句。然后我才采取相应的动作。

现在我就是不知道如果执行的是Update或Delete诸如此类的语句返回的_RecordsetPtr对象指针到底是什么东西。

对这个指针进行操作都会报异常。。按道理我想应该可以通过这个指针进行判断的才对,有没有哪个大哥告诉小弟一下,用C++操作ADO写的不多。不是很熟悉。
levelmouse 2009-03-03
  • 打赏
  • 举报
回复
对头。不管是查询,更新,删除,你先找到数据记录,然后再对其进行相应的操作。
qiangorqiang 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dawei_sun 的回复:]
我这个strsql是客气端传来一个字符串,我怎么知道传来的会是SELECT还是UPDATE啊
[/Quote]
可以在传过来的数据中加一个标志,然后服务器检查这个标志。
或者在字符串的前面检查是否有"select"字符串。
dawei_sun 2009-03-03
  • 打赏
  • 举报
回复
我这个strsql是客气端传来一个字符串,我怎么知道传来的会是SELECT还是UPDATE啊

4,011

社区成员

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

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