关于ODBC出现“检索记录出错”与“非法描述器索引”的问题总结

首先,这里先借用一下 sunkanghome的总结:

       近日在使用MFC ODBC类进行一个数据库应用的开发,因为从没有用过MFC ODBC Class。在这上面费了不少精神。并且在CSDN和别的社区也看到不少新手在询问相关的问题,也为了让自己的解决掉的麻烦不给忘掉。所以找了个地方记下来,以备查询。
       1、CDatabase Class和CRecordset Class是可以直接使用而不必派生new class
       2、在直接使用CRecordset class时最好声明一个CDatabase对像来手动打开数据库,不要直接使用CRecordset
       3、用CDatabase打开数据库时别加载动态游标库,因为这会屏蔽掉相应数据库驱动的一些功能。加载了useCursorLib后会使你没办法使用动态数据集(dynaset),只能使用静态数据集(snapshot)而静态数据集在数据记录很多的数据库时会降低很多效率,因为静态数据集为了保持一个数据的静态映像。会把SQL、查询返回的数据集用临时数据做个映像。记录的量一大,效率就会降低很多。
        注意使用CDatabaseOpen()OpenEx()成员函数,前者的最后一个参数默认是加载动态游标库。
因此,出现不支持动态记录集的错误,就是由此而来。
       4、在用VC的类向导新建一个基类为CRecordset的数据集类时要注意类向导在绑定字段时使用的成员类量的数据类型是否与你的数据库字段类型一至。因为我发现类向导并不是根据字段本身的数据类型来定义绑定变量的数据类型的。常常会把一个我们数据库常用的id或编号一类字段按long型处理,而实际上这样的字段往往是字符型的。在此时不会有错误发生,错误只会在你执行SQL查询时跳出来。
        执行SQL查询时,如果出现非法描述器索引检索记录出错这两个错误,那多半就是因为数据库字段与绑定变量的数据类型不相符导至的。前者一般静态数据集(snapshot)引起,而后者一般由动态数据集(dynaset)引起。
       5
、没有必要用类向导生成数据库访问类(CDatabase)和数据集类(CRecordse),这样除了带来数据绑定的方便以外。还会带来一个数据库只能对应一个数据集类的缺点,因为有数据绑定存在你不可能把这个类用在不同结构的数据库上。所以,直接使用CRecordset数据集类似乎是最好的选择。你可以使用GetODBCFieldInfo()GetFieldValue()这两个CRecordset的成员函数来访问数据库的记录而不是用MFC提供的数据绑定。
          GetODBCFieldInfo     //取得指定的字段的信息,如字段类型、宽度等
          GetFieldValue             //
取得当前记录指定字段内容
         
有了这两个函数我们就可以很方便的取得记录内容并且这个数据集类可以适应任何一个数据库。当然,这样做的话我们只能访问数据,如果想写入数据就不行了。不过我们可以用SQL语句的方式来写入数据。

          CRecordset::Open()
的第一个参数,如果使用默认值AFX_DB_USE_DEFAULT_TYPE那即是采用CRecordset::snapshot方式打开数据集,CRecordset::snapshot是可以双向滚动的静态记录集。当记录集被打开时,记录集的全体成员和记录的顺序都被确定了;当记录被获取时,其数据值是确定的。其它用户在记录集被关闭,然后在打开之前是不可见的。这个记录集是不能编辑、添加的。另外,直接使用CRecordset::Open()不能参数打开数据集能够实现编辑可能是因为你是用类向导派生的CRecordset子类,其被指定了用动态数据集。
使用CDatabase对像打开数据库最好用OpenEx()直接明了,参数不多。注意最后一个参数要为FALSE,不能使用默认值。因为那样会加载游标库,而加载游标库后会屏蔽提数据库驱动一些功能。且,只能使用静态快照数据集和只能向前游标。

       下面,是偶遇到的麻烦以及解决办法:

         1)修改ACCESSE数据库字段名称(该字段数据类型为日期/时间或者文本类型,其中文本类型的掩码修改为日期/时间格式),在VC的CRecordSet派生类中重新绑定数据库表,导致运行程序时报告“检索记录出错”。解决办法则是很简单(偶查资料测试了两天^_^才搞定),把CRecordSet的派生类从工程中删除掉,然后再重建一个同样的CRecordSet的派生类问题就解决了(不要问我原因,我也着实郁闷得很,有知道原因麻烦也给我说一下.......)!!!

        2)“非法描述器索引”的问题更是让偶郁闷,每一个数据库里面难免要有几个表,需要对每个表进行添加记录操作(把数据库里的所有表都添加到CRecordSet的派生类中,并且每个表的字段都绑定相应的变量)。结果每次添加记录时都会有“非法描述器索引”出现,记录没能添加到表中去。没办法,只能用最笨发办法了,每个表都用一个CRecordSet的派生类来操作,OK搞定了!(网上查了半天没找到其他办法,忙着交差,只好将就着用,那位朋友有好的办法麻烦给说一下,在此谢过了!)

 

 

注:我最后试了下,发现还是得用笨方法,就是新建一个表的时候给这个表添加一个新的RecordSet派生类进行操作,目前还是没有找到更好的办法,ODBC连接access好像是比较麻烦的办法,看来以后要尝试新的数据库编程了。有共同体会的大家可以一起来探讨一下!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值