基本思路是从ACCESS数据库中提取每个人的资料.经整理后生成WORD文档.主要用到三个函数(1)LianJie()用于连接数据库;(2)TuiChu()用于断开数据库;(3)Shengcheng()用于生成WORD文件;问题出现在:只能生成1次WORD文件,如果第2次打开数据库时,提示:未连接数据库\n未指定错误。问题到底在哪?
void CMYDlg::LianJie()
{
// 初始化 COM 对象
::CoInitialize(NULL);
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=ACCESS文件名.mdb","","",adModeUnknown);
}
}
catch(_com_error e)//捕捉异常
{
CString errormessage;
errormessage.Format("打开数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);//显示错误信息
this->EndDialog(0);

}
void CMYDlg::TuiChu()
{
if(m_pConnection->GetState()==adStateOpen)
{
m_pConnection->Close();///关闭连接
}
m_pConnection.Release();
::CoUninitialize();
}
void CMyDlg::ShengCheng() 
{
//先连接数据库
LianJie();
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM 数据表名 order by 序号 ASC",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
//建立通用的另存对话框。
char* szFilter="Microsoft Word 文档 (*.doc)|*.doc|所有格式 (*.*)|*.*||";
CFileDialog dlg(FALSE,"doc",TEXT("WORD文件.doc"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
//判断按下的是保存还是取消键
INT_PTR nRet=-1;
nRet=dlg.DoModal();
if(nRet==IDCANCEL)
return;
if(nRet==IDOK)
{
//使鼠标指针处于等待状态
this->BeginWaitCursor();
//设置变量 file_pathname 用来保存文件的 路径+文件名。
CString file_pathname;
file_pathname=dlg.GetPathName();
//开始操作word文档
//----------------------------
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
//开始一个新的Microsoft Word 2000实例
_Application oWordApp;
if(!oWordApp.CreateDispatch("Word.Application",NULL))
{
AfxMessageBox("创建 Word 服务失败!请确认您的系操中已安装了 Microsoft Office 组件。", MB_OK|MB_SETFOREGROUND);
return;
}
//创建一个新的word文档
Documents oDocs;
_Document oDoc;
oDocs=oWordApp.GetDocuments();
oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);  
//把文本添加到word文档
Selection oSel;
oSel=oWordApp.GetSelection();
//保存word文档
_Document oActiveDoc; 
oActiveDoc=oWordApp.GetActiveDocument();
oActiveDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse, COleVariant(""), vTrue, COleVariant(""),vFalse, vFalse, vFalse, vFalse, vFalse);
//退出word应用程序
oWordApp.Quit(vOpt, vOpt, vOpt);
while((!m_pRecordset->adoEOF))
{
//-----------这段省略,用while((!m_pRecordset->adoEOF))循环,从数据表中提取资料整理后放入CString Stream中
//把文本添加到word文档
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
_Application m_App;//定义Word提供的应用程序对象
oSel.ReleaseDispatch();
oDocs.ReleaseDispatch();//断开关联
m_App.m_bAutoRelease=true;
if(!m_App.CreateDispatch("Word.Application"))

AfxMessageBox("创建Word2000服务失败!请确认您的系操中已安装了 Microsoft Office 组件。"); 
exit(1); 
}
//下面是定义VARIANT变量
COleVariant varFilePath(file_pathname);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
oDocs.AttachDispatch(m_App.GetDocuments());//将Documents类对象oDocs和Idispatch接口关联起来
oDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
//打开Word文档; 
oSel.AttachDispatch(m_App.GetSelection());//将Selection类对象oSel和Idispatch接口关联起来
//定位到文件的最后   
oSel=m_App.GetSelection(); 
//将光标移动到最后一行
oSel.EndKey(COleVariant((short)6),COleVariant((short)0));
oSel.InsertAfter(stream); 
//保存word文件
oDoc=m_App.GetActiveDocument(); 
oDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse,COleVariant(""),vTrue,COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse); oSel.ReleaseDispatch();
oDocs.ReleaseDispatch();//断开关联
//退出WORD 
m_App.Quit(vOpt,vOpt,vOpt); 
m_App.ReleaseDispatch();
m_pRecordset->MoveNext();
}
return;
}
TuiChu();
}

解决方案 »

  1.   

    应该关闭了,我加了个TuiChu();就是为了关闭它.我想是不是在生成WORD的时候打开了什么东西.我以前生成.TXT文件的时候没有这个问题.
      

  2.   

    catch(_com_error e)//捕捉异常
    {AfxMessageBox(e.Description());//显示错误信息 
      

  3.   

    shengcheng()中的“TuiChu();”位置不对,如果生成Word成功执行是不会执行这句话的。因为已经return了。
      

  4.   

    lanlandetian 说的问题确实对,我已经把它放return前面了,可是每当第1次(指的是第1次启动程序)生成WORD没有问题,第2次还没等出现窗口,就提示数据未知错误.以前生成TXT则没问题,是不是生成WORD时,哪个地方有不对的.
      

  5.   

    shakaqrj 我按照你的方法,显示出错误信息,原因是这样的:我每次都生成到桌面上,提示我找不到"数据表名"(这是我要打开的ACCESS数据库),当我拷贝到桌面上一个"数据表名.mdb",就不出这个问题了.但这是什么原因导致的,是不是我在生成WORD的时候把这个程序的路径改了,那是怎么回事呀?
      

  6.   

    找到问题的原因了,需要重新指定 数据表名.mdb 的路径.