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

📄 createsqldbdlg.cpp

📁 行业数据库软件经常需要在用户机器上的SQLServer服务器上创建数据库。本软件自动完成在用户机器上的SQLServer服务器上创建数据库
💻 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 + -