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

📄 dbtooldlg.cpp

📁 很好的程序,希望能给你们带来方便.大家一起来维护这个网站,使其发展的更旺
💻 CPP
字号:
// DBToolDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DBTool.h"
#include "DBToolLogin.h"
#include "About.h"
#include "DBToolSQL.h"
#include "DBToolDlg.h"

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

CDBToolDlg::CDBToolDlg(CWnd* pParent /*=NULL*/)
	: CResizableDialog(CDBToolDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDBToolDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	cn=NULL;
	rs=NULL;
	m_pSQL=NULL;
}

void CDBToolDlg::DoDataExchange(CDataExchange* pDX)
{
	CResizableDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDBToolDlg)
	DDX_Control(pDX, IDC_TREE_DB, m_treDb);
	DDX_Control(pDX, IDC_MSFLEXGRID_DB, m_grdDb);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDBToolDlg, CResizableDialog)
	//{{AFX_MSG_MAP(CDBToolDlg)
	ON_NOTIFY(NM_CLICK, IDC_TREE_DB, OnClickTreeDb)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_DB, OnSelchangedTreeDb)
	ON_WM_CLOSE()
	ON_WM_SIZE()
	ON_COMMAND(ID_MENU_ODBC, OnMenuOdbc)
	ON_COMMAND(ID_MENU_EXIT, OnMenuExit)
	ON_COMMAND(ID_MENU_ABOUT, OnMenuAbout)
	ON_COMMAND(ID_MENU_REFRESHALL, OnMenuRefreshall)
	ON_COMMAND(ID_MENU_SQL, OnMenuSql)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,
	ID_SEPARATOR,
};
/////////////////////////////////////////////////////////////////////////////
// CDBToolDlg message handlers

BOOL CDBToolDlg::OnInitDialog()
{
	CResizableDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);
	SetIcon(m_hIcon, FALSE);

	if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,TBSTYLE_FLAT | WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
	   !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
	{
		AfxMessageBox("创建工具栏失败!");
		return -1;
	}
	else RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

	AddAnchor(IDC_TREE_DB,TOP_LEFT,BOTTOM_LEFT);
	AddAnchor(m_grdDb.GetSafeHwnd(),TOP_LEFT,BOTTOM_RIGHT);
	ShowSizeGrip(TRUE);

	m_imgLst.Create(16,16,TRUE,5,0);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_DBTOOL);
	m_imgLst.Add(m_hIcon);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_ODBC);
	m_imgLst.Add(m_hIcon);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_TABLEOPEN);
	m_imgLst.Add(m_hIcon);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_TABLECLOSE);
	m_imgLst.Add(m_hIcon);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_TABLE);
	m_imgLst.Add(m_hIcon);
	m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON_COLUMN);
	m_imgLst.Add(m_hIcon);
	m_treDb.SetImageList(&m_imgLst,LVSIL_NORMAL);

	if(GetDsn()==FALSE) AfxMessageBox("取得数据源失败!");

	HRESULT ht;
	ht=CoInitialize(NULL);//初始化COM对象
	if(!SUCCEEDED(ht))
	{
		AfxMessageBox("初始化数据连接失败!");
		return FALSE;
	}

	cn=new _ConnectionPtr;
	ht=cn->CreateInstance("ADODB.Connection");
	if(!SUCCEEDED(ht))
	{
		AfxMessageBox("创建数据连接失败!");
		delete cn;
		cn=NULL;
		return FALSE;
	}

	rs=new _RecordsetPtr;
	ht=rs->CreateInstance("ADODB.Recordset");
	if(!SUCCEEDED(ht))
	{
		AfxMessageBox("创建记录集对象失败!");
		delete rs;
		rs=NULL;
	}

	m_grdDb.SetRows(1);
	m_grdDb.SetCol(1);
	m_grdDb.SetTextMatrix(0,0,"ID");

	return TRUE;
}

BOOL CDBToolDlg::GetDsn()
{
	long i=SQL_SUCCESS;
	HENV hEnv;
    char szDSN[30];
	SWORD cbDSN;
	UCHAR szDescription[300];
	SWORD cbDescription;
	HTREEITEM parent1,parent2,parent3;

	m_treDb.DeleteAllItems();
	parent1=m_treDb.InsertItem("DBTool",0,0);
	parent2=m_treDb.InsertItem("数据源",3,2,parent1);

	if (SQLAllocEnv(&hEnv)==SQL_SUCCESS)
	{
		while(i==SQL_SUCCESS)
		{
			i=SQLDataSources(hEnv,SQL_FETCH_NEXT,
				    (UCHAR FAR *) &szDSN, 30, &cbDSN,
                    (UCHAR FAR *) &szDescription,300,
                     &cbDescription);
			{
				parent3=m_treDb.InsertItem(szDSN,1,1,parent2);
				m_treDb.InsertItem("表名称",3,2,parent3);
			}
		}
		m_treDb.DeleteItem(parent3);
		SQLFreeEnv(hEnv);
	}
	else return FALSE;

	m_treDb.Expand(parent1,TVE_EXPAND);
	m_treDb.Expand(parent2,TVE_EXPAND);

	return TRUE;
}

