cdbexpalias.cpp

来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· C++ 代码 · 共 349 行

CPP
349
字号
// Copyright (C) 1991 - 1999 Rational Software Corporation

#include "stdafx.h"
#include <afxcoll.h>
#include "CDBExpAlias.h"
#include "CAliasException.h"
#include "CDBExpDatabase.h"
#include "CDBExpTable.h"
#include "resource.h"
#include "aliasinputdlg.h"

#include "TablePackage.h"
#include "ViewPackage.h"
#include "StoredProcPackage.h"
#include "mainfrm.h"
#include "vicdoc.h"

IMPLEMENT_DYNAMIC(CDBExpAlias, CDBTreeNode)
//##ModelId=3C36957A0037
void CDBExpAlias::LoadAlias()
{
	// TODO: Add your specialized code here.
	ASSERT( NULL != m_pIniFile);

	m_strConnectString = m_pIniFile->GetValue(m_strAliasName, _T("ConnectString"));
}

//##ModelId=3C369589002F
void CDBExpAlias::SaveAlias()
{
	// TODO: Add your specialized code here.
	m_pIniFile->SetValue(m_strAliasName, "ConnectString", m_strConnectString);
}

//##ModelId=3C369C4003CA
CDBExpAlias::CDBExpAlias(CIniFile *pIniFile, const CString& szAliasName) 
		: m_pIniFile(pIniFile),
		m_pDatabase(NULL),
		m_bIsActive(FALSE),
		m_strConnectString(_T(""))
{
	// TODO: Add your specialized code here.
	strcpy(m_strAliasName, (const char *)szAliasName);
}

//##ModelId=3C369C59023F
CDBExpAlias::~CDBExpAlias()
{
	// TODO: Add your specialized code here.
	if(m_pDatabase)
	{
		delete m_pDatabase;
	}
}

//##ModelId=3C369CE501D2
const CString& CDBExpAlias::GetConnectString() const
{
	// TODO: Add your specialized code here.
	return m_strConnectString;
	// NOTE: Requires a correct return value to compile.
}

//##ModelId=3C3885980218
void CDBExpAlias::SetConnectString(const CString& szConnStr)
{
	// TODO: Add your specialized code here.
	m_strConnectString = szConnStr;
}

//##ModelId=3C3885990043
void CDBExpAlias::DeleteAlias(const CString& szAliasName)
{
	// TODO: Add your specialized code here.
	//如果现在正在使用中,那么别名不能被删除。
	if(m_bIsActive)
	{
		throw new CAliasException();		
	}


	m_pIniFile->DeleteKey(m_strAliasName);

}

//##ModelId=3C38859900C5
void CDBExpAlias::NewAlias(const CString& szAliasName, const CString& szConnStr)
{
	// TODO: Add your specialized code here.
	CString strCnn = szConnStr;
	if(szConnStr.IsEmpty())
		strCnn = m_pDatabase->CreateValidConnStr();
	m_pIniFile->SetValue(szAliasName, "ConnectString", strCnn);
}

//##ModelId=3C38859901B5
void CDBExpAlias::ModifyAlias(const CString& szAliasName, const CString& szConnStr)
{
	// TODO: Add your specialized code here.
	if(IsAliasActive())
		throw new CAliasException();

	ToDo("ModifyAlias没有实现呢!", __LINE__);
}

//##ModelId=3C38859902D8
void CDBExpAlias::EnumAliases(CStringList& Aliases)
{
	// TODO: Add your specialized code here.
/*	for(int i = 0; i < m_pIniFile->keys.GetSize(); i++)
		Aliases.AddTail(m_pIniFile->keys[i]);
*/
	char szSectionBuf[2048];

	int i = 0, nSize = GetPrivateProfileSectionNames(szSectionBuf, 
		sizeof(szSectionBuf), m_pIniFile->GetPath());
	
	while(i < nSize + 1 && szSectionBuf[i] != '\0')
	{
		Aliases.AddTail((char *)(szSectionBuf + i));

		while(szSectionBuf[i++] != '\0')
		{
			//故意使用空循环,为的是忽略不是NULL的字符
		}			 
	}
}

//##ModelId=3C38859C025A
BOOL CDBExpAlias::IsAliasActive()
{
	// TODO: Add your specialized code here.
	return m_bIsActive;
	// NOTE: Requires a correct return value to compile.
}


//##ModelId=3C41D26D0047
void CDBExpAlias::BuildTVITEM(HTREEITEM hParentItem)
{
	CDBTreeNode::BuildTVITEM(hParentItem);
}

//##ModelId=3C41D26D001F
const char * CDBExpAlias::GetTreeNodeCaption()
{
	return (const char *)get_AliasName();
}

//##ModelId=3C41D26C0352
BOOL CDBExpAlias::ExpandItem(HTREEITEM hItem, UINT state)
{

	CWaitCursor wait;
	HTREEITEM hTempItem = 0;

	m_pDatabase = GetDatabase();
	ASSERT(m_pDatabase);
	
	if(m_pDatabase->m_ObStruct[CDBExpDatabase::OBS_TABLE].m_pPackageNode)
	{
		return TRUE;
	}

	CTablePackage	*pTablePack = new CTablePackage();	
	CViewPackage	*pViewPack	= new CViewPackage();
	CStoredProcPackage	*pSPPack	= new CStoredProcPackage();

	pTablePack->BuildTVITEM(hItem);
	hTempItem = m_pTreeCtrl->InsertItem(&pTablePack->m_tvInsertStruct);
	ASSERT(hTempItem);
	pTablePack->Set_hItem(hTempItem);

	pViewPack->BuildTVITEM(hItem);
	hTempItem = m_pTreeCtrl->InsertItem(&pViewPack->m_tvInsertStruct);
	ASSERT(hTempItem);
	pViewPack->Set_hItem(hTempItem);

	pSPPack->BuildTVITEM(hItem);
	hTempItem = m_pTreeCtrl->InsertItem(&pSPPack->m_tvInsertStruct);
	ASSERT(hTempItem);
	pSPPack->Set_hItem(hTempItem);

	//将生成的几个包的对象放到 m_pDatabase中, 以便于以后的删除
	m_pDatabase->m_ObStruct[CDBExpDatabase::OBS_TABLE].m_pPackageNode
		= pTablePack;
	
	m_pDatabase->m_ObStruct[CDBExpDatabase::OBS_VIEW].m_pPackageNode
		= pViewPack;

	m_pDatabase->m_ObStruct[CDBExpDatabase::OBS_STOREDPROC].m_pPackageNode
		= pSPPack;

	return TRUE;
}

