MFC利用ADOX创建access数据库失败

mrnian2008 2013-12-06 12:05:00
在网上找的一段代码,在WIN7 + VS2010 + Office2007环境下一切OK,挪到XP系统就不行了,XP装的也是VS2010 + Office2007环境,怎么都不行,各位高手帮忙看一下,多谢。
#import "c:/Program Files/Common Files/System/ADO/Msadox.dll" rename_namespace("ADOCG") rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
using namespace ADODB;
using namespace ADOCG;
#define TESTHR(x) if FAILED(x) _com_issue_error(x);
void CAccessTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strDb = "d:\\test.mdb";
if(CreateMdb(strDb))
{
CreateTable("PRODUCT");
}
}

//创建ACCESS数据库
BOOL CAccessTestDlg::CreateMdb(CString strDBName)
{
CString strMdbConn = "Provider='Microsoft.JET.OLEDB.4.0';Data source = " + strDBName;
try
{
HRESULT hr = S_OK;
_CatalogPtr pCatalog = NULL;
_bstr_t cnnstring(strMdbConn);

TESTHR(hr = pCatalog.CreateInstance(__uuidof (Catalog)));
pCatalog->Create(cnnstring);
}
catch(_com_error e)
{
_bstr_t bstrDescription(e.Description());
CString strErro=CString(_T("创建ACCEESS数据库出错: "))
+ (LPCSTR)e.Description()
+ CString(_T("Create ACCESS DB error: "))
+ (LPCSTR)e.Description();
AfxMessageBox(strErro);
return FALSE;
}
return TRUE;
}
//创建数据库表-材料表
BOOL CAccessTestDlg::CreateTable( CString strTabName)
{
HRESULT hr = S_OK;
_CatalogPtr pCatalog = NULL;
_TablePtr pTableNew = NULL;
_IndexPtr pIndexNew = NULL;
_IndexPtr pIndex = NULL;
_ColumnPtr pColumn = NULL;
CString strConn,strDBName;
strDBName="d:\\test.mdb";
//strDBName=this->GetDBName(m_nDBYear);
CFileFind ff;
if(!ff.FindFile(strDBName))
{
AfxMessageBox("数据库不存在,请先在高级设置对话框中创建数据库!");
return FALSE;
}
strConn="Provider='Microsoft.JET.OLEDB.4.0';Data source = " + strDBName;
_bstr_t strcnn(strConn);
try
{
TESTHR(hr = pCatalog.CreateInstance (__uuidof(Catalog)));
TESTHR(hr = pTableNew.CreateInstance(__uuidof(Table)));
TESTHR(hr = pIndexNew.CreateInstance(__uuidof(Index)));
TESTHR(hr = pIndex.CreateInstance (__uuidof(Index)));
TESTHR(hr = pColumn.CreateInstance (__uuidof(Column)));

// 连接
pCatalog->PutActiveConnection(strcnn);
// 表名
pTableNew->Name = _bstr_t(strTabName);
pTableNew->ParentCatalog = pCatalog;
//
//m_pTableNew->Columns->Append("ContactId", ::adInteger,0);
//m_pTableNew->Columns->GetItem("ContactId")->Properties->GetItem("AutoIncrement")->Value = true;

// 加入字段
CString str;
str = _T("公司名称");//"公司名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false; //将必填字段设置为否
str = _T("产品名称");//"产品名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
str = _T("产品规格");//"产品名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
//*
// 加入主键
pIndexNew->Name = "pryIndex";//"日期";
pIndexNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);

pIndexNew->PutPrimaryKey(-1);
pIndexNew->PutUnique(-1);
pTableNew->Indexes->Append(_variant_t ((IDispatch*)pIndexNew));
//*/

// 加入表中
pCatalog->Tables->Append(_variant_t ((IDispatch*)pTableNew));
pCatalog->Tables->Refresh();

}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
AfxMessageBox(e.Description());
return FALSE;

}
return TRUE;
}

...全文
292 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrnian2008 2013-12-06
  • 打赏
  • 举报
回复
烦请高手赐教!
mrnian2008 2013-12-06
  • 打赏
  • 举报
回复
报错:"创建ACCEESS数据库出错:Create ACCESS DB error: ",也就是说没有捕获到具体的异常信息,所以我被折磨得无从下手。 另外,尝试了一下几种办法,均告失败 1.把win7下的msadox.dll和msado15.dll拷贝到XP对应目录下进行替换; 2.在XP下重新安装与win7下同样版本的office2007; 3.更换另一台XP机器,安装同样的环境; 4.检查修改要创建的数据库名称、路径等信息。 难道这个ADOX创建access只能在WIN7下?貌似不太可能吧

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