如何用VC同时产生ACCESS97和ACCESS2000两种格式的数据库?

woshihuzi 2005-04-01 06:07:12

我们知道:使用DAO类,可以很轻松地产生ACCESS97格式的数据库;

如果在应用程序的InitInstance()中的行
AfxEnableControlContainer(); // 这一行是程序自动生成的,原本就有
下面加入如下一行:
AfxGetModuleState()->m_dwVersion = 0x0601; // 这一行是手工添加的
就能产生ACCESS2000格式的数据库。

我的问题是,如果想在同一个VC程序当中同时产生这两种格式的数据库,该如何办呢?
...全文
207 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshihuzi 2005-04-14
  • 打赏
  • 举报
回复
OK。搞定。结帖。感谢!
woshihuzi 2005-04-13
  • 打赏
  • 举报
回复
那我就自己用常量定义一下这个东东好了。
要看就要大功告成了,真是非常感谢。做完之后就结帖。
BIGbeard 2005-04-13
  • 打赏
  • 举报
回复
我也不太懂,有个网友发帖如下,自己研究吧。~~

CDataProcess::CDataProcess()
{
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=spcmdb.mdb","","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
}
AkiraChing 2005-04-13
  • 打赏
  • 举报
回复
_T是WCHAR和CHAR的开关
AkiraChing 2005-04-13
  • 打赏
  • 举报
回复
dbVersion40==64
woshihuzi 2005-04-13
  • 打赏
  • 举报
回复
老大,我包含了头文件afxdao.h,可是编译的时候还是出错,dbVersion40是个不可识别的符号啊?
=================================
E:\buildmdb示例(20050416修改版)\buildmdbDlg.cpp(184) : error C2065: 'dbVersion40' : undeclared identifier
woshihuzi 2005-04-13
  • 打赏
  • 举报
回复
谢谢,还是水银老兄关心我啊,我试一下.不过,
if(!PathFileExists(_T("c:\\test.mdb")))

if(!PathFileExists("c:\\test.mdb"))
有什么区别阿?
_T的作用是什么呢?
AkiraChing 2005-04-13
  • 打赏
  • 举报
回复
包含头文件afxdao.h, 下面的代码不要解释放哪里了吧

int dwOpitions=0;
if(IsDlgButtonChecked(IDC_RD97))
dwOpitions=dbVersion30;
if(IsDlgButtonChecked(IDC_RD2K))
dwOpitions=dbVersion40;

CDaoDatabase dbCreate;
if(!PathFileExists(_T("c:\\test.mdb")))
dbCreate.Create(_T("C:\\test.mdb"),dbLangGeneral,dwOpitions);
woshihuzi 2005-04-13
  • 打赏
  • 举报
回复
近几天又搜了一下网上,原来还有VC跟access玩还有dao和ado之分。据说ado比dao好,我上面使用的技术自然应该是dao了。真是又长了不少见识。
网上使用ado访问现成的access数据库的例子很多,我现在需要的是用ado生成access数据库,最好是能让用户选择生成97格式还是2000格式。哪位高手能说得明白一点,给一个带有详细步骤地刻操作的例子。分不够可以再加。
woshihuzi 2005-04-09
  • 打赏
  • 举报
回复
我想给本贴加30分,如何加分呢?
woshihuzi 2005-04-09
  • 打赏
  • 举报
回复
加30分,再顶,等待高手。给一个小例子即可。就像上面我给出的简单步骤那样,照着做能成功,我就马上结帖。
woshihuzi 2005-04-06
  • 打赏
  • 举报
回复
自己顶,期待高手ing...
wang_bluebird 2005-04-05
  • 打赏
  • 举报
回复
markmark
woshihuzi 2005-04-05
  • 打赏
  • 举报
回复
我更晕了,楼上没有能实现让用户在运行程序的时候选择的功能啊?楼上的能否给一个具体的实例。从创建一个基于对话框的Project开始,说一下生成数据库的步骤。就像我曾经总结过的一个创建ACCESS2000数据库的帖子那样,说的详细点,分不够我可以再加:
=============================================================
1、用VC++6.0建立一个基于对话框的工程,一切采取默认设置;
2、在文件stdafx.h当中加入以下三行代码:
#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>
#endif // _AFX_NO_DAO_SUPPORT
3、在OnOK()函数中键入以下代码:
// 建立数据库
CString database_file="mdb.mdb";
CDaoDatabase myDatabase;
myDatabase.Create(database_file);

// 建立表dict
CDaoTableDef *pTable;
pTable=new CDaoTableDef(&myDatabase);
pTable->Create("dict");

// 给表dict添加字段
pTable->CreateField("姓名",dbText,50);
pTable->CreateField("成绩",dbLong,4);
pTable->Append(); // 将表dict结构存入词库

// 对应表dict打开记录集pRec
CDaoRecordset *pRec;
pRec=new CDaoRecordset(&myDatabase);
pRec->Open(pTable);

// 往记录集里面添加记录
CString Name="张三";
COleVariant cole_name(Name,VT_BSTRT);

COleVariant cole_score;
long my_score=60;

pRec->AddNew();
cole_name.SetString(Name,VT_BSTRT);
pRec->SetFieldValue("姓名",cole_name);
cole_score=(long)my_score;
pRec->SetFieldValue("成绩",cole_score);

pRec->Update();

pRec->Close();
delete pRec;
pTable->Close();
delete pTable;
myDatabase.Close();

MessageBox("数据库建立完毕!");

4、在应用类的InitInstance()中的行
AfxEnableControlContainer(); // 这一行是程序自动生成的,原本就有
下面加入如下一行:
AfxGetModuleState()->m_dwVersion = 0x0601; // 这一行是手工添加的

分析:VC6默认的是用DAO350(JET 3.51),
因为Access2000己经使用 Jet 4.0 Engine,
所以应该使用DAO360(JET 4.0)
上面一句正是指定VC++6.0在编译的时候,使用DAO360

5、编译运行,就可以生成access2000格式的数据库了。
=============================================================
如果省略第4步,那么,生成的access数据库就是97格式的。
=============================================================
我的问题在于:第四步添加的代码不是我们能在OnOK()函数当中所能简单控制的,因此,不能给出一个参数,来使用if语句判断用户在运行程序的时候,选择生成什么格式的数据库。
我现在需要的是让用户在运行程序的时候选择access2000格式还是access97格式,然后程序自动生成所需要的格式的数据库。
AkiraChing 2005-04-04
  • 打赏
  • 举报
回复
晕,在你要用的地方加那段代码就可以了,import可以在要用的那个cpp的头文件加
woshihuzi 2005-04-04
  • 打赏
  • 举报
回复
我试了一下,不太行。可能是我技术不过关。
楼上的,能否说的详细一点。比如:

在什么文件的头文件的什么地方添加如下代码:
#import "c:\Program Files\Common Files\system\ado\msadox.dll" rename_namespace("ADOX")

在什么文件的什么函数当中添加如下代码:
using namespace ADOX;
_CatalogPtr m_pCatalog;
m_pCatalog.CreateInstance(__uuidof(Catalog));
CString strConnection = "Provider=Microsoft.JET.OLEDB.4.0;Data source = "
"c:\\Test.mdb;Jet OLEDB:Engine Type=5;";//access 97 为4
if(!PathFileExists(_T("c:\\Test.mdb")))
m_pCatalog->Create(_bstr_t(strConnection ));
using namespace ADO;//如果用ADO的话加

除此之外,还需要什么注意事项,等等。我是处于学习阶段,只会用基于对话框的VC程序。

如此要求,不知道烦人不烦人呢。总之,谢谢先!


AkiraChing 2005-04-01
  • 打赏
  • 举报
回复
using namespace ADOX;
_CatalogPtr m_pCatalog;
m_pCatalog.CreateInstance(__uuidof(Catalog));

CString strConnection = "Provider=Microsoft.JET.OLEDB.4.0;Data source = "
"c:\\Test.mdb;Jet OLEDB:Engine Type=5;";//access 97 为4
if(!PathFileExists(_T("c:\\Test.mdb")))
m_pCatalog->Create(_bstr_t(strConnection ));
using namespace ADO;//如果用ADO的话加


头文件加
#import "c:\Program Files\Common Files\system\ado\msadox.dll" rename_namespace("ADOX")
oyljerry 2005-04-01
  • 打赏
  • 举报
回复
改成能访问2000的,看能否访问97格式的
hushuangyan74 2005-04-01
  • 打赏
  • 举报
回复
没有用过,学习呀!

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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