⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylistview.cpp

📁 Visual C++ 实践与提高--数据库篇的源代码。很好的东西。欢迎下载。
💻 CPP
字号:
// MyListView.cpp : implementation file
//

#include "stdafx.h"
#include "OLEViewer.h"
#include "MyListView.h"
#include "OLEViewerDoc.h"
#include "dbexcept.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyListView

IMPLEMENT_DYNCREATE(CMyListView, CListView)

CMyListView::CMyListView()
{
}

CMyListView::~CMyListView()
{
}


BEGIN_MESSAGE_MAP(CMyListView, CListView)
	//{{AFX_MSG_MAP(CMyListView)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyListView drawing

void CMyListView::OnDraw(CDC* pDC)
{
	COLEViewerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CMyListView diagnostics

#ifdef _DEBUG
void CMyListView::AssertValid() const
{
	CListView::AssertValid();
}

void CMyListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
COLEViewerDoc* CMyListView::GetDocument()// non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COLEViewerDoc)));
	return (COLEViewerDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyListView message handlers

int CMyListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	//风格设置
	lpCreateStruct->style |= LVS_REPORT | LVS_SINGLESEL| LVS_NOSORTHEADER;
	if (CListView::OnCreate(lpCreateStruct) == -1)
		return -1;
	//初始化文档中的对象
	GetDocument()->m_pListView = this;
	
	return 0;
}

void CMyListView::DisplayColumnHeadings(UINT nStringID)
{
	CString strHeadings;
	//实际上,strHeadings的内容就是String Table中对应于nStringID的Caption
	strHeadings.LoadString(nStringID);

	CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();

	int nPos;
	int nCount = 0;

	EraseList();//刷新视

	if (m_bVertical)
	{
		ctlList.AddColumn(_T("Property     "),0);
		ctlList.AddColumn(_T("Value     "),1);
		m_nColumns = 2;
	}
	//以","为分界符,取出各段内容并加入头部
	while ((nPos = strHeadings.Find(_T(","))) != -1)
	{
		CString strItem;
		strItem = strHeadings.Left(nPos);
		if (m_bVertical)
			ctlList.AddItem(nCount++,0,strItem);
		else
			ctlList.AddColumn(strItem,nCount++);
		strItem = strHeadings.Mid(nPos + 1);
		strHeadings = strItem;
	}
	if (m_bVertical)
		ctlList.AddItem(nCount,0,strHeadings);
	else
		ctlList.AddColumn(strHeadings,nCount);
	m_nColumns = nCount;
}

void CMyListView::AddItem(int nItem, int nSubItem, LPCTSTR lpszItem)
{
	CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();

	if (m_bVertical)
		ctlList.AddItem(nSubItem, 1, lpszItem);
	else
		ctlList.AddItem(nItem, nSubItem, lpszItem);
}

void CMyListView::EraseList()
{
	CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
	ctlList.DeleteAllItems();
	while(ctlList.DeleteColumn(0));
	UpdateWindow();
}

void CMyListView::ShowTableSchema(LPCTSTR lpszTableName)
{
	USES_CONVERSION;
	CTables*    pTableSet = NULL;
	
	ASSERT(m_pSession);
	m_bVertical = lpszTableName != NULL;
	//显示头部信息
	DisplayColumnHeadings(IDS_COL_TABLE);

	int nItem = 0;
	pTableSet = new CTables;
	
	char lpszType[128];
	strcpy(lpszType, "TABLE");
    //打开连接,取出信息
	if (pTableSet->Open(*m_pSession, NULL, NULL, lpszTableName, lpszType) != S_OK)
		return;
    //遍历,显示信息
	while(pTableSet->MoveNext() == S_OK)
	{		
		if (_tcschr(pTableSet->m_szName, _T(' ')) != NULL)
			continue;

		AddItem(nItem, 0, pTableSet->m_szName);
		AddItem(nItem, 1, pTableSet->m_szType);
		AddItem(nItem, 2, pTableSet->m_szSchema);
		AddItem(nItem, 3, pTableSet->m_szCatalog);
		AddItem(nItem, 4, pTableSet->m_szDescription);
		nItem++;
	}

	delete pTableSet;
	pTableSet = NULL;
	//调整列宽
	AdjustColumnWidths();
}

void CMyListView::AdjustColumnWidths()
{
	CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
	ctlList.SetColumnWidth(-1,-3);
}

void CMyListView::ShowTableData(LPCTSTR lpszTableName)
{
	USES_CONVERSION;
    //声明行集对象
	CCommand<CManualAccessor> rs;
	CColumns* pColumns      = NULL;
	CPrimaryKeys* pKeys     = NULL;
	int nItem               = 0;
	CListCtrlEx& ctlList    = (CListCtrlEx&) GetListCtrl();
	struct MYBIND* pBind    = NULL;

	ASSERT(m_pSession);
	ASSERT(lpszTableName != NULL);
	
	//事务处理
	TRY
	{
		//打开连接,从表中获得列信息
		pColumns = new CColumns;
		if (pColumns->Open(*m_pSession, NULL, NULL, lpszTableName) != S_OK)
			AfxThrowOLEDBException(pColumns->m_spRowset, IID_IDBSchemaRowset);

		//处理头部信息
		EraseList();
		ULONG ulColumns = 0;
		while (pColumns->MoveNext() == S_OK)
		{
			ulColumns++;
			ctlList.AddColumn(pColumns->m_szColumnName, ulColumns);
		}

		delete pColumns;
		pColumns = NULL;
		m_ulFields = ulColumns;
		pBind = new MYBIND[m_ulFields];

		//创建存取器
		rs.CreateAccessor(m_ulFields, pBind, sizeof(MYBIND)*m_ulFields);
		for (ULONG l=0; l<m_ulFields; l++)
			rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue,
					NULL, &pBind[l].dwStatus);

		
		if (strchr(lpszTableName, ' '))
			m_strTable.Format("'%s'", lpszTableName);
		else
			m_strTable = lpszTableName;

		//创建行集以备存储数据
		m_strQuery.Format("select * from %s", m_strTable);

		//判断是否要根据主码进行排序
		pKeys = new CPrimaryKeys;
		bool bFirst = TRUE;
		if (pKeys->Open(*m_pSession, NULL, NULL, lpszTableName) == S_OK)
		{
			while(pKeys->MoveNext() == S_OK)
			{
				if (bFirst != FALSE)
				{
					m_strQuery += _T(" ORDER BY ");
					bFirst = FALSE;
				}
				else
					m_strQuery += _T(", ");

				m_strQuery += pKeys->m_szColumnName;
			}
		}
		delete pKeys;
		pKeys = NULL;
        
		//打开行集并获得数据
		if (rs.Open(*m_pSession, m_strQuery) != S_OK)
			AfxThrowOLEDBException(rs.m_spCommand, IID_ICommand);

		//调用DisplayData函数显示数据
		int nLoaded = DisplayData((CRowset*)&rs, pBind);

		delete pBind;
		pBind = NULL;
		CString strRecCount;
		strRecCount.Format(_T("Loaded %d of %d total records"), nLoaded, nItem);
		UpdateWindow();
		((CFrameWnd *) AfxGetMainWnd())->SetMessageText(strRecCount);
	}
	CATCH(COLEDBException, e)
	{
		if (pColumns != NULL)
			delete pColumns;

		if (pKeys != NULL)
			delete pKeys;

		if (pBind != NULL)
			delete pBind;
        
		//出错和异常信息显示
		//ATLTRACE(" OLE DB异常信息!");
	}
	END_CATCH
}

