MFC ODBC类使用心得

        近日在使用MFC ODBC类进行一个数据库应用的开发,因为从没有用过MFC ODBC Class。在这上面费了不少精神。并且在CSDN和别的社区也看到不少新手在询问相关的问题,也为了让自己的解决掉的麻烦不给忘掉。所以找了个地方记下来,以备查询。
1、CDatabase Class和CRecordset Class是可以直接使用而不必派生new class
2、在直接使用CRecordset class时最好声明一个CDatabase对像来手动打开数据库,不要直接使用CRecordset
3、用CDatabase打开数据库时别加载动态游标库,因为这会屏蔽掉相应数据库驱动的一些功能。加载了useCursorLib后会使你没办法使用动态数据集(dynaset),只能使用静态数据集(snapshot)。而静态数据集在数据记录很多的数据库时会降低很多效率,因为静态数据集为了保持一个数据的静态映像。会把SQL、查询返回的数据集用临时数据做个映像。记录的量一大,效率就会降低很多。
        
注意使用CDatabase的Open()和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,不能使用默认值。因为那样会加载游标库,而加载游标库后会屏蔽提数据库驱动一些功能。且,只能使用静态快照数据集和只能向前游标。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值