//##ModelId=3C5B9BA00104
void CDBExpAlias::OnMenuItemClick(UINT nCmd)
{
	switch(nCmd)
	{
	case ID_POPUP_NEW:
		{
		CAliasInputDlg dlg;
		dlg.m_strPrompt = _T("请输入数据库的别名:");
		if(IDOK != dlg.DoModal())
			return;
		this->NewAlias(dlg.m_strName, _T(""));
		}
		break;
	case ID_MENU_NEW_DATABASE:
		{
			CAliasInputDlg dlg;
			dlg.SetCaption("数据库名称");
			dlg.m_strPrompt = _T("请输入要创建的数据库的名称:");
			if(IDOK != dlg.DoModal())
				return;
			this->CreateDB(dlg.m_strName);
		}
		break;
	case ID_MENU_DEL_DATABASE:	
		{
			CAliasInputDlg dlg;
			dlg.SetCaption("数据库名称");
			dlg.m_strPrompt = _T("请输入要删除的数据库的名称:");
			if(IDOK != dlg.DoModal())
				return;
			this->DeleteDB(dlg.m_strName);
		}
		break;
	default:
		CDBTreeNode::OnMenuItemClick(nCmd);
		break;
	}
}

//##ModelId=3C5CC9C70290
BOOL CDBExpAlias::FillListView(CListView *pView)
{
	pView->GetListCtrl().DeleteAllItems();

	int& nCount = ResetListViewItemCounter();
	
	for(int i = 0; i < _count_of(m_pDatabase->m_ObStruct); i++)
	{
		m_pDatabase->m_ObStruct[i].m_pPackageNode->BuildLVITEM(nCount);
		int ret = pView->GetListCtrl().InsertItem(
			&m_pDatabase->m_ObStruct[i].m_pPackageNode->m_lvInsertStruct);
		ret = GetLastError();
		
//		pView->GetListCtrl().InsertItem(i, "test", 0);

	}
	return TRUE;

}


//##ModelId=3C5CCCD80359
BOOL CDBExpAlias::OpenRelatedView(LPARAM lParam)
{
	// ToDo: Add your specialized code here
	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
	
	CListView *pListView = (CListView *)pFrame->GetRightPane();
	return FillListView(pListView);
}



//##ModelId=3C67402900F4
void CDBExpAlias::Erase(CDBTreeNode * pTreeNode)
{
	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
	CVicDoc *pDoc = (CVicDoc *)pFrame->GetActiveDocument();
	pDoc->OnAliasDelete((WPARAM)pTreeNode, 0);
	this->DeleteAlias(this->get_AliasName());
	delete this;
}



//##ModelId=3CD958EC01C3
void CDBExpAlias::BuildLVITEM(int& nIndex)
{
	// ToDo: Add your specialized code here or after the call to base class
	
	CDBTreeNode::BuildLVITEM(nIndex);
}



//##ModelId=3CDCDEE3029D
void CDBExpAlias::BuildContextMenu(DBTREE_NODE_CONTEXT& context)
{
	// ToDo: Add your specialized code here or after the call to base class
	
	m_pContextMenu->LoadMenu(IDR_MENU_ALIAS);
}


void CDBExpAlias::CreateDB(CString &strDBName)
{
	ADODB::_ConnectionPtr ptrTempConn = 
			this->GetDatabase()->m_ptrConnection;

	CString strSQL="CREATE DATABASE ";
	strSQL += strDBName;
	try
	{
		_bstr_t bstrTemp = this->GetDatabase()->m_strCnn;
        ptrTempConn->Open(bstrTemp, L"", L"", NULL);
		ptrTempConn->Execute((const char *)strSQL, NULL, ADODB::adExecuteNoRecords);
		ptrTempConn->Close();
		AfxMessageBox("创建成功");
	}
	catch(_com_error &e)
	{
		CString strError = "创建失败,下面是错误的具体内容: ";
		strError += (const char *)e.Description();
		AfxMessageBox((const char *)strError);    
		ptrTempConn->Close();
	}
}

void CDBExpAlias::DeleteDB(CString &strDBName)
{
	ADODB::_ConnectionPtr ptrTempConn = 
			this->GetDatabase()->m_ptrConnection;

	CString strSQL="DROP DATABASE ";
	strSQL += strDBName;
	try
	{
		_bstr_t bstrTemp = this->GetDatabase()->m_strCnn;
        ptrTempConn->Open(bstrTemp, L"", L"", NULL);
		ptrTempConn->Execute((const char *)strSQL, NULL, ADODB::adExecuteNoRecords);
		ptrTempConn->Close();
		AfxMessageBox("删除成功");
	}
	catch(_com_error &e)
	{
		CString strError = "删除失败,下面是错误的具体内容: ";
		strError += (const char *)e.Description();
		AfxMessageBox((const char *)strError);    
		ptrTempConn->Close();
	}
}

⌨️ 快捷键说明

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