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;
}

...全文
306 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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下?貌似不太可能吧
vc++利用ADOX创建数据库 // ADOXCreateDatabaseDlg.cpp : implementation file // #include "stdafx.h" #include "ADOXCreateDatabase.h" #include "ADOXCreateDatabaseDlg.h" #include "Shlwapi.h" #pragma comment(lib,"shlwapi.lib") // Download by http://www.codefans.net #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CADOXCreateDatabaseDlg dialog CADOXCreateDatabaseDlg::CADOXCreateDatabaseDlg(CWnd* pParent /*=NULL*/) : CDialog(CADOXCreateDatabaseDlg::IDD, pParent) { //{{AFX_DATA_INIT(CADOXCreateDatabaseDlg) m_dbName = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CADOXCreateDatabaseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CADOXCreateDatabaseDlg) DDX_Text(pDX, IDC_DBNAME, m_dbName); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CADOXCreateDatabaseDlg, CDialog) //{{AFX_MSG_MAP(CADOXCreateDatabaseDlg) ON_WM_SYSCOMM

7,732

社区成员

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

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