MFC , VS2013 , mysql , oleDB ,COleDateTime ,date Time Picker , Datetime
1. MFC List Control Column 설정
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716")); //전체 데이터를 읽어온 후
if (m_List.GetHeaderCtrl()->GetItemCount() <= 0){ //와 ..m_List 반드시 리포트 타입으로!!!
m_List.InsertColumn(0, _T("no"), LVCFMT_LEFT, 0);
m_List.InsertColumn(1, _T("carnumber"), LVCFMT_LEFT, 90);
m_List.InsertColumn(2, _T("date"), LVCFMT_LEFT, 180);
m_List.InsertColumn(3, _T("path"), LVCFMT_LEFT, 160);
m_List.InsertColumn(4, _T("name"), LVCFMT_LEFT, 180);
}
// 칼럼명을 주고 비율을 나눠준다 .
//no의 경우 처음에 필요하지 않아서 넣지 않았었는데 수정을 할 때 필요해서 다시 db에서 가져왔다.
//그러나 보여줄 필요는 없다고 생각되서 가로길이를 0으로 주고 숨겼다.
ListupAllRecords(); //각 컬럼에 해당하는 db값을 가져와서 넣어준다.
void CMYSQLDB_20150723View::ListupAllRecords(void)
{
CString strTmp = _T("");
m_pSet->MoveFirst();
do
{
//datetime을 cstring으로 바꿔서 리스트컨트롤 안에 넣는다.
COleDateTime codt(m_pSet->m_car_date);
CString str = codt.Format();
//int형을 cstring으로 바꿔서 리스트컨트롤 안에 넣는다.
int nNum = m_pSet->m_no;
CString strNum;
strNum.Format(_T("%d"), nNum);
m_List.InsertItem(0, strNum, 1);
m_List.SetItemText(0, 1, m_pSet->m_carnumber);
m_List.SetItemText(0, 2, str);
m_List.SetItemText(0, 3, m_pSet->m_img_path);
m_List.SetItemText(0, 4, m_pSet->m_img_name);
} while (m_pSet->MoveNext() != DB_S_ENDOFROWSET);
m_pSet->MoveFirst();
}
void CMYSQLDB_20150723View::OnClickedSearch()
{
CCommand<CDynamicAccessor> Cmd;
//텍스트 박스에서 읽어오기
CString edit_search;
CString combowhere;
GetDlgItemText(IDC_seach, edit_search);
int nIndex = m_strCombo.GetCurSel();
AfxMessageBox(nIndex);
if (CB_ERR == nIndex)
{
m_strCombo.EnableWindow(FALSE);
return;
}
CString sStartEvt = _T("");
m_strCombo.GetLBText(nIndex, sStartEvt);
AfxMessageBox(sStartEvt);
if (sStartEvt == "차번호")
combowhere = _T("carnumber");
else if (sStartEvt == "사진이름")
combowhere = _T("img_name");
if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716 WHERE ") + combowhere + _T("= '") + edit_search + _T("'"));
ListupAllRecords();
}
4. 저장버튼
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
// '\'는 인식이 안되니까? '\\'이렇게 변경해줘야 한다.
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\\경로\\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);
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();
}
5. 삭제버튼
void CMYSQLDB_20150723View::OnClickedButtonDelete()
{
CCommand<CDynamicAccessor> Cmd;
CString edit_choose_carnumber;
CString edit_choose_date;
CString edit_imgpathAll;
GetDlgItemText(IDC_choose_carnumber, edit_choose_carnumber);
GetDlgItemText(IDC_choose_date, edit_choose_date);
GetDlgItemText(IDC_choose_MFCEDITBROWSE2, 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 WHERE carnumber = '") + edit_choose_carnumber + _T("'"),
&propset);
if (FAILED(hr))
{
AfxMessageBox(_T("ERROR: Failed to execute SQL!"));
}
Cmd.MoveFirst();
CString query = _T("delete from carnumber_0716 where carnumber = '") + edit_choose_carnumber + _T("'");
AfxMessageBox(query);
hr = Cmd.Open(m_pSet->m_session, query ,&propset);
if (FAILED(hr))
{
AfxMessageBox(_T("ERROR: Failed to modify record!"));
}
Cmd.Close();
Cmd.ReleaseCommand();
//http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=236515&ref=236502
GetDlgItem(IDC_choose_carnumber)->SetWindowText(_T(""));
GetDlgItem(IDC_choose_date)->SetWindowText(_T(""));
GetDlgItem(IDC_choose_MFCEDITBROWSE2)->SetWindowText(_T(""));
if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716"));
ListupAllRecords();
}
6. 수정버튼
void CMYSQLDB_20150723View::OnClickedButtonModify()
{
CCommand<CDynamicAccessor> Cmd;
CString edit_choose_carnumber;
CString edit_choose_date;
CString edit_imgpathAll; // edit browse control에서 선택한 이미지 전체 경로 읽기
CString img_path;
CString img_name;
CString m_hidden_no;
GetDlgItemText(IDC_hidden_carnum, m_hidden_no);
GetDlgItemText(IDC_choose_carnumber, edit_choose_carnumber);
GetDlgItemText(IDC_choose_MFCEDITBROWSE2, 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 WHERE carnumber = '") + edit_choose_carnumber + _T("'"),
&propset);
if (FAILED(hr))
{
AfxMessageBox(_T("ERROR: Failed to execute SQL!"));
}
Cmd.MoveFirst();
//날짜 수정할 수 있게 코드 다시봐야함.
int nYear = m_choose_datepicker.GetYear();
int nMonth = m_choose_datepicker.GetMonth();
int nDay = m_choose_datepicker.GetDay();
int nHour = m_choose_timepicker.GetHour();
int nMin = m_choose_timepicker.GetMinute();
int nSec = m_choose_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);
//현재시간으로 파일명 저장
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());
// m_hidden_no 는 처음에 데이터는 읽어왔지만 숨겨뒀던 값이다.
// 수정을 하기 위해서 기준이 되는 where절이 있어야 해서 id값을 가져왔다.
CString query = _T("update carnumber_0716 set carnumber = '") + edit_choose_carnumber + _T("', car_date = '") + datetime+_T("', img_name = '") + time_string + _T("' where no = ") + m_hidden_no ;
AfxMessageBox(query);
hr = Cmd.Open(m_pSet->m_session, query, &propset);
if (FAILED(hr)){
AfxMessageBox(_T("ERROR : Failed to modify record"));
}
Cmd.Close();
Cmd.ReleaseCommand();
if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716"));
ListupAllRecords();
}
별생각없이 소스를 보고 있는데 밑에 있는 부분이 눈에 띄었다.
입력된 날짜와 시간을 저장해야 하는데 소스에 현재시간을 가져오도록 자동으로 되어있던 것이다.
기존에
m_datepicker(COleDateTime::GetCurrentTime())
이렇게 되어있던 것을
m_datepicker()
이렇게 수정했더니 처음 보여줄때는 현재 시간이지만 db에 저장을 할때는 현재시간이 아니었다.
1899-12-30 오전 12:00:00 (Hex값으로 0000 0000 0000 0000 이라고 한다.그냥 별 의미없는 기본값이란 얘기인가.)
이렇게 들어가는데..뭘까. 입력한 시간 받아오는 법 찾아야 한다.
// CMYSQLDB_20150723View 생성/소멸
CMYSQLDB_20150723View::CMYSQLDB_20150723View()
: COleDBRecordView(CMYSQLDB_20150723View::IDD)
, m_datepicker()//COleDateTime::GetCurrentTime()
, m_timepicker()//COleDateTime::GetCurrentTime()
, m_choose_datepicker()//COleDateTime::GetCurrentTime()
, m_choose_timepicker()//COleDateTime::GetCurrentTime()
, m_strCombo()//_T("")
{
m_pSet = NULL;
// TODO: 여기에 생성 코드를 추가합니다.
}
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=407410&ref=407407
10년도 더 된 글에서 답을 찾았다..
CDateTimeCtrl* pCtrl = (CDateTimeCtrl*) GetDlgItem(IDC_DATETIMEPICKER1);
CDateTimeCtrl* pCtrl2 = (CDateTimeCtrl*) GetDlgItem(IDC_DATETIMEPICKER2);
// Get a CTime
CTime timeTime, timetime2;
DWORD dwResult = pCtrl->GetTime(timeTime);
DWORD dwResult2 = pCtrl2->GetTime(timetime2);
if (dwResult == GDT_VALID)
{
CString m_data, m_time;
m_date.Format(L"%d/%d/%d", timeTime.GetMonth(), timeTime.GetDay(), timeTime.GetYear());
m_time.Format(L"%d:%d", timetime2.GetHour(), timetime2.GetMinute());
}
CDateTimeCtrl* pCtrl1 = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);
CDateTimeCtrl* pCtrl2 = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER2);
// Get a CTime
CTime timeTime1, timetime2;
DWORD dwResult1 = pCtrl1->GetTime(timeTime1);
DWORD dwResult2 = pCtrl2->GetTime(timetime2);
CString m_data1, m_time2;
if (dwResult1 == GDT_VALID)
{
m_data1.Format(L"%d/%d/%d", timeTime1.GetYear(),timeTime1.GetDay(),timeTime1.GetMonth());
m_time2.Format(L"%d:%d:%d", timetime2.GetHour(), timetime2.GetMinute(), timetime2.GetSecond());
}
AfxMessageBox(m_data1);
AfxMessageBox(m_time2);
CString datetime = m_data1 + _T("\'\'") + m_time2;
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);
리스트 컨트롤에서 선택한 아이템 보여주기
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=897967&ref=897967
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=886642&ref=886633
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=37849&ref=37847
//image_view
CWnd *pWnd = (CWnd*)GetDlgItem(IDC_STATIC_BPM);
CDC *dc = pWnd->GetDC();
CImage Image;
Image.Load(_T("C:\\Users\\yukyeong\\Desktop\\mysqldb_20150723\\copyimage\\") + imagename + _T(".jpg"));
//CImage객체에 이미지 로드
CDC *pDC = CDC::FromHandle(Image.GetDC()); //로드한 이미지에 대한 CDC객체 생성
dc->SetStretchBltMode(HALFTONE);
Image.StretchBlt(dc->m_hDC, 0, 0,400, 400);
Image.ReleaseDC();
'공부해요 > C' 카테고리의 다른 글
[TD 2015] 알아두면 핵 이득! VC++로 안드로이드 개발하기 (0) | 2016.02.15 |
---|---|
[ c++ 더쉽게,더깊게 ] ch3 . 변수로 사용자와 소통하기 ~p59 (0) | 2014.08.21 |
[ c++ 더쉽게,더깊게 ] ch2 . c++의 기초 ~ p33 (0) | 2014.08.21 |
[ c++ 더쉽게,더깊게 ] Debug uses an invalid compiler. Probably the toolchain path within... (0) | 2014.08.20 |
[ 열혈강의 C언어본색 ] Part2 제3장 포인터란 무엇인가 (0) | 2014.08.14 |