차근차근/C

MFC 새 레코드 저장하기.

예쁜꽃이피었으면 2015. 7. 29. 14:35


MFC , VS2013 , mysql , oleDB ,COleDateTime ,date Time Picker , Datetime


1단계에서는 DB에 모든 칼럼이 varchar였다.


CREATE TABLE `carnumber_mfc` (

  `No` int(5) NOT NULL AUTO_INCREMENT,

  `Name` varchar(20) DEFAULT NULL,

  `PhoneNumber` varchar(20) DEFAULT NULL,

  `Address` varchar(50) DEFAULT NULL,

  `Age` int(10) DEFAULT NULL,

  PRIMARY KEY (`No`)

) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;



[새 레코드 저장하기 ] - 1단계

void CSB_DBmfcView::OnBnClickedButtonAddnew()

{

// TODO: Add your control notification handler code here


CCommand<CDynamicAccessor> Cmd;



//텍스트 박스에서 읽어오기

CString edit_name;

CString edit_phone;

CString edit_addr;

CString edit_age;



GetDlgItemText(IDC_EDIT_NAME, edit_name);

GetDlgItemText(IDC_EDIT_PHONE, edit_phone);

GetDlgItemText(IDC_EDIT_ADDR, edit_addr);

GetDlgItemText(IDC_EDIT_AGE, edit_age);


CDBPropSet propset(DBPROPSET_ROWSET);

propset.AddProperty(DBPROP_IRowsetChange, true);

propset.AddProperty(DBPROP_UPDATABILITY,

DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);


HRESULT hr = Cmd.Open(m_pSet->m_session, _T("SELECT * FROM carnumber_mfc"), &propset);


if (FAILED(hr))

{

AfxMessageBox(_T("ERROR: Failed to execute SQL!"));

}


TCHAR* pszValue = NULL;

Cmd.SetStatus(1, DBSTATUS_S_IGNORE);


pszValue = (TCHAR*)Cmd.GetValue(2);

wsprintf(pszValue, _T("%s"), edit_name);

Cmd.SetLength(2, lstrlen(pszValue) * 2);

Cmd.SetStatus(2, DBSTATUS_S_OK);


pszValue = (TCHAR*)Cmd.GetValue(3);

wsprintf(pszValue, _T("%s"), edit_phone);

Cmd.SetLength(3, lstrlen(pszValue) * 2);

Cmd.SetStatus(3, DBSTATUS_S_OK);


pszValue = (TCHAR*)Cmd.GetValue(4);

wsprintf(pszValue, _T("%s"), edit_addr);

Cmd.SetLength(4, lstrlen(pszValue) * 2);

Cmd.SetStatus(4, DBSTATUS_S_OK);


ULONG* plAge = (ULONG*)Cmd.GetValue(5);

*plAge = _wtoi(edit_age);

Cmd.SetLength(5, sizeof(ULONG));

Cmd.SetStatus(5, DBSTATUS_S_OK);


hr = Cmd.Insert();


if (FAILED(hr))

{

AfxMessageBox(_T("ERROR: Failed to Insert new record!"));

}


Cmd.Close();

Cmd.ReleaseCommand();


if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();

m_pSet->RunSQL(_T("SELECT * FROM carnumber_mfc"));

ListupAllRecords();

}



[새 레코드 저장하기 ] - 2단계 직접 쿼리문쓰기

void CSB_DBmfcView::OnBnClickedButtonAddnew()

{

// TODO: Add your control notification handler code here


CCommand<CDynamicAccessor> Cmd;



//텍스트 박스에서 읽어오기

CString edit_name;

CString edit_phone;

CString edit_addr;

CString edit_age;



GetDlgItemText(IDC_EDIT_NAME, edit_name);

GetDlgItemText(IDC_EDIT_PHONE, edit_phone);

GetDlgItemText(IDC_EDIT_ADDR, edit_addr);

GetDlgItemText(IDC_EDIT_AGE, edit_age);



CDBPropSet propset(DBPROPSET_ROWSET);

propset.AddProperty(DBPROP_IRowsetChange, true);

propset.AddProperty(DBPROP_UPDATABILITY,

DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);


HRESULT hr = Cmd.Open(m_pSet->m_session, _T("SELECT * FROM carnumber_mfc"), &propset);


if (FAILED(hr))

{

AfxMessageBox(_T("ERROR: Failed to execute SQL!"));

}


//ULONG plAge = _wtoi(edit_age);

CString query = _T("insert into carnumber_mfc(Name, PhoneNumber, Address, Age) values('") + edit_name + _T("', '") + edit_phone + _T("', '") + edit_addr + _T("', ") + edit_age+_T(")");

hr = Cmd.Open(m_pSet->m_session, query, &propset);

if (FAILED(hr))

{

AfxMessageBox(_T("ERROR: Failed to Insert new record!"));

}


Cmd.Close();

Cmd.ReleaseCommand();


if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();

m_pSet->RunSQL(_T("SELECT * FROM carnumber_mfc"));

ListupAllRecords();

}



단계 DB에는 datetime이 있다.

