MFC 用ADO连接数据库出现的问题,请各位帮忙看看

ssdsfgrre 2011-08-09 10:05:48
使用ADO连接access数据库的代码如下:
	
AfxOleInit();
AfxEnableControlContainer();
::CoInitialize(NULL); //初始化COM组件
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
pRst.CreateInstance(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command)); //实例化一个Command对象pCmd
// m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FilterDateBase.mdb","","",adModeUnknown);
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FilterDateBase.mdb;Persist Security Info=False;Jet OLEDB:Database Password=TENNI","","",adModeUnknown);
}

catch(_com_error e)
{
AfxMessageBox("数据库连接失败,请检查数据库FilterDateBase.mdb!");
return;
}
UpdateData();

直接执行以上程序时,能正常连接数据库,


下面的程序是连接数据库之前必须执行的保存txt命令,但是在执行完如下程序以后,就无法再连接上数据库了:

void CResult::On_Save()
{
CFileDialog fileDlg(FALSE,"txt","testfile");
fileDlg.m_ofn.lpstrTitle="保存为";
fileDlg.m_ofn.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();//另存为时,防止覆盖
fileDlg.m_ofn.lpstrFilter="文本文档(*.txt)\0*.txt\0Excel表格(*.xls)\0*.xls\0所有文件(*.*)\0*.*\0\0";
fileDlg.m_ofn.lpstrDefExt="txt";
if(IDOK==fileDlg.DoModal())
{
UpdateData();//取文本框字符
CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
file.Write("欢迎您使用 \r\n",strlen("欢迎您使用 \r\n"));
file.Close();
UpdateData(FALSE);
MessageBox("保存文件成功", "保存成功", MB_ICONEXCLAMATION | MB_OK);
}
else {
MessageBox("保存文件失败", "保存失败", MB_ICONSTOP | MB_OK);
}
}

这个问题困扰了我很长时间了,我是个新手,希望各位高手帮忙看看,
...全文
162 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-08-10
  • 打赏
  • 举报
回复
楼主,这两段代码看上去没有任何关联,你在On_Save函数放几条语句,

m_pConnection->
pRst->

查看m_pConnection连接状态有什么变化。。。。
ssdsfgrre 2011-08-10
  • 打赏
  • 举报
回复
终于解决啦!哈哈
当前路径因为CFileDlg返回时会将程序的当前路径改成选择文件的路径,所以找不到数据库文件了,
TCHAR szCurDirBackup[_MAX_PATH];
GetCurrentDirectory(sizeof(szCurDirBackup),szCurDirBackup); //得到当前路径值
然后调用CFileDialog....

调用完后
SetCurrentDirectory(szCurDirBackup);//
这样就可以了
gold_water 2011-08-10
  • 打赏
  • 举报
回复
catch(_com_error e)
{
AfxMessageBox((LPCTSTR)e.ErrorMessage());
}

这样看错误,可以看到详细的错误信息。
ssdsfgrre 2011-08-10
  • 打赏
  • 举报
回复
终于发现问题所在,原来是保存txt文件时的路径,保存后,返回时程序就会认定数据库所在路径为保存txt文件的路径,如果保存txt的路径不和数据库在同一目录,程序就连不上数据库。
我把txt保存在数据库所在目录后,果然就能正常连接上数据库了,
但是这个问题该怎么完全解决?我还是不太会啊,
yuohoo 2011-08-10
  • 打赏
  • 举报
回复
你在OnSave函数开头就return
看下对结果怎样
一步一步找到问题的原因
ssdsfgrre 2011-08-10
  • 打赏
  • 举报
回复
回复zyq5945:
加异常捕获后:
[Microsoft][ODBC Microsoft Access驱动程序]找不到文件'(未知的)'。
zyq5945 2011-08-10
  • 打赏
  • 举报
回复
加异常捕获看是什么错误
try
{
//你的ADO代码
}
catch (_com_error& e)
{
AfxMessageBox(e.Description());
}
ssdsfgrre 2011-08-10
  • 打赏
  • 举报
回复
这两段代码根本没有什么关联,可是不知道为什么,只要执行On_Save函数后,就连不上数据库了,
在On_Save函数里面放上连接数据库的语句,
执行完保存命令后,在执行连接数据库时,出现同样错误,
另外,在修改为
catch(_com_error e)
{
AfxMessageBox((LPCTSTR)e.ErrorMessage());
}
后,提示依然是:未指定的错误
蒋晟 2011-08-09
  • 打赏
  • 举报
回复
看看http://connect.microsoft.com/VisualStudio/feedback/details/624503/oledb-operations-cause-accessviolationexception-during-savefiledialog
ssdsfgrre 2011-08-09
  • 打赏
  • 举报
回复
AfxMessageBox(e.ErrorMessage());
提示:未指定的错误
屏蔽了UpdateData() 和 UpdateData(false)后也一样
zgl7903 2011-08-09
  • 打赏
  • 举报
回复
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
看看提示什么错误

下面的代码似乎与数据库无关 或者是 DoDataExchange 中有问题,
可以把 UpdateData() 和 UpdateData(false) 屏蔽了看看

4,018

社区成员

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

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