?? dbtooldlg.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 + -