CREATE TABLE `carnumber_0716` (

  `no` int(11) NOT NULL AUTO_INCREMENT,

  `carnumber` varchar(20) DEFAULT NULL,

  `car_date` datetime DEFAULT NULL,

  `img_path` varchar(20) DEFAULT NULL,

  `img_name` varchar(20) DEFAULT NULL,

  PRIMARY KEY (`no`)

) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8;


[새 레코드 저장하기 ] - 3단계 .datetime형식에 insert하기

//새 레코드 넣기
void CMYSQLDB_20150723View::OnClickedButtonAddnew()
{
// TODO: Add your control notification handler code here
CCommand<CDynamicAccessor> Cmd;

CString edit_carnumber;
CString edit_date;
CString edit_imgpathAll; // edit browse control에서 선택한 이미지 전체 경로 읽기
CString img_path;
CString img_name;

GetDlgItemText(IDC_EDIT_CARNUMBER, edit_carnumber); // 입력한 차번호
GetDlgItemText(IDC_MFCEDITBROWSE, edit_imgpathAll); // 선택한 이미지의 전체 경로를 읽는다.
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);

HRESULT hr = Cmd.Open(m_pSet->m_session, _T("SELECT * FROM carnumber_0716"), &propset);

if (FAILED(hr))
{
AfxMessageBox(_T("ERROR: Failed to execute SQL!"));
}


int nYear = m_datepicker.GetYear();
int nMonth = m_datepicker.GetMonth();
int nDay = m_datepicker.GetDay();
int nHour = m_timepicker.GetHour();
int nMin = m_timepicker.GetMinute();
int nSec = m_timepicker.GetSecond();

COleDateTime t(nYear, nMonth, nDay, nHour, nMin, nSec);

CString datetime = t.Format(_T("%Y\-%m\-%d\'\'%H\:%M\:%S")); // %p <-am/pm
AfxMessageBox(datetime);

//mysql에서 '\'는 인식이 안되니까? '\\'이렇게 변경해줘야 한다.
int nCh = edit_imgpathAll.Replace(_T("\\"), _T("\\\\"));
TRACE2("Replaced %d : %s \r\n", nCh, edit_imgpathAll);
AfxMessageBox(edit_imgpathAll);

//현재시간으로 파일명 저장
CString time_string;
CTime now = CTime::GetCurrentTime();
time_string.Format(_T("%04d%02d%02d%02d%02d%02d"), now.GetYear(), now.GetMonth(),
now.GetDay(), now.GetHour(), now.GetMinute(), now.GetSecond());//불러올 떄 형식꼭붙이자
AfxMessageBox(time_string);

CString newPath = _T("C:\\Users\\yukyeong\\Desktop\\mysqldb_20150723\\copyimage\\");
CString newPathName = newPath + time_string+".jpg";
CString strMsg;
BOOL bSuccess = CopyFile(edit_imgpathAll, newPathName, TRUE);
if (!bSuccess){
strMsg.Format(_T("같은 이름의 파일이 존재합니다. 덮어쓰시겠습니까?"));
if (AfxMessageBox(strMsg, MB_OKCANCEL) == IDOK)
CopyFile(edit_imgpathAll, newPathName, FALSE);
else
return;
}
strMsg.Format(_T("파일복사에 성공했습니다."));
AfxMessageBox(strMsg);

///*이미지 경로 4번째 칼럼이 들어감*/
img_path = _T("\\\\copyimage\\\\");
CString query = _T("insert into carnumber_0716(carnumber,car_date,img_path, img_name) values('") + edit_carnumber + _T("','") + datetime + _T("', '") + img_path + _T("', '") + time_string +_T("')");//, car_date, img_path, img_name//, , '', ''
AfxMessageBox(query);
hr = Cmd.Open(m_pSet->m_session, query, &propset);
//hr = Cmd.Insert();
if (FAILED(hr))
{
AfxMessageBox(_T("ERROR: Failed to Insert new record!"));
}
Cmd.Close();
Cmd.ReleaseCommand();

if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716"));
ListupAllRecords();
}





mfc 이미지 복사하기

현재 날짜 시간 얻어오기


+ datetimepicker 값 갱신하기. 이제 추가해야함.


1.

UpdateData();

UpdateData(false); //이건 values형에서만 되는 건가보다.

UpdateData(TRUE) : Value형 변수에 사용자가 선택한 값을 넣어 준다

UpdateData(FALSE) : Value형 변수의 내용을 화면에 보여 준다.


2.

Format은 COleDateTime 에서 CString형식으로 변환할때 사용



3.

mysql 에서 오전 오후라는 값이 들어갈땐 insert가 안된다.

24시간 형식으로 보여줘야 할듯.(넘겨줘야할듯)



4.

CString datetime = t.Format(_T("%Y-%m-%d %p %H:%M:%S")); // %p <-am/pm

%H     Hour in 24-hour format (00 – 23) 

%Y-%m-%d %H:%M:%S 이렇게 하면 24시간으로 나옴. 

http://zero-one-space.blogspot.kr/2012/03/cfile-class.html

http://myblue0324.tistory.com/28


5.

'this : has a colon'

mysql insert colon






반응형