트랜잭션 거는 문제 때문에 삽질에 삽질 하다가.. 대충이라도 정리..
참고 페이지
#include <stdlib.h>
CDataSource mDataSource;
CSession mSession;
CDBPropSet DBInit(DBPROPSET_DBINIT);
HRESULT hr;
IString Conn; // IString 은 그냥 CString / char로 만들어서 쓰면 됨.
hr = CoInitialize(0);
if(FAILED(hr))
{
AfxMessageBox("CoInitialize 실패");
return false;
}
Conn.Format("PROVIDER=SQLOLEDB;SERVER=[ServerIP | ServerName];UID=[Logid ID];PWD=[PassWord];DATABASE=[DBName]");
DBInit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
DBInit.AddProperty(DBPROP_INIT_PROVIDERSTRING, Conn.ToChar());
DBInit.AddProperty(DBPROP_INIT_LCID, (long)1043);
hr = mDataSource.Open(_T("SQLOLEDB"), &DBInit);
if(FAILED(hr))
{
AddMessage(NSS_E_DB_CONN, "Can't Connect Database");
return false;
}
hr = mSession.Open(mDataSource);
if(FAILED(hr))
{
AddMessage(NSS_E_DB_OPEN_SESSION, "Can't Open Session");
return false;
}
//==================================================================================================
// 실제 소스에서 위 / 아래는 각각 함수로 만들어져서 따로 분리 되어 있으나.. 설명을 위해 하나의 소스에 적음
//==================================================================================================
CCommand<CDynamicAccessor, CRowset, CNoMultipleResults> Cmd;
HRESULT hr;
IString SQLComm, UserID;
int iError;
short sCount;
rReadPacketStream.ReadString(UserID);
sCount = rReadPacketStream.ReadShort();
mSession.StartTransaction(ISOLATIONLEVEL_READCOMMITTED, 0, NULL, NULL); // StartTransaction 으로 트랜잭션을 건다.
for(int i = 0; i < sCount; i++)
{
IString Name;
rReadPacketStream.ReadString(Name);
try
{
SQLComm.Format2(1024,"EXEC dbo.BB_SET_ADD_DATA '%s'", Name.ToChar());
hr = Cmd.Open(mSession, SQLComm.ToChar());
if(FAILED(hr))
{
iError = NSS_E_SQL_INSERT;
throw "AddPticher : SQL Insert Failed";
}
}
catch(char *cpErr)
{
mSession.Abort(NULL, FALSE, FALSE); // sCount 만큼 인서트를 진행하다가.. 한번이라도 오류가 나면 Abort 실행(롤백)
if(strlen(cpErr) > 0) AddMessage(iError, cpErr);
Cmd.Close();
return iError;
}
}
mSession.Commit(FALSE, XACTTC_SYNC, 0); // 전부 정상적으로 실행 되면 Commit
Cmd.Close();
return true;
}
여기서 중요한건 역시나 StartTransaction , Abort , Commit
프로시져에는 SET XACT_ABORT ON 을 꼭 적어주자..
'프로그래밍 > C++ / C' 카테고리의 다른 글
[c++] CHttpConnection에서 한글 전송 시 null 문제 (0) | 2011.01.13 |
---|---|
[C++/C] 중복되지 않게 랜덤 숫자 출력 (0) | 2010.07.08 |