用CRecordSet的派生类的Open函数执行sql语句为什么不行?

on_shift 2003-08-31 01:59:45
我有两个代码,访问的是相同的功能

正确的:
CDatabase db;
db.OpenEx("DSN=DB;UID=sa;PWD=******;");
CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,"select smax=min(cargoID) from NEWBUSY");
CDBVariant result;
rs.GetFieldValue("smax",result);
这个是可以返回正确结果的。


错误的:
if(m_newbusySet.IsOpen())
m_newbusySet.Close();
m_newbusySet.Open(AFX_DB_USE_DEFAULT_TYPE,"select smax=min(cargoID) from NEWBUSY");
CDBVariant strmax;
m_newbusySet.GetFieldValue("smax",strmax);
这个m_newbusySet是我用New Class生成的一个CRecordSet的派生类的一个对象,已经默认的连接到数据库了。返回的错误信息是:无效的描述器索引。

高手说说为什么啊。

另外,用CRecordSet的派生类的时候,总是要弹出一个登陆数据库的对话窗,现在总是使用“使用信任连接”,用户名和密码都不对,怎么不用“信任连接”啊?
...全文
90 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
on_shift 2003-09-04
  • 打赏
  • 举报
回复
thx,我改用CDatabase的类了,不过插入和读取就麻烦一点吧了。
cdwy411 2003-09-01
  • 打赏
  • 举报
回复
如果你是重载的,尤其是你用了SQL函数如:min()你都要修改你的DOFieldExchange()函数
并且要修改相应的数据类型。使一一对应,这样才能实现数据交换!
VCP4 2003-09-01
  • 打赏
  • 举报
回复
然后:
m_newbusySet.Open();
VCP4 2003-09-01
  • 打赏
  • 举报
回复
将"select smax=min(cargoID) from NEWBUSY" SQL语句放在如
CXXXRecordSet::GetDefaultSQL()
下试一试。
whiteclouds 2003-09-01
  • 打赏
  • 举报
回复
照下面的修改试试:
CDatabase db;
db.OpenEx("DSN=DB;UID=sa;PWD=******;");
CRecordset* rs;
rs=new CRecordset(&db);
rs->Open(AFX_DB_USE_DEFAULT_TYPE,"select smax=min(cargoID) from NEWBUSY");
CDBVariant result;
rs->GetFieldValue("smax",result);
jj601 2003-09-01
  • 打赏
  • 举报
回复
你在getdefaultconnect()中,添加代码
return _T("ODBC;DSN=db4;UID=jiangjing;PWD=1234"); //在这里加入用户名和密码
编译链接后,运行时就不会再弹出登陆数据库的对话框了
on_shift 2003-09-01
  • 打赏
  • 举报
回复
我看过了,这个函数就是把列和变量对应起来的,如果不能重载的话,不如不用派生的了。
on_shift 2003-09-01
  • 打赏
  • 举报
回复
那么,派生类里还会不会有各列的对应变量?
small_wei 2003-08-31
  • 打赏
  • 举报
回复
正确的:
DoFieldExchange(CFieldExchange* pFX) 没有被重载,是空的。
错误的:
DoFieldExchange(CFieldExchange* pFX) 被重载了,里面没有"smax"项,所以出错。
定义一个派生类时应该这样:
CDatabase db //已经连接的数据库类
m_newbusySet rs(&db)

4,011

社区成员

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

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