📄 dbtree.cpp
字号:
// DBTree.cpp : implementation file
//
#include "stdafx.h"
#include "VDB.h"
#include "DBTree.h"
#include "VDBDoc.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDBTree
IMPLEMENT_DYNCREATE(CDBTree, CTreeView)
CDBTree::CDBTree()
{
}
CDBTree::~CDBTree()
{
}
BEGIN_MESSAGE_MAP(CDBTree, CTreeView)
//{{AFX_MSG_MAP(CDBTree)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
//}}AFX_MSG_MAP
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDBTree drawing
void CDBTree::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CDBTree diagnostics
#ifdef _DEBUG
void CDBTree::AssertValid() const
{
CTreeView::AssertValid();
}
void CDBTree::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDBTree message handlers
void CDBTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CVDBDoc* pDoc = (CVDBDoc *)GetDocument();
CTreeCtrl& TreeCtrl = GetTreeCtrl();
CString str;
HTREEITEM hItem;
int iLevel = 0; // 选中的结点的级别
hItem = TreeCtrl.GetSelectedItem();
while (TreeCtrl.GetParentItem(hItem) != NULL)
{
hItem = TreeCtrl.GetParentItem(hItem);
iLevel ++;
}
hItem = TreeCtrl.GetSelectedItem();
str = TreeCtrl.GetItemText(hItem);
if (iLevel == 0)
return;
if (iLevel == 1)
{
// 如果有子结点,那么说明已经读取过列表,返回
if (TreeCtrl.ItemHasChildren(hItem))
return;
_variant_t varValue;
pDoc->m_pConnection->Execute(_bstr_t("use " + str), NULL, adCmdText);
pDoc->m_pRecordset = pDoc->m_pConnection->Execute("select name from sysobjects where type = 'U' and name <> 'dtproperties' order by name", NULL, adCmdText);
while (!pDoc->m_pRecordset->adoEOF)
{
varValue = pDoc->m_pRecordset->GetCollect("name");
TreeCtrl.InsertItem(_bstr_t(varValue), 2, 2, hItem);
pDoc->m_pRecordset->MoveNext();
}
}
if (iLevel == 2)
{
CMainFrame* pMain = (CMainFrame *) AfxGetMainWnd();
CListCtrl& ListCtrl = ((CListView *)pMain->m_wndSplitter.GetPane(0, 1))->GetListCtrl();
BOOL bKeys;
CString strOther;
_RecordsetPtr pRS_Column;
pRS_Column.CreateInstance("ADODB.Recordset");
_RecordsetPtr pRS_Comment;
pRS_Comment.CreateInstance("ADODB.Recordset");
ListCtrl.DeleteAllItems();
int i = 0, nColumn, nItem;
_variant_t varValue, lRecordAffect;
CString strTable = TreeCtrl.GetItemText(TreeCtrl.GetParentItem(hItem));
pDoc->m_pConnection->Execute(_bstr_t("use " + strTable), NULL, adCmdText);
pDoc->m_pRecordset = pDoc->m_pConnection->Execute(_bstr_t("Select a.status as Status, a.cdefault as cdefault, a.id as id, a.colorder as colorder, c.name as TableName, a.name as ColumnName, b.name as TypeName, a.length as Length, a.scale as Scale, a.isnullable as IsNullAble from syscolumns a, systypes b, sysObjects c where a.xtype = b.xusertype and a.id = c.id and c.xtype='U' and c.name = '" + str + "' order by a.colorder"), &lRecordAffect, adCmdText);
pRS_Column = pDoc->m_pConnection->Execute(_bstr_t("sp_pkeys '") + _bstr_t(str) + _bstr_t("'"), NULL, adCmdText);
while (!pDoc->m_pRecordset->adoEOF)
{
nColumn = 1;
strOther = "";
bKeys = false;
pRS_Column->Filter = "COLUMN_NAME = '" + _bstr_t(pDoc->m_pRecordset->GetCollect("ColumnName")) + "'";
if (pRS_Column->adoEOF)
strOther = "";
else
strOther = "v";
pRS_Column->Filter = "";
nItem = ListCtrl.InsertItem(i, strOther);
varValue = pDoc->m_pRecordset->GetCollect("ColumnName");
ListCtrl.SetItemText(nItem, nColumn++, (char*)_bstr_t(varValue));
varValue = pDoc->m_pRecordset->GetCollect("TypeName");
ListCtrl.SetItemText(nItem, nColumn++, (char*)_bstr_t(varValue));
varValue = pDoc->m_pRecordset->GetCollect("Length");
ListCtrl.SetItemText(nItem, nColumn++, (char*)_bstr_t(varValue));
varValue = pDoc->m_pRecordset->GetCollect("IsNullAble");
if (_bstr_t(varValue) == _bstr_t("0"))
{
ListCtrl.SetItemText(nItem, nColumn++, "否");
}
else
{
nColumn ++;
}
pRS_Comment = pDoc->m_pConnection->Execute(_bstr_t("select text from syscomments where id = " + _bstr_t(pDoc->m_pRecordset->GetCollect("cdefault"))), NULL, adCmdText);
if (!pRS_Comment->adoEOF)
{
ListCtrl.SetItemText(nItem, nColumn++, (char *)(_bstr_t(pRS_Comment->GetCollect("text"))));
}
else
{
nColumn ++;
}
if (_bstr_t(pDoc->m_pRecordset->GetCollect("Status")) == _bstr_t("128"))
{
ListCtrl.SetItemText(nItem, nColumn, "是");
}
nColumn ++;
strOther = "";
pRS_Comment = pDoc->m_pConnection->Execute(_bstr_t("select c.name as tablename, a.name as columnname from syscolumns a, (select rkeyid, rkey from sysforeignkeys where fkeyid = " + _bstr_t(pDoc->m_pRecordset->GetCollect("id")) + " and fkey = " + _bstr_t(pDoc->m_pRecordset->GetCollect("colorder")) + ") b, sysobjects c where a.id = b.rkeyid and a.colorder = b.rkey and a.id = c.id"), NULL, adCmdText);
if (!pRS_Comment->adoEOF)
{
strOther = "外码: ";
strOther += _bstr_t(pRS_Comment->GetCollect("tablename")) + " - " + _bstr_t(pRS_Comment->GetCollect("columnname"));
}
ListCtrl.SetItemText(nItem, nColumn++, strOther);
nColumn ++;
i++;
pDoc->m_pRecordset->MoveNext();
}
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
*pResult = 0;
}
BOOL CDBTree::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT;
return CTreeView::PreCreateWindow(cs);
}
void CDBTree::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if (!(list.Create(IDB_DB, 16, 1, RGB(0, 255, 0))))
AfxMessageBox("图像列表创建出错!");
CTreeCtrl& TreeCtrl = GetTreeCtrl();
TreeCtrl.SetImageList(&list, TVSIL_NORMAL);
}
void CDBTree::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
CVDBDoc* pDoc = (CVDBDoc *)GetDocument();
CTreeCtrl& TreeCtrl = GetTreeCtrl();
CString str;
HTREEITEM hItem;
int iLevel = 0; // 选中的结点的级别
hItem = TreeCtrl.GetSelectedItem();
while (TreeCtrl.GetParentItem(hItem) != NULL)
{
hItem = TreeCtrl.GetParentItem(hItem);
iLevel ++;
}
hItem = TreeCtrl.GetSelectedItem();
str = TreeCtrl.GetItemText(hItem);
if (iLevel == 0)
return;
if (iLevel == 1)
return;
if (iLevel == 2)
{
CMainFrame* pMain = (CMainFrame *) AfxGetMainWnd();
CString strTable = TreeCtrl.GetItemText(TreeCtrl.GetParentItem(hItem));
pDoc->m_pConnection->Execute(_bstr_t("use " + strTable), NULL, adCmdText);
/* 设置页面大小 */
CSize sizeTotal(2100, 2970);
CSize sizePage(sizeTotal.cx, sizeTotal.cy);
CSize sizeLine(sizeTotal.cx, sizeTotal.cy);
pDC->SetMapMode(MM_LOMETRIC);
/* 设置变量 */
const Height = 2970; // 纸高度
const Width = 2100; // 纸宽度
long x, // 横坐标
y, // 纵坐标
top = 150, // 上边距
bottom = 250, // 下边距
left = 100, // 左边距
right = 200, // 右边距
line = 54; // 行间距
long lColumn0 = 30, // 第 0 列
lColumn1 = 350, // 第一列
lColumn2 = 220, // 第二列
lColumn3 = 100, // 第三列
lColumn4 = 50, // 第四列
lColumn5 = 330,
lColumn6 = 100,
lColumn7 = 950,
lCellSpace = 10; // 表格间距
CFont hNewFont;
CString strPrint;
BOOL bKeys;
CRect rc;
CVDBDoc* pDoc = (CVDBDoc *) GetDocument();
/* 开始打印 */
CString strFileName;
CString strServer;
CString strCatalog;
CString strTableName;
strServer = TreeCtrl.GetItemText(TreeCtrl.GetParentItem(TreeCtrl.GetParentItem(hItem)));;
strTableName = str;
strCatalog = strTable;
/* 获取选择范围 */
int nSelCount = 1;
int nStep;
/* 打印页标 */
x = left;
y = -top;
strPrint.Format("第 %d 页 共 %d 页", pInfo->m_nCurPage, pInfo->GetMaxPage());
hNewFont.CreateFont(-23,
0,
0,
0,
FW_NORMAL,
0,
0,
0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
"宋体");
pDC->SelectObject(&hNewFont);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextAlign(TA_RIGHT);
pDC->TextOut((Width - right), y, strPrint);
hNewFont.DeleteObject();
/* 如果是第一页,打印数据库标题 */
if (pInfo->m_nCurPage == 1)
{
strPrint = strServer + " - " + strCatalog;
hNewFont.CreateFont(-46,
0,
0,
0,
FW_NORMAL,
0,
0,
0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
"楷体_gb2312");
pDC->SelectObject(&hNewFont);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextAlign(TA_CENTER);
pDC->TextOut((Width - right + left)/ 2, y, strPrint);
hNewFont.DeleteObject();
y -= line;
}
_variant_t varValue;
_RecordsetPtr pRS_Column, pRS_Column_Detail;
pRS_Column.CreateInstance("ADODB.Recordset");
pRS_Column_Detail.CreateInstance("ADODB.Recordset");
for (nStep = aryPrintInfo[pInfo->m_nCurPage - 1].nTableIndex; nStep < nSelCount; nStep ++)
{
x = left;
y -= line;
if (y < bottom - Height + line + line + line)
return;
/* 打印表名 */
hNewFont.CreateFont(-34,
0,
0,
0,
FW_NORMAL,
0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -