통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34036 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 질문&답변 ※ 꼭 답변채택을 해주시어 성의껏 답변해주신 회원님께 감사의 마음을 전하시길 바랍니다.
 MFC와 MS-SQL , ole-db 연동 질문입니다 (INSERT, UPDATE)  | VC++ 일반 2013-10-27 오후 6:57:47
KINGk 번호: 922233 추천:0  / 읽음:3,214

안녕하세요.

Ms-sql 과 MFC를 ole-db 를 이용해 연동했습니다.

select문 같은경우에는 아주 잘 작동합니다.

 

class CAdminDataSelectAccssor : public CAdminDataAccessor
{
public:
DEFINE_COMMAND_EX(CAdminDataSelectAccssor, L" \
  SELECT *\
  FROM dbo.TB_USER")
 
 
BEGIN_COLUMN_MAP(CAdminDataSelectAccssor)
  COLUMN_ENTRY_LENGTH_STATUS(1, m_ID, m_dwIDLength, m_dwIDStatus)
  COLUMN_ENTRY_LENGTH_STATUS(2, m_PWD, m_dwPWDLength, m_dwPWDStatus)
END_COLUMN_MAP()
};
 
이렇게 TB_USER에 있는 값을 모두가져와서
해당 클래스 객체를 생성해서 객체내 변수로 DB안에 있는 값들을 가져오는건 성공했습니다.
 
근데 문제는 INSERT와 UPDATE 입니다.
가변인자가 들어가야되기 때문에 
 
class CAdminDataInsertAccssor : public CAdminDataAccessor
{
public:
DEFINE_COMMAND_EX(CAdminDataInsertAccssor , L" \
INSERT INTO dbo.TB_USER(ID,PWD) VALUES(?,?)")
 
BEGIN_PARAM_MAP(CAdminDataInsertAccssor)
COLUMN_ENTRY(1, m_ID)
COLUMN_ENTRY(2, m_PWD)
END_PARAM_MAP()
};
 
이렇게 해주었는데요.
저 Values 안에 ? 이 부분이 가변적으로 값이 들어와야합니다.
 
cpp 파일 내에서 어떻게 처리를 해줘야 할까요??
 
똑같이 객체 만들고 해당 변수 값을 초기화 해주려고 하니까 초기화도 안되네요.
답변 부탁드릴께요!

 

이 글에 답변 등록하기
 [답변][답변] 2013-10-27 오후 9:39:26
 kilojuliet  kilojuliet님께 메시지 보내기kilojuliet님을 내 주소록에 추가합니다.kilojuliet님의 개인게시판 가기 번호: 922238 추천:0  

아래 링크 자료 참고해서 구현해보세요.

 

http://blog.naver.com/PostView.nhn?blogId=chrisnor&logNo=140068335178

이 글에 답변 등록하기
 [답변]저도 테스트한것을 적어 봅니다. 2013-10-28 오후 2:50:15
 shintx  shintx님께 메시지 보내기shintx님을 내 주소록에 추가합니다.shintx님의 개인게시판 가기 번호: 922326 추천:0  

하긴 했는데. INSERT 하면. DB 데이터 문자열 끝에 32와 0x00이 붙습니다.

정확한 처리 방법을 모르겠네요. ㅇ_ㅇ;; 저는 그냥 불러서 뒷자리만 지우는 방식을 취했습니다.

 

기능은 구현 되지만. 정확한건 아닙니다. 정확한건. 이거 만든 사람에게 문의해보세요.

 

------------------------------------------------------------------------------------

//SDKTEST.h 헤더 내용

//접속

hr = _db.OpenFromInitializationString(OLESTR("PROVIDER=SQLOLEDB;SERVER=SHINT-NOTEBOOK\\SQLEXPRESS;UID=sa;PWD=1;DATABASE=OLEDB")); 

 

//커맨드 선언 : 필요시 둘중 하나만 적으셔도 됩니다

DEFINE_COMMAND_EX(CSDKTESTAccessor, L"INSERT INTO dbo.SDKTEST(Book_Author,Book_Title) VALUES(?,?)")

 

//인자값 맵 : 둘중 하나만 적을 경우. 첫번째 숫자는 항상 1입니다.

BEGIN_PARAM_MAP(CSDKTESTAccessor)
COLUMN_ENTRY(1, m_Book_Author)
COLUMN_ENTRY(2, m_Book_Title)
END_PARAM_MAP()
 
 
//INSERT에서 이 코드를 사용하면 오류 납니다
//BEGIN_COLUMN_MAP(CSDKTESTAccessor)
// COLUMN_ENTRY_LENGTH_STATUS(1, m_Book_Author, m_dwBook_AuthorLength, m_dwBook_AuthorStatus)
// COLUMN_ENTRY_LENGTH_STATUS(2, m_Book_Title, m_dwBook_TitleLength, m_dwBook_TitleStatus)
//END_COLUMN_MAP()
 
//템플릿으로 사용하는 경우. 클래스 위에. 이 코드를 입력해야 합니다.
//상속 받은 클래스이름이 템플릿에 들어갑니다.
template<class CSDKTESTAccessor>             // <---- 고정일 경우 주석 처리하셔야 합니다.
 
 
class CSDKTEST : public CCommand<CAccessor<CSDKTESTAccessor> >
 
------------------------------------------------------------------------------------
//고정 일 경우. 다이얼로그 등에 헤더를 선언하고 사용합니다.
//OLEDB03Dlg.h
 
#include "SDKTEST.h"
// CSDKTEST m_sdktest;
 
 
------------------------------------------------------------------------------------
//OLEDB03Dlg.cpp
 

//template 로 사용하는 방법

CSDKTEST<CSDKTESTAccessor> Insert;
 
UpdateData();
 
wcscpy( (wchar_t*)Insert.m_Book_Author, (const wchar_t *)"xxx");
Insert.m_dwBook_AuthorLength = wcslen( (const wchar_t *)"xxx") * 2;
Insert.m_dwBook_AuthorStatus = DBSTATUS_S_OK;
 
wcscpy( (wchar_t*)Insert.m_Book_Title, (const wchar_t *)"222");
Insert.m_dwBook_TitleLength = wcslen( (const wchar_t *)"222") * 2;
Insert.m_dwBook_TitleStatus = DBSTATUS_S_OK;
 
if(Insert.OpenAll() == S_OK)
{
}
Insert.CloseAll();
 
 
------------------------------------------------------------------------------------
//OLEDB03Dlg.cpp
 
 
//정적 변수 인스턴스로 사용하는 방법
CString str;
str.Format("%d", GetTickCount());
 
wcscpy( (wchar_t*)m_sdktest.m_Book_Author, (const wchar_t *) str.GetBuffer(str.GetLength()) );
m_sdktest.m_dwBook_AuthorLength = wcslen( (const wchar_t *) str.GetBuffer(str.GetLength()) ) * 2;
m_sdktest.m_dwBook_AuthorStatus = DBSTATUS_S_OK;
 
wcscpy( (wchar_t*)m_sdktest.m_Book_Title, (const wchar_t *) str.GetBuffer(str.GetLength()) );
m_sdktest.m_dwBook_TitleLength = wcslen( (const wchar_t *) str.GetBuffer(str.GetLength()) ) * 2;
m_sdktest.m_dwBook_TitleStatus = DBSTATUS_S_OK;
 
if(m_sdktest.OpenAll() == S_OK)
{
}
m_sdktest.CloseAll();
 
 
 
 
------------------------------------------------------------------------------------
//DELETE 로 삭제하는 방법
 
//SDKTEST_DELETE.h
DEFINE_COMMAND_EX(CSDKTEST_DELETEAccessor, L"DELETE FROM dbo.SDKTEST WHERE Book_Author = ?")
 
BEGIN_PARAM_MAP(CSDKTEST_DELETEAccessor)
COLUMN_ENTRY(1, m_Book_Author)
END_PARAM_MAP()
 
 
//OLEDB03Dlg.cpp
void COLEDB03Dlg::OnBnClickedButtonDelete()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
//정적 변수 인스턴스로 사용하는 방법
CString str;
 
//template 로 사용하는 방법
CSDKTEST_DELETE<CSDKTESTAccessor> Delete;
 
POSITION pos = m_ListData.GetFirstSelectedItemPosition();
int nItem = 0;
if( pos == NULL )
{
TRACE("선택한 리스트 항목이 없습니다.\n");
}
else
{
while(pos)
{
nItem = m_ListData.GetNextSelectedItem(pos);
TRACE("리스트 항목이 있습니다. : %d\n", nItem);
}
}
 
CString strAuthor = m_ListData.GetItemText(nItem, 0);
CString strTitle  = m_ListData.GetItemText(nItem, 1);
TRACE("이름 : "+ strAuthor + "\n");
TRACE("이름 : "+ strTitle  + "\n");
 
int i=0;
int len = strAuthor.GetLength();
for(i=len; i>=0; i--)
{
char c = strAuthor.GetAt(i);
if(c == 0x00 || c == ' ' || c == 0x20 || c == 32)
{
}
else
{
break;
}
}
strAuthor = strAuthor.Mid(0, i+1);
TRACE("이름 : "+ strAuthor + "\n");
 
str = strAuthor;
//wcscpy( (wchar_t*)Delete.m_Book_Author, (const wchar_t *) str.GetBuffer(str.GetLength()) );
//Delete.m_dwBook_AuthorLength = wcslen( (const wchar_t *) str.GetBuffer(str.GetLength()) ) * 2;
//Delete.m_dwBook_AuthorStatus = DBSTATUS_S_OK;
 
strcpy( (char*)Delete.m_Book_Author, (char*) str.GetBuffer(str.GetLength()) );
Delete.m_dwBook_AuthorLength = str.GetLength();
Delete.m_dwBook_AuthorStatus = DBSTATUS_S_OK;
 
if(Delete.OpenAll() == S_OK)
{
}
Delete.CloseAll();
}
이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.