Camus1981
驱动牛犊
驱动牛犊
  • 注册日期2004-08-09
  • 最后登录2006-04-13
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2559回复:6

请教一个vc用ODBC连接oracle数据库的问题

楼主#
更多 发布于:2005-06-05 13:01
我用appwizard创建一个sdi,数据库支持我选的header file only.
我首先用classwizard创建了一个基类为CRecordset的派生类CMyrs.
整个程序也就几行打开数据源的代码,是放在view类的ondraw()函数里的:

CMyrs rs(NULL);//当然定义类的头文件myrs.h是include到view.cpp的了
rs.Open();//打开数据集

if(rs.IsEOF())//判断数据集是否为空
    AfxMessageBox(\"eof\");
else
    AfxMessageBox(\"not eof\");

这是最基本的连接数据源的代码了,可问题是第一次我创建了这样的程序,运行后显示是not eof的,表示数据集有数据,而且无论运行几次都显示not eof.
但我后来又编写完全一样的代码创建了第二个这样的程序,显示eof,表示数据集没有数据,而且无论运行几次都显示eof,而运行第一次的程序是显示not eof,是有数据的,但我两次的程序代码是完全一样的(总共就上面几行代码,应该是不会有错了)。
我已经尝试过很多次了,数据库表本身是肯定有数据的,但用同一代码创建不同的程序运行结果却不一样,不知道是怎么回事了.
请有经验的弟兄告知缘由,衷心感谢.

[编辑 -  6/5/05 by  Camus1981]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-06 09:36
我用appwizard创建一个sdi,数据库支持我选的header file only.
我首先用classwizard创建了一个基类为CRecordset的派生类CMyrs.
整个程序也就几行打开数据源的代码,是放在view类的ondraw()函数里的:

CMyrs rs(NULL);//当然定义类的头文件myrs.h是include到view.cpp的了
rs.Open();//打开数据集

if(rs.IsEOF())//判断数据集是否为空
    AfxMessageBox(\"eof\");
else
    AfxMessageBox(\"not eof\");

这是最基本的连接数据源的代码了,可问题是第一次我创建了这样的程序,运行后显示是not eof的,表示数据集有数据,而且无论运行几次都显示not eof.
但我后来又编写完全一样的代码创建了第二个这样的程序,显示eof,表示数据集没有数据,而且无论运行几次都显示eof,而运行第一次的程序是显示not eof,是有数据的,但我两次的程序代码是完全一样的(总共就上面几行代码,应该是不会有错了)。
我已经尝试过很多次了,数据库表本身是肯定有数据的,但用同一代码创建不同的程序运行结果却不一样,不知道是怎么回事了.
请有经验的弟兄告知缘由,衷心感谢.

[编辑 -  6/5/05 by  Camus1981]

你的select语句呢?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-06 09:53
对楼主别再白费时间了,肯定是两个程序不一样,可能是某个选项的选择不一样。(也可能你没仔细看代码。 :))。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
CII_GZH
驱动中牛
驱动中牛
  • 注册日期2005-06-16
  • 最后登录2007-08-27
  • 粉丝0
  • 关注0
  • 积分257分
  • 威望127点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-16 16:26
感觉你没有关闭数据库,可以这样,你不是第一次显示有数据吗?然后关闭机器,从新启动,看看应该也是有数据,不重起,数据库打开了没有关闭,在打开可能就打不开了。
学习
dreamday
驱动牛犊
驱动牛犊
  • 注册日期2005-05-31
  • 最后登录2009-11-20
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-18 11:54
在访问第一条记录前请使用,MoveFirst()函数,不然后续访问的执针位置不可预计。
nicoster
驱动牛犊
驱动牛犊
  • 注册日期2005-04-07
  • 最后登录2008-11-18
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-25 17:17
CRecordSet 类可以直接使用. 不用重载. 一般配合 CDatabase 使用.
典型应用是这样的:


CDatabase db;
db.Open(_T("DSN=TestDB;UID=scott;PWD=scott;"), CDatabase::noOdbcDialog);
CRecordSet rs(&db);
CString csField;
rs.Open(_T("Select name from tab"), CRecordSet::ForwardOnly);
while(! rs.IsEof())
{
    rs.GetFieldValue(short(0), csField);
    TRACE(csField + _T("\n"));
    rs.MoveNext();
}

rs.Close()
nicoster
驱动牛犊
驱动牛犊
  • 注册日期2005-04-07
  • 最后登录2008-11-18
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-25 17:24
下面是引用dreamday于2005-06-18 11:54发表的:
在访问第一条记录前请使用,MoveFirst()函数,不然后续访问的执针位置不可预计。


如果调用 rs.Open(csSql, CRecordSet::ForwardOnly) 使用的是 ForwardOnly 参数. 那么 MoveFirst() 不可以调用.
使用 Dynaset 参数时, 可以使用 MoveFirst() 函数. 但 dynaset 的开销比 ForwardOnly 大.

调用 rs.Open() 后. 游标位置就指向第一条记录. 所以, 可以不用调用 MoveFirst() 函数.
游客

返回顶部