在应用mfc odbc类进行数据库应用的开发的过程中遇到了好多问题,曾搞得我焦头烂额^_^,项目开发完成后,对开发过程中关于odbc报错问题解决方法做个小结。
报错一: “不支持动态记录集”
问题分析:使用cdatabase类的open()成员函数时,最后一个参数默认是加载动态游标库。因此,出现“不支持动态记录集”的错误,就是由此而来。
我遇到的例子a:使用open(默认dynaset)时,当访问时间之类的字段时会出现"不支持动态记录集",此时需改为snapshot)
ctime m_tmborrow;
if(this->isopen())
{
this->close();
}
this->open(crecordset::snapshot,_t("select * from tbborrow where readerid = '"+readerid+"'"));
m_tmborrow = this->m_borrowtime;
。。。。。。
报错二:“检索记录出错”
问题分析:在用vc的类向导新建一个基类为crecordset的数据集类时要注意类向导在绑定字段时使用的成员类量的数据类型是否与你的数据库字段类型一至。因为发现类向导并不是根据字段本身的数据类型来定义绑定变量的数据类型的。常常会把一个数据库常用的id或编号一类字段按long型处理,而实际上这样的字段往往是字符型的。在此时不会有错误发生,错误只会在你执行sql查询时跳出来。 执行sql查询时,如果出现“非法描述器索引”和“检索记录出错”这两个错误,那多半就是因为数据库字段与绑定变量的数据类型不相符导至的。前者一般静态数据集(snapshot)引起,而后者一般由动态数据集(dynaset)引起。
我遇到的例子b:修改accesse数据库字段名称(该字段数据类型为日期/时间或者文本类型,其中文本类型的掩码修改为日期/时间格式),在vc的crecordset派生类中重新绑定数据库表,导致运行程序时报告“检索记录出错”。解决办法则是很简单,把crecordset的派生类从工程中删除掉,然后再重建一个同样的crecordset的派生类问题就解决了(不要问我原因,我也搞不清)。
报错三:“非法描述器索引”
问题分析:同上
我遇到的例子c:每一个数据库里面难免要有几个表,需要对每个表进行添加记录操作(把数据库里的所有表都添加到crecordset的派生类中,并且每个表的字段都绑定相应的变量)。结果每次添加记录时都会有“非法描述器索引”出现,解决方法,每个表都用一个crecordset的派生类来操作,ok搞定了!
报错四:“参数不足,期待是1”
问题分析:这个问题通常是sql语句错误造成的,通常是sql语句中的字段数据类型不匹配,或者字段数据个数不匹配造成的,例如:执行insert into table(name,password) values("aa") 就会造成参数不足。
报错五:“记录集是只读”
问题分析:这个问题通常是因为没打开要操作的表,但也可能是操作表的字段设置不合理。