void CDBToolDlg::OnClickTreeDb(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
}

void CDBToolDlg::OnSelchangedTreeDb(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	HTREEITEM tmpItem=m_treDb.GetSelectedItem(),tmpItems;
	CString strTemp,tmp;
	_variant_t value;
	HRESULT ht;

	try
	{
		if(m_treDb.GetItemText(tmpItem)=="表名称")
		{//取表名称
			if(!m_treDb.ItemHasChildren(tmpItem))
			{
				CDBToolLogin dlg(this);
				if(dlg.DoModal()==IDCANCEL)	return;

				tmpItems=m_treDb.GetParentItem(tmpItem);
				tmp=m_treDb.GetItemText(tmpItems);
				strTemp = "DSN=" + tmp;

				CWaitCursor cursor;
				m_wndStatusBar.SetPaneText(1,"正在连接数据源,请等待...");

				if((*cn)->State==adStateOpen) (*cn)->Close();
				ht=(*cn)->Open(strTemp.AllocSysString(),m_strUid.AllocSysString(),m_strPwd.AllocSysString(),0);
				m_strDsn=tmp;
				if(!SUCCEEDED(ht))
				{
					AfxMessageBox("发生错误,连接数据库失败!");
					m_strPwd="";m_strUid="";
					return;
				}

				(*rs)=((*cn)->OpenSchema(adSchemaTables));

				while(!(*rs)->adoEof)
				{
					value=(*rs)->GetCollect("TABLE_TYPE");
					strTemp=(char*)_bstr_t(value);

					if(strTemp=="TABLE")
					{
						value=(*rs)->GetCollect("TABLE_NAME");
						strTemp=(char*)_bstr_t(value);
						strTemp.TrimRight();

						m_treDb.InsertItem(strTemp,4,4,tmpItem);
					}

					(*rs)->MoveNext();
				}

				tmpItem=m_treDb.GetChildItem(tmpItem);
				tmpItems=tmpItem;
				(*rs)=(*cn)->OpenSchema(adSchemaColumns);
				while(!(*rs)->adoEof)
				{
					value=(*rs)->GetCollect("TABLE_NAME");
					tmp=(char*)_bstr_t(value);

					tmpItem=tmpItems;
					while(tmpItem)
					{
						strTemp=m_treDb.GetItemText(tmpItem);
						if(tmp==strTemp)
						{
							value=(*rs)->GetCollect("COLUMN_NAME");
							tmp=(char*)_bstr_t(value);
							tmp.TrimLeft();
							m_treDb.InsertItem(tmp,5,5,tmpItem);
						}

						tmpItem=m_treDb.GetNextItem(tmpItem,1);
					}
					(*rs)->MoveNext();
				}

				tmpItem=m_treDb.GetSelectedItem();
				m_treDb.Expand(tmpItem,TVE_EXPAND);
				m_wndStatusBar.SetPaneText(1,"");
			}
		}
		else
		{//取列名称
			m_grdDb.SetRedraw(FALSE);
			tmpItem=m_treDb.GetParentItem(tmpItem);
			tmpItems=m_treDb.GetParentItem(tmpItem);
			if(m_treDb.GetItemText(tmpItem)=="表名称")
			{
				long m_Fields=2;

				tmpItem=m_treDb.GetSelectedItem();
				tmpItem=m_treDb.GetChildItem(tmpItem);
				m_grdDb.SetRows(1);
				while(tmpItem)
				{
					m_grdDb.SetCols(m_Fields);
					m_grdDb.SetTextMatrix(0,m_Fields-1,m_treDb.GetItemText(tmpItem));
					tmpItem=m_treDb.GetNextSiblingItem(tmpItem);

					m_Fields++;
				}
				if(((CButton*)GetDlgItem(IDC_CHECK_VIEW))->GetCheck()==1)
				{
					tmpItem=m_treDb.GetSelectedItem();
					tmp=m_treDb.GetItemText(tmpItems);

					if(tmp!=m_strDsn)
					{
						CDBToolLogin dlg(this);
						if(dlg.DoModal()==IDCANCEL)	return;

						strTemp = "DSN=" + tmp;

						if((*cn)->State==adStateOpen) (*cn)->Close();
						ht=(*cn)->Open(strTemp.AllocSysString(),m_strUid.AllocSysString(),m_strPwd.AllocSysString(),0);
						m_strDsn=tmp;
						if(!SUCCEEDED(ht))
						{
							AfxMessageBox("发生错误,连接数据库失败!");
							m_strPwd="";m_strUid="";
							return;
						}
					}
					CWaitCursor cursor;
					m_wndStatusBar.SetPaneText(1,"正在读取数据,请等待...");
					tmp="select * from " + m_treDb.GetItemText(tmpItem);

					if((*rs)->State==adStateOpen) (*rs)->Close();
					(*rs)->Open(tmp.AllocSysString(),(IDispatch*)(*cn),adOpenDynamic,adLockOptimistic,adCmdText);

					m_Fields=2;
					long i=1;

					while(!(*rs)->adoEof)
					{
						strTemp="";
						tmp.Format("%d",m_Fields-1);
						strTemp=strTemp + tmp + "\t";

						for(i=1;i<m_grdDb.GetCols();i++)
						{
							value=(*rs)->GetCollect((_variant_t)(m_grdDb.GetTextMatrix(0,i)));
							tmp=(value.vt!=VT_NULL) ? (char*)(_bstr_t)value : "";
							strTemp=strTemp + tmp + "\t";
						}

						i=m_Fields-1;
						value=i;
						m_grdDb.AddItem(strTemp,value);
						m_Fields++;
						(*rs)->MoveNext();
					}
				}
			}
			m_grdDb.SetRedraw(TRUE);
			m_wndStatusBar.SetPaneText(1,"");
		}
	}
	catch(_com_error e)
	{
		m_grdDb.SetRedraw(TRUE);
		m_wndStatusBar.SetPaneText(1,"");
		AfxMessageBox(e.ErrorMessage());
	}
	catch(...)
	{
		m_wndStatusBar.SetPaneText(1,"");
		m_grdDb.SetRedraw(TRUE);
	}

	*pResult = 0;
}

