关于VC6.0通过ODBC访问数据库超长字段的BUG,及解决方法
ckp 2003-12-12 12:27:58 这个BUG是我前几天编写一个对Access数据库进行简单修改时发现的。
前天,我因为要对一个excel文档进行处理,但VC6.0不能通过ODBC对excel 2000(可能是我对VC还不是很了解,也许能对excel 2000能进行处理也说不定)数据源进行处理,我就用Access将excel数据导入,由于这个文档是有关OLAP的元数据处理的,其中有数据描述的字段,其内容很长,我在用VC的ODBC接口函数读取时,发生了数据被截断的错误信息。起先,我以为是缓冲区溢出(我也会犯低级错误^_^),可是,后来在读afxdb.h后,才发现Microsoft在写afxdb.h的时候,主观的认为数据库中的char和varchar字段的默认最大长度为255,其源代码如下:
void AFXAPI RFX_Text(CFieldExchange* pFX, LPCTSTR szName, CString& value,
// Default max length for char and varchar, default datasource type
int nMaxLength = 255(这里), int nColumnType = SQL_VARCHAR, short nScale = 0);
但他们在MSDN中又没有提到这个问题,所以,我认为这是一个软件开发上的BUG。而且,这个BUG会给许多初学VC的开发人员造成错觉,以为是ODBC的问题,或者是
自己的程序写法上问题,其解决办法如下:
在你的数据库类中(如我的数据库类是SheetSet.h)
在数据库类的定义部分,将超长的字段从
RFX_Text(pFX, _T("[Your Table Column Name]"), m_your_Table_Column_Name);
//}}AFX_FIELD_MAP
改为
RFX_Text(pFX, _T("[Your Table Column Name]"), m_your_Table_Column_Name, 1024/*(你的这个超长字段的最大长度)*/);
//}}AFX_FIELD_MAP
也就是说,修改字段的最大长度。
希望以上的一点小经验能对你有所帮助。