这个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
也就是说,修改字段的最大长度。
希望以上的一点小经验能对你有所帮助。

解决方案 »

  1.   

    VC怎样通过ODBC读取Excel 2000文档(和这个帖子有关):
    我刚刚才想到,VC怎样读取excel文档,其方法如下:
    某个电子表格的部分内容:
    A       B       C
    1 Stage DirCode CubeName
    2 1 00001 XX总量分析
    3 1 00002 XXXX客户分析
    4 1 00003 YY客户分析
    5 1 00004 ZZ客户分析 
    6 1 00005 AAAAA分析
    7 2 00006 BBBBB分析
    8 2 00007 CCCCC分析
    9 1 00008 DDDDD分析
    10 1 10001 EEEEE分析
    你要在excel的“插入”菜单项下选择“名称”,增加你想读入的数据:
    名称(Name)            单元格(Range)
    -----------------------------------
    Stage                 sheet1!A2:a10
    DirCode               sheet1!B2:B10
    CubeName              sheet1!C2:C10
    这样一来,VC就可以读到Excel文档了。
    顺便说一句,这个问题在MSDN中也没有提到,我感
    觉到MSDN写得很粗,大概是赶工期的缘故,我也是
    干工程的,不过,我干的是小工程拉,很小很小的。^__^