int CMyListView::DisplayData(CRowset *pRS, MYBIND *pBind)
{
	CListCtrlEx&        ctlList = (CListCtrlEx&) GetListCtrl();

	//显示数据信息
	int nLoaded = 0;
	//为了兼顾速度和性能,限定显示最大记录数
	//当然,也可取消此限制
	int nMaxRecords = 100;

	int nItem=0;
	//遍历
	while (pRS->MoveNext() == S_OK)
	{
		if (nItem < nMaxRecords)
		{
			nLoaded++;
			for (ULONG j=1; j<=m_ulFields; j++)
			{
				if (pBind[j-1].dwStatus == DBSTATUS_S_ISNULL)
					_tcscpy(pBind[j-1].szValue, _T(""));
				ctlList.AddItem(nItem, j-1, pBind[j-1].szValue);
			}
			nItem++;
		}
	}

	return nLoaded;
}


void CMyListView::ShowProcedures(LPCTSTR lpszProcedureName)
{
	USES_CONVERSION;
	CProcedures*    pProcedureSet = NULL;
	//确认会话对话是有效的
	ASSERT(m_pSession);

	m_bVertical = lpszProcedureName != NULL;
	//显示对应头部信息
	DisplayColumnHeadings(IDS_COL_PROC);

	int nItem = 0;
	pProcedureSet = new CProcedures;
	//打开连接,获得所有过程的记录信息
	if (pProcedureSet->Open(*m_pSession, NULL, NULL, lpszProcedureName) != S_OK)
		return;

	//遍历
	while(pProcedureSet->MoveNext() == S_OK)
	{		
		if (_tcschr(pProcedureSet->m_szName, _T(' ')) != NULL)
		 	continue;
		//加入一条记录的信息
		AddItem(nItem, 0, pProcedureSet->m_szName);
		AddItem(nItem, 1, pProcedureSet->m_szCatalog);
		AddItem(nItem, 2, pProcedureSet->m_szSchema);
		AddItem(nItem, 3, pProcedureSet->m_szDescription);

		CString strType;
		strType.Format("%d", pProcedureSet->m_nType);
		AddItem(nItem, 4, strType);
		nItem++;
	}

	delete pProcedureSet;
	pProcedureSet = NULL;
	AdjustColumnWidths();
}

void CMyListView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	//设置扩展风格
	CListCtrlEx & ctlList = (CListCtrlEx&)GetListCtrl();
	DWORD dwNewStyle;
	dwNewStyle = LVS_EX_FULLROWSELECT|LVS_EX_TRACKSELECT|LVS_EX_ONECLICKACTIVATE|LVS_EX_HEADERDRAGDROP;
	ctlList.SetExtendedStyle(dwNewStyle);
}
//-----------------------

//-----------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -