访问Access2000,CDaoDatabase.Open(..)成功打开。但是,CDaoRecordset.Open(&tb)却报错。错误内容是:
Unhandled exception in MyProject.exe(KERNEL32.DLL):0xE06D7363:Microsoft C++ Exception
我跟踪了代码,在DAOCORE.cpp中:
void CDaoRecordset::Open(CDaoTableDef* pTableDef, int nOpenType,
int nOptions)
函数中
// Share the same database object
m_pDatabase = m_pTableDef->m_pDatabase;
句报的错误。同样这段代码可以访问下面这段代码创建的Access数据库
CDaoDatabase db;
db.Create(lpszDbFileName,dbLangGeneral,dbVersion30);
CDaoTableDef tb(&db);
tb.Create(lpszTBName);
tb.CreateField(_T("ID"),dbLong,4,dbVariableField|dbUpdatableField);
tb.CreateField(_T("Name"),dbText,20);
tb.CreateField(_T("Sex"),dbText,2);
tb.CreateField(_T("Birthday"),dbDate,8);
tb.CreateField(_T("Salary"),dbCurrency,8);
tb.CreateField(_T("Note"),dbMemo,0);
tb.Append();
tb.Close();
db.Close();
最初,我以为是版本的问题,就网上查了一些内容,让我加上
#ifndef _AFXDLL 
#define _MFC_VER 0x0601 
#else 
AfxGetModuleState()->m_dwVersion = 0x0601; 
#endif  
加了以后,db.Open没有问题了。但rs.Open又有问题了。可是,又找不到相关问题的答案。                                                     
主要代码如下:
static TCHAR g_szDbFilename[] = _T("db1.mdb");
static TCHAR g_szTBname[] = _T("PhoneNum");
main()
{
#ifndef _AFXDLL 
#define _MFC_VER 0x0601 
#else 
AfxGetModuleState()->m_dwVersion = 0x0601; 
#endif  
AfxDaoInit();
CDaoDatabase db;
db.Open(lpszDbFileName);
CDaoTableDef tb(&db);
tb.Open(lpszTBName);
CDaoRecordset rs(&db);
rs.Open(&tb);//这句抱错 COleVariant var1,var2,var3,var4,var5,var6;
while(!rs.IsEOF())
{
rs.GetFieldValue(_T("ID"),var1);
rs.GetFieldValue(_T("Name"),var2);
rs.GetFieldValue(_T("Sex"),var3);
rs.GetFieldValue(_T("Birthday"),var4);
rs.GetFieldValue(_T("Salary"),var5);
rs.GetFieldValue(_T("Note"),var6); cout<<"ID:"<<var1.lVal<<endl;
cout<<"Name:"<<V_BSTRT(&var2)<<endl;
cout<<"Sex:"<<V_BSTRT(&var3)<<endl;
cout<<"Birthday:"<<COleDateTime(var4.date).GetYear()<<endl; CString str = COleCurrency(var5.cyVal).Format();
cout<<"Salary:"<<str.GetBuffer(str.GetLength())<<endl;
cout<<"Note:"<<V_BSTRT(&var6)<<endl;
cout<<"================================="<<endl;
rs.MoveNext();
}
rs.Close();
tb.Close();
db.Close();
}