這次我們做了一個程序.
訪問數據庫:
使用數據庫訪問中間件,只要寫一個XML文件,通過Hibrate訪問到真正的數據庫,它將會返回一個XML文檔給我們做爲記錄集.
做報表使用的方式:
生成靜態的報表.寫出一個TTX文件.基於這個做一個靜態報表.把一些需要顯示的內容都把它謀劃好.還有一些公式也要做好.之後,數據來源是這樣的.讀出XML文檔中的記錄集,打開一個沒有連接到數據庫上的一個ADO的記錄集.然後一條一條的把記錄集加入.然後使用水晶報表對象將一個報表中的表結構與我的一個ADO記錄集梆定,這樣就能很方便的把內容顯示出來了.
例子代碼我在這裏帖一些吧.可能今後會要用到.
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->CursorLocation=adUseClient;
try{
//加入列
m_pRecordset->Fields->Append(_bstr_t("id"),adVarChar, 40, adFldIsNullable);
//打開這個記錄集,(com裏,有一些默認值可以使用vtMissing來填寫)
m_pRecordset->Open(vtMissing,vtMissing,adOpenStatic, adLockBatchOptimistic,adCmdUnknown);
//創建DOM,加載XML文檔
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(Dlg.GetPathName().GetBuffer(0));
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("rowdata");
if (pRootNode==NULL)
{
return ;
}
//讀出記錄集
MSXML::IXMLDOMNodeListPtr pListNode = pRootNode->selectNodes("row");
for(int i=0;i< pListNode->length;i++)
{
MSXML::IXMLDOMNodePtr pNode=pListNode->Getitem(i);
MSXML::IXMLDOMNodeListPtr pListNode2=pNode->selectNodes("*");
for(int j=0;j<pListNode2->length;j++)
{
MSXML::IXMLDOMNodePtr pNode2=pListNode2->Getitem(j);
_bstr_t info=pNode2->Gettext();
//插入行
m_pRecordset->AddNew();///添加新記錄
m_pRecordset->PutCollect("id",_variant_t(info));
m_pRecordset->Update();///保存到庫中
}
}
//梆定一個數據源
m_report->m_Report->Database->Tables->Item[1]->SetDataSource(_variant_t((IDispatch *)m_pRecordset));
m_report->m_CRViewer1.SetReportSource(m_report->m_Report);
//刷新
m_report->m_CRViewer1.ViewReport();
m_report->m_CRViewer1.Refresh();
m_pRecordset->Close();
}