📄 mylistview.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 + -