📄 createsqldbdlg.cpp
字号:
// CreateSQLDBDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CreateSQLDB.h"
#include "CreateSQLDBDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCreateSQLDBDlg dialog
CCreateSQLDBDlg::CCreateSQLDBDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCreateSQLDBDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCreateSQLDBDlg)
m_sTxt = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCreateSQLDBDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCreateSQLDBDlg)
DDX_Text(pDX, IDC_TISHI, m_sTxt);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCreateSQLDBDlg, CDialog)
//{{AFX_MSG_MAP(CCreateSQLDBDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_RECREATE, OnRecreate)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCreateSQLDBDlg message handlers
BOOL CCreateSQLDBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// TODO: Add extra initialization here
if(!OpenDBS())
{
AfxGetApp()->EndWaitCursor();
MessageBox("数据库打开失败,退出程序","系统初始化",MB_OK);
exit(1);
}
if(!ModifyPassWord())
{
AfxGetApp()->EndWaitCursor();
MessageBox("系统初始化失败,请重试","系统初始化",MB_OK);
exit(1);
}
if(createDBS())
{
// MessageBox("数据库创建失败,退出程序","系统初始化",MB_OK);
// exit(1);
// m_sTxt="数据库初始化成功!";
// GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
RestoreDBS();
}
UpdateData(FALSE);
AfxGetApp()->EndWaitCursor();
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCreateSQLDBDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCreateSQLDBDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL CCreateSQLDBDlg::OpenDBS()
{
m_sOldPassWord="";
m_pConn = NULL;
//打开数据库
CString strMdbFile;//数据库路径
strMdbFile = "Provider=SQLOLEDB;Persist Security Info=False;Data Source=(local);User ID=sa";
_bstr_t sCnn(strMdbFile);
HRESULT hr = S_OK;
hr = m_pConn.CreateInstance(__uuidof(Connection));
if(!SUCCEEDED(hr))
return FALSE;
try
{
m_pConn->Open(sCnn,"","",adModeUnknown);
}
catch(_com_error &e)
{
_bstr_t bstrDescription(e.Description());
try
{
m_sOldPassWord="ad";
CString str = "Provider=SQLOLEDB;Persist Security Info=False;Data Source=(local);User ID=sa;PWD=ad";
_bstr_t sCnn1(str);
m_pConn->Open(sCnn1,"","",adModeUnknown);
}
catch(_com_error &e)
{
_bstr_t bstrDescription(e.Description());
try
{
m_sOldPassWord="sample";
CString str = "Provider=SQLOLEDB;Persist Security Info=False;Data Source=(local);User ID=sa;PWD=sample";
_bstr_t sCnn1(str);
m_pConn->Open(sCnn1,"","",adModeUnknown);
}
catch(_com_error &e)
{
_bstr_t bstrDescription(e.Description());
MessageBox((LPCTSTR)bstrDescription,"系统初始化",MB_OK);
MessageBox("数据库打开失败!","系统初始化",MB_OK);
return FALSE;
}
}
}
return TRUE;
}
BOOL CCreateSQLDBDlg::ModifyPassWord()
{
if(m_sOldPassWord=="")
{
try
{
CString strSQL = "EXEC sp_password NULL,sample,sa";
m_pConn->Execute((_bstr_t)strSQL,NULL,adCmdText);
}
catch(_com_error &e)
{
AfxMessageBox(e.Description(),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
_ParameterPtr param;
CString oldPassWord=m_sOldPassWord;//"";
param = m_pCommand->CreateParameter("",adVarChar,adParamInput,oldPassWord.GetLength()+1,_variant_t(oldPassWord));
m_pCommand->Parameters->Append(param);
CString newPassWord="sample";
param = m_pCommand->CreateParameter("",adVarChar,adParamInput,newPassWord.GetLength()+1,_variant_t(newPassWord));
m_pCommand->Parameters->Append(param);
CString user="sa";
param = m_pCommand->CreateParameter("",adVarChar,adParamInput,user.GetLength()+1,_variant_t(user));
m_pCommand->Parameters->Append(param);
m_pCommand->CommandText=_bstr_t("sp_password");//存储过程的名称
m_pCommand->ActiveConnection = m_pConn; //需要使用的ADO连接
m_pCommand->CommandType=adCmdStoredProc;
try
{
m_pCommand->Execute(NULL, NULL, adCmdStoredProc);
m_pCommand.Detach();
}
catch(_com_error &e)
{
AfxMessageBox(e.Description(),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
BOOL CCreateSQLDBDlg::createDBS()
{
m_sAppPath="";
getPath();
CString strTarget;//数据库路径
strTarget = m_sAppPath + "data\\";
DWORD rtnPath = GetFileAttributes(strTarget);
if(rtnPath != FILE_ATTRIBUTE_DIRECTORY)
{
if( !CreateDirectory(strTarget, NULL))
{
AfxGetApp()->EndWaitCursor();
MessageBox( "创建文件夹失败,请您重试!","建筑物资租赁管理系统",MB_OK|MB_ICONEXCLAMATION) ;
return FALSE;
}
}
CString sPath = m_sAppPath+"\\data";
CString str = "CREATE DATABASE sample ON(NAME = sample_dat,FILENAME = '"
+sPath+"\\sample_data.mdf')";
try
{
m_pConn->Execute((_bstr_t)str,NULL,adCmdText);
}
catch(_com_error &e)
{
// AfxMessageBox(e.Description(),MB_OK|MB_ICONEXCLAMATION);
// AfxMessageBox(e.ErrorMessage(),MB_OK|MB_ICONEXCLAMATION);
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("Exception thrown for classes generated by #import");
TRACE("\tCode=%081x\n",e.Error());
TRACE("\tCode meaning =%s\n",e.ErrorMessage());
TRACE("\tSource=%s\n",(LPCTSTR)bstrSource);
TRACE("\tDescription=%s\n",(LPCTSTR)bstrDescription);
CString errorID=e.ErrorMessage();
if(errorID=="IDispatch error #3092")//数据库已经存在
{
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
m_sTxt="数据库已经存在,如果您是第一次安装,请选择'重建数据库'按钮!";
}
else
{
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
m_sTxt="数据库初始化失败,错误代码:"+errorID+",请与软件供应商联系!";
}
UpdateData(FALSE);
return FALSE;
}
UpdateData(FALSE);
return TRUE;
}
BOOL CCreateSQLDBDlg::dropDBS()
{
CString str = "DROP DATABASE sample";
try
{
m_pConn->Execute((_bstr_t)str,NULL,adCmdText);
}
catch(_com_error &e)
{
_bstr_t bstrDescription(e.Description());
// AfxMessageBox(e.Description(),MB_OK|MB_ICONEXCLAMATION);
// AfxMessageBox(e.ErrorMessage(),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
void CCreateSQLDBDlg::CopyDB()
{
CString m_sSource = m_sAppPath+"\\sample_data.mdf";
CString m_sTarget = m_sAppPath+"\\data\\sample_data.mdf";
BOOL rtn = CopyFile(m_sSource, m_sTarget, FALSE);
m_sSource = m_sAppPath+"\\sample_log.LDF";
m_sTarget = m_sAppPath+"\\data\\sample_log.LDF";
BOOL rtn1 = CopyFile(m_sSource, m_sTarget, FALSE);
AfxGetApp()->BeginWaitCursor();
if(rtn && rtn1)
{
AfxGetApp()->EndWaitCursor();
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_HIDE);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
m_sTxt="数据库初始化成功,您可以退出了!";
UpdateData(FALSE);
}
else
{
AfxGetApp()->EndWaitCursor();
MessageBox("导入数据库失败,请重试!","系统初始化",MB_OK|MB_ICONEXCLAMATION);
m_sTxt="导入数据库失败,请重试!";
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
return;
// CDialog::OnCancel();
}
void CCreateSQLDBDlg::getPath()
{
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH在API中定义了吧,好象是128
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
CString strPreFileName = exeFullPath;
strPreFileName.MakeReverse();
int num = strPreFileName.Find("\\");
int len = strPreFileName.GetLength();
strPreFileName = strPreFileName.Right(len - num);
strPreFileName.MakeReverse();
m_sAppPath = strPreFileName;
}
void CCreateSQLDBDlg::OnRecreate()
{
AfxGetApp()->BeginWaitCursor();
if(!dropDBS())//删除旧数据库
{
}
CString m_sTarget = m_sAppPath+"\\data\\sample_data.mdf";
DWORD rtnPath = GetFileAttributes(m_sTarget);
BOOL rtn = DeleteFile(m_sTarget);
if(rtnPath == FILE_ATTRIBUTE_DIRECTORY)
{
}
CString m_sTarget1 = m_sAppPath+"\\data\\sample_log.ldf";
DWORD rtnPath1 = GetFileAttributes(m_sTarget1);
rtn = DeleteFile(m_sTarget1);
if(rtnPath1 == FILE_ATTRIBUTE_DIRECTORY)
{
}
if(createDBS())
{
// MessageBox("数据库创建失败,退出程序","系统初始化",MB_OK);
// exit(1);
// m_sTxt="数据库初始化成功!";
// GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
RestoreDBS();
}
AfxGetApp()->EndWaitCursor();
}
BOOL CCreateSQLDBDlg::NewDerive()
{
CloseDBS();
if(!OpenDBSDenyShare())
{
MessageBox("有其它用户正在使用数据库,数据库恢复失败!","创建数据库",MB_OK|MB_ICONEXCLAMATION);
OpenDBS();
return false;
}
return TRUE;
}
BOOL CCreateSQLDBDlg::OpenDBSDenyShare()
{
getPath();
m_pConn = NULL;
//打开数据库
CString strMdbFile;//数据库路径
//服务器端打开数据库
strMdbFile = "Provider=SQLOLEDB;Persist Security Info=False;Data Source=(local);User ID=sa;PWD=sample";
_bstr_t sCnn(strMdbFile);
HRESULT hr = S_OK;
hr = m_pConn.CreateInstance(__uuidof(Connection));
if(!SUCCEEDED(hr))
return FALSE;
try
{
// m_pConn->CursorLocation=adUseClient;
m_pConn->Open(sCnn,"","",adModeShareDenyNone|adConnectUnspecified);
}
catch(_com_error &e)
{
m_pConn = NULL;
_bstr_t bstrDescription(e.Description());
MessageBox((LPCTSTR)bstrDescription,"创建数据库",MB_OK);
MessageBox("数据库打开失败!","创建数据库",MB_OK);
return FALSE;
}
return TRUE;
}
void CCreateSQLDBDlg::CloseDBS()
{
if(m_pConn!=NULL)//判断对象是否打开
{
m_pConn->Close();
m_pConn = NULL;
}
}
void CCreateSQLDBDlg::RestoreDBS()
{
AfxGetApp()->BeginWaitCursor();
if(!NewDerive())
{
AfxGetApp()->EndWaitCursor();
// MessageBox("导入数据库失败,请重试!","系统初始化",MB_OK|MB_ICONEXCLAMATION);
m_sTxt="导入数据库失败,请重试!";
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_HIDE);
GetDlgItem(IDOK)->ShowWindow(SW_SHOW);
UpdateData(FALSE);
return;
}
AfxGetApp()->EndWaitCursor();
GetDlgItem(IDC_RECREATE)->ShowWindow(SW_HIDE);
GetDlgItem(IDOK)->ShowWindow(SW_HIDE);
m_sTxt="数据库初始化成功,您可以退出了!";
UpdateData(FALSE);
return;
}
void CCreateSQLDBDlg::OnDestroy()
{
CDialog::OnDestroy();
CloseDBS();
// TODO: Add your message handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -