공부해요/C

MFC OLEDB CRUD MYSQL

예쁜꽃이피었으면 2015. 7. 30. 12:08

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();

}






2. List  Control에서 아이템 클릭했을 때

void CMYSQLDB_20150723View::OnClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
//xxx.SetExtendedStyle(LVS_EX_FULLROWSELECT); 이거쓰면 줄 전체가 표시됨.
int index = 0;
// 0이었는데 0자리에 no를 추가하고 숨겨뒀음. 그래서 1로함. 1은 carnumber
// 아닌듯 SetExtendedStyle 이거 덕분에 선택된듯.
index = pNMItemActivate->iItem;
//항목을 선택시 줄 전체가 선택
m_List.SetExtendedStyle(m_List.GetExtendedStyle() | LVS_EX_FULLROWSELECT);

if (index >= 0 && index < m_List.GetItemCount())
{
// 여기서 index값으로 받아오면 됩니다.
CString no = m_List.GetItemText(index, 0);//no
CString carnumber = m_List.GetItemText(index, 1); // carnumber
CString date = m_List.GetItemText(index, 2); //date
CString imagename = m_List.GetItemText(index, 4); //
CString saveimagpath = _T("C:\\Users\\이미지를 복사해 저장할 주소\\copyimage\\") + imagename + _T(".jpg");

//이 부분은 수정해야함. 데이트타입피커의 수정된 값을 가져오지 못하고 있음
int nYear = _wtoi(date.Mid(0, 4));
int nMonth = _wtoi(date.Mid(5, 2));
int nDay = _wtoi(date.Mid(8, 2));
CString nHour = date.Mid(14, 2);
CString nMin = date.Mid(17, 2);
CString nSec = date.Mid(20, 2);

//이전 값 지우기
m_hidden_carnum.SetWindowText(_T(""));//no숨김값
edit_choose_carnumber.SetWindowText(_T(""));
edit_choose_date.SetWindowText(_T(""));
edit_choose_mfceditbrowse.SetWindowText(_T(""));

//listcontrol에서 선택한 값 보여주기
m_hidden_carnum.ReplaceSel(no);
edit_choose_carnumber.ReplaceSel(carnumber);
edit_choose_date.ReplaceSel(date);
edit_choose_mfceditbrowse.ReplaceSel(saveimagpath);
}
*pResult = 0;
}


3. List  Control 데이터 전체보기
void CMYSQLDB_20150723View::OnBnClickedtotaldata()
{    
CCommand<CDynamicAccessor> Cmd;
if (m_List.GetItemCount() > 0) m_List.DeleteAllItems();
m_pSet->RunSQL(_T("SELECT * FROM carnumber_0716 "));
ListupAllRecords();
}




4. 검색버튼 


void CMYSQLDB_20150723View::OnClickedSearch()

{



CCommand<CDynamicAccessor> Cmd;

//http://ewst.tistory.com/6


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

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);











리스트 컨트롤에서 선택한 아이템 보여주기 


https://social.msdn.microsoft.com/Forums/ko-KR/ad5bd0a4-adae-4f7d-8349-536d489f8965/mfc-image-?forum=visualcplusko


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();






반응형