这个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
也就是说,修改字段的最大长度。
希望以上的一点小经验能对你有所帮助。
前天,我因为要对一个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
也就是说,修改字段的最大长度。
希望以上的一点小经验能对你有所帮助。
我刚刚才想到,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写得很粗,大概是赶工期的缘故,我也是
干工程的,不过,我干的是小工程拉,很小很小的。^__^