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

📄 dlgnewtable.cpp

📁 连接MYSQL数据库
💻 CPP
字号:
//author : Jarry
//E-mail : lansingk@online.sh.cn
// DlgNewTable.cpp : implementation file
//

#include "stdafx.h"
#include "mysqlManager.h"
#include "DlgNewTable.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlgNewTable dialog


CDlgNewTable::CDlgNewTable(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgNewTable::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgNewTable)
	m_strTableName = _T("");
	//}}AFX_DATA_INIT
}


void CDlgNewTable::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgNewTable)
	DDX_Control(pDX, IDC_LST_NEW_TABLE, m_lstTable);
	DDX_Text(pDX, IDC_EDT_TABLE_NAME, m_strTableName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgNewTable, CDialog)
	//{{AFX_MSG_MAP(CDlgNewTable)
	ON_WM_SHOWWINDOW()
	ON_BN_CLICKED(IDC_BTN_NEW_FIELD, OnBtnNewField)
	ON_BN_CLICKED(IDC_BTN_DEL_FIELD, OnBtnDelField)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BTN_GENERATE_SQL, OnBtnGenerateSql)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgNewTable message handlers

void CDlgNewTable::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	int nCol,nRow;

	CDialog::OnShowWindow(bShow, nStatus);

	m_lstTable.LoadImageList();

	m_lstTable.DeleteAllItems();
	for (nCol = 0 ; m_lstTable.DeleteColumn(0) ; nCol++);

	m_lstTable.InsertColumn(0,"",LVCFMT_CENTER,30);
	m_lstTable.InsertColumn(1,"Name",LVCFMT_LEFT,100);
	m_lstTable.InsertColumn(2,"Type",LVCFMT_LEFT,80);
	m_lstTable.InsertColumn(3,"Length",LVCFMT_LEFT,80);
	m_lstTable.InsertColumn(4,"Precision",LVCFMT_LEFT,80);
	m_lstTable.InsertColumn(COL_NULL,"NULL",LVCFMT_LEFT,60);
	m_lstTable.InsertColumn(COL_KEY,"Key",LVCFMT_LEFT,60);
	m_lstTable.InsertColumn(7,"Default",LVCFMT_LEFT,80);

	for (nRow = 0 ; nRow < 50 ; nRow++)
		m_lstTable.InsertItem(nRow,"",-1);
	m_lstTable.SetItemText(0,0,">");

	FieldInfo  *pFieldInfo;  
	while (!m_lstFieldInfoNew.IsEmpty())
	{
		pFieldInfo = (FieldInfo  *)m_lstFieldInfoNew.RemoveHead();
		delete pFieldInfo;
	}
	m_lstFieldInfoNew.RemoveAll();

	m_strTableName = "Table1";
	UpdateData(false);
}

void CDlgNewTable::OnBtnNewField() 
{
	if (m_lstTable.nLastRow < 0)
		m_lstTable.nLastRow = 0;
	m_lstTable.SetItemText(m_lstTable.nLastRow,0,"");
	m_lstTable.InsertItem(m_lstTable.nLastRow,"",-1);
	m_lstTable.SetItemText(m_lstTable.nLastRow,0,">");
}

void CDlgNewTable::OnBtnDelField()
{
	m_lstTable.DeleteItem(m_lstTable.nLastRow);
	if (m_lstTable.nLastRow >= m_lstTable.GetItemCount())
		m_lstTable.nLastRow = m_lstTable.GetItemCount() - 1;
	m_lstTable.SetItemText(m_lstTable.nLastRow,0,">");
}

bool CDlgNewTable::CheckField(int nField,CPtrList& lstFieldInfo)
{
//	LVITEM  lvItem;
	CString strTemp;
	int     nLength,nPrecision;

//	lvItem.mask     = LVIF_TEXT;
//	lvItem.iItem    = nField;
//	lvItem.iSubItem = 1;  //Get field name
//	m_lstTable.GetItem(&lvItem);
//	strTemp = lvItem.pszText;

	//It seems that GetItem() doesn't work ,
	//with mask LVIF_TEXT is always return NULL ,
	//and same did LVIF_IMAGE ,
	//I think it's the problem of derived class from CList
	//So I use GetItemText() instead of GetItem()
	strTemp = m_lstTable.GetItemText(nField,1);
	strTemp.TrimLeft();
	strTemp.TrimRight();
	if (strTemp.GetLength() > 0)
	{
		FieldInfo  *pFieldInfo = new FieldInfo;

		pFieldInfo->strFieldName = strTemp;

//		lvItem.iSubItem = 2; //Get field type
//		m_lstTable.GetItem(&lvItem);
//		strTemp = lvItem.pszText;
		strTemp = m_lstTable.GetItemText(nField,2);
		strTemp.TrimLeft();
		strTemp.TrimRight();
		if (strTemp.GetLength() > 0)
			pFieldInfo->strFieldType = strTemp;
		else
		{
			delete pFieldInfo;
			return false;
		}

		if (   (pFieldInfo->strFieldType == "tinyint")
			|| (pFieldInfo->strFieldType == "smallint")
			|| (pFieldInfo->strFieldType == "integer")
			|| (pFieldInfo->strFieldType == "mediumint")
			|| (pFieldInfo->strFieldType == "bigint")
			|| (pFieldInfo->strFieldType == "decimal")
			|| (pFieldInfo->strFieldType == "numeric")
			|| (pFieldInfo->strFieldType == "float")
			|| (pFieldInfo->strFieldType == "double")
			|| (pFieldInfo->strFieldType == "real")
		   )
		    pFieldInfo->bNum = true;
		else
			pFieldInfo->bNum = false;

//		lvItem.iSubItem = 3; //Get field length
//		m_lstTable.GetItem(&lvItem);
//		nLength = atoi(lvItem.pszText);

		strTemp = m_lstTable.GetItemText(nField,3);
		nLength = atoi(strTemp);
		if (nLength > 0)
		{
			strTemp.Format("%d",nLength);
			pFieldInfo->strFieldLength = strTemp;

//			lvItem.iSubItem = 4; //Get field precision
//			m_lstTable.GetItem(&lvItem);
//			nPrecision = atoi(lvItem.pszText);

			strTemp = m_lstTable.GetItemText(nField,4);
			nPrecision = atoi(strTemp);

			if (nPrecision > 0)
				if (nPrecision <= nLength)
				{
					strTemp.Format("%d",nPrecision);
					pFieldInfo->strFieldPrecision = strTemp;
				}
				else
				{
					delete pFieldInfo;
					return false;
				}
			else if (nPrecision == 0)
				pFieldInfo->strFieldPrecision = "";
			else
			{
				delete pFieldInfo;
				return false;
			}
		}
		else if (nLength == 0)
			pFieldInfo->strFieldLength = "";
		else
		{
			delete pFieldInfo;
			return false;
		}

//		lvItem.iSubItem = 7; //Get default
//		m_lstTable.GetItem(&lvItem);
//		strTemp = lvItem.pszText;

		strTemp = m_lstTable.GetItemText(nField,7);
		strTemp.TrimLeft();
		strTemp.TrimRight();
		if (strTemp.GetLength() > 0)
			pFieldInfo->strDefault = strTemp;
		else
			pFieldInfo->strDefault = "";

//		lvItem.mask     = LVIF_IMAGE;
//		lvItem.iSubItem = COL_NULL; //Get NULL
//		m_lstTable.GetItem(&lvItem);
		strTemp = m_lstTable.GetItemText(nField,COL_NULL);
		strTemp.TrimLeft();
		strTemp.TrimRight();
//		if (lvItem.iImage == 0) //permit null
		if (strTemp == "NO")
			pFieldInfo->bNull = false;
		else
			pFieldInfo->bNull = true;  //Default is NULL

//		lvItem.iSubItem = COL_KEY; //Get key
//		m_lstTable.GetItem(&lvItem);
//		if (lvItem.iImage == 0) //is key
		strTemp = m_lstTable.GetItemText(nField,COL_KEY);
		strTemp.TrimLeft();
		strTemp.TrimRight();
		if (strTemp == "YES")
			pFieldInfo->bKey = true;
		else
			pFieldInfo->bKey = false;
		lstFieldInfo.AddTail(pFieldInfo);
	}
	return true;
}
void CDlgNewTable::OnOK() 
{
	bool bRet = true;

	UpdateData(true);
	m_strTableName.TrimLeft();
	m_strTableName.TrimRight();
	if (m_strTableName.GetLength() <= 0)
	{
		bRet = false;
		AfxMessageBox(IDS_ERR_NO_TABLE_NAME);
	}

	FieldInfo  *pFieldInfo;  
	while (!m_lstFieldInfoNew.IsEmpty())
	{
		pFieldInfo = (FieldInfo  *)m_lstFieldInfoNew.RemoveHead();
		delete pFieldInfo;
	}
	m_lstFieldInfoNew.RemoveAll();

	for (int i = 0; i < m_lstTable.GetItemCount(); i++)
	{
		if (!CheckField(i,m_lstFieldInfoNew))
		{
			char szBuf[1024];

			bRet = false;
			sprintf(szBuf,"Table definition error in line: %d .",i + 1);
			AfxMessageBox(szBuf);
			break;
		}
	}

	strcpy(m_szSQL,""); //
	if (bRet)
		if (m_lstFieldInfoNew.GetCount() > 0)
		{
			CHAR szTableName[1024];

			strcpy(szTableName,m_strTableName);
			GenerateTableSQL(m_szSQL,szTableName,m_lstFieldInfoNew);
			if (strlen(m_szSQL) <= 0)
			{
				bRet = false;
				AfxMessageBox(IDS_ERR_SQL_CREATE_TABLE);
			}
		}
		else
		{
			bRet = false;
		}

	if (bRet)
		CDialog::OnOK();
}

void CDlgNewTable::OnDestroy() 
{
	CDialog::OnDestroy();

	FieldInfo  *pFieldInfo;  
	while (!m_lstFieldInfoNew.IsEmpty())
	{
		pFieldInfo = (FieldInfo  *)m_lstFieldInfoNew.RemoveHead();
		delete pFieldInfo;
	}
	m_lstFieldInfoNew.RemoveAll();
}

void CDlgNewTable::OnBtnGenerateSql() 
{
	bool bRet = true;

	UpdateData(true);
	m_strTableName.TrimLeft();
	m_strTableName.TrimRight();
	if (m_strTableName.GetLength() <= 0)
	{
		bRet = false;
		AfxMessageBox(IDS_ERR_NO_TABLE_NAME);
	}

	FieldInfo  *pFieldInfo;  
	while (!m_lstFieldInfoNew.IsEmpty())
	{
		pFieldInfo = (FieldInfo  *)m_lstFieldInfoNew.RemoveHead();
		delete pFieldInfo;
	}
	m_lstFieldInfoNew.RemoveAll();

	for (int i = 0; i < m_lstTable.GetItemCount(); i++)
	{
		if (!CheckField(i,m_lstFieldInfoNew))
		{
			char szBuf[1024];

			bRet = false;
			sprintf(szBuf,"Table definition error in line: %d .",i + 1);
			AfxMessageBox(szBuf);
			break;
		}
	}

	strcpy(m_szSQL,""); //
	if (bRet)
		if (m_lstFieldInfoNew.GetCount() > 0)
		{
			CHAR szTableName[1024];

			strcpy(szTableName,m_strTableName);
			GenerateTableSQL(m_szSQL,szTableName,m_lstFieldInfoNew);
			if (strlen(m_szSQL) <= 0)
			{
				bRet = false;
				AfxMessageBox(IDS_ERR_SQL_CREATE_TABLE);
			}
		}
		else
		{
			bRet = false;
		}

	if (bRet)
	{
		HGLOBAL hData = ::GlobalAlloc(GMEM_DDESHARE, 64*1024);
		LPTSTR lpOut = (LPTSTR)::GlobalLock(hData);
		strcpy(lpOut,m_szSQL);
		OpenClipboard();
		EmptyClipboard();
		SetClipboardData( CF_TEXT,hData );
		CloseClipboard();
		//the next two statements raise an error
		//At now I don't know why
//		::GlobalUnlock(hData);
//		::GlobalFree(hData);
	}
}

⌨️ 快捷键说明

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