近日在使用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语句的方式来写入数据。