_ConnectionPtr* CDBToolDlg::GetConnection()
{
	return cn;
}

void CDBToolDlg::OnClose() 
{
	if(m_pSQL)
	{
		if(!m_pSQL->GetSave())
		{
			int rtn=AfxMessageBox("数据已经更改,保存否?",MB_ICONQUESTION|MB_YESNOCANCEL);

			if(rtn==IDYES)
			{
				if(!m_pSQL->SaveFile()) return;
			}
			else
			{
				if(rtn==IDCANCEL)
				{
					return;
				}
			}
		}
	}
	try
	{
		::CoUninitialize();//释放COM对象
		if((*cn)->State==adStateOpen) (*cn)->Close();
		if((*rs)->State==adStateOpen) (*rs)->Close();
		delete cn;
		delete rs;
		cn=NULL;
		rs=NULL;
	}
	catch(_com_error e)
	{
		delete cn;
		delete rs;
		cn=NULL;
		rs=NULL;
		AfxMessageBox(e.ErrorMessage());
	}

	CResizableDialog::OnClose();
}

void CDBToolDlg::OnSize(UINT nType, int cx, int cy) 
{
	CResizableDialog::OnSize(nType, cx, cy);

	RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}

void CDBToolDlg::SetUidPwd(CString Uid,CString Pwd)
{
	m_strUid=Uid;
	m_strPwd=Pwd;
}

void CDBToolDlg::OnMenuOdbc() 
{
	WinExec("odbcad32.exe",SW_SHOWNORMAL);
}

BOOL CDBToolDlg::PreTranslateMessage(MSG* pMsg) 
{
	if((pMsg->wParam==VK_RETURN && GetKeyState(VK_RETURN)<0) ||(pMsg->wParam==VK_ESCAPE &&GetKeyState(VK_ESCAPE)<0)) return FALSE;
	if(pMsg->wParam==VK_F5 && GetKeyState(VK_F5)<0) OnMenuRefreshall();

	return CResizableDialog::PreTranslateMessage(pMsg);
}

void CDBToolDlg::OnMenuExit() 
{
	PostMessage(WM_CLOSE);
}

void CDBToolDlg::OnMenuAbout() 
{
	About dlg;
	dlg.DoModal();
}

void CDBToolDlg::OnMenuRefreshall() 
{
	GetDsn();
}

void CDBToolDlg::OnMenuSql() 
{
	if(m_pSQL==NULL)
	{
		m_pSQL=new DBToolSQL(this);
		if(m_pSQL->Create()==FALSE)
		{
			delete m_pSQL;
			m_pSQL=NULL;
			AfxMessageBox("创建SQL窗口失败!");
		}
	}
	else m_pSQL->SetActiveWindow();
}

void CDBToolDlg::BoxDone()
{
	delete m_pSQL;
	m_pSQL=NULL;
}

int CDBToolDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CResizableDialog::OnCreate(lpCreateStruct) == -1)
		return -1;

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		AfxMessageBox("创建状态栏失败!");
		return -1;
	}

	//m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,300);

	return 0;
}

⌨️ 快捷键说明

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