답변 감사합니다.
아래 코드가 제가 테스트한 코드 입니다. 공부하면서 이것 저것 해서 좀 지저분 합니다.
중간 부 이후의 Update 실행하는 부분 입니다.
이 부분 말고도 문제가 되는 부분이 있으면 지적 또는 조언을 참지 말아 주시기 바랍니다.
감사합니다.
ClearResult();
AppendResult( _T("Try to attach database!!") );
isc_db_handle db = 0L; /* database handle */
isc_tr_handle trans = NULL; /* transaction handle */
isc_stmt_handle stmt = NULL; /* statement handle */
char szDBName[ MAX_PATH ] = "E:\\TEST.FDB";
ISC_STATUS_ARRAY status;
ISC_LONG sqlcode;
// Database Parameter Block (DPB) 준비
std::string strDPB;
strDPB.append( 1, isc_dpb_version1 ); // DPB 버전
strDPB.append( 1, isc_dpb_user_name ); // User Account
strDPB.append( 1, (char)strlen("sysdba") );
strDPB.append( "sysdba" );
strDPB.append( 1, isc_dpb_password ); // Password
strDPB.append( 1, (char)strlen("masterkey") );
strDPB.append( "masterkey" );
// Database connect
if ( isc_attach_database( status, 0, szDBName, &db, (short)strDPB.length(), strDPB.c_str() ) )
{
AppendResult( _T("Fail to attach database!!") );
return;
}
// Start Transaction
isc_start_transaction( status, &trans, 1, &db, 0, NULL );
// Execute query
char szQuery[1024];
// Create Table
sprintf_s( szQuery, 1024,
"CREATE TABLE employee ("
" name VARCHAR(20) "
", birth INTEGER"
", enter TIMESTAMP"
")");
isc_dsql_execute_immediate( status, &db, &trans, strlen(szQuery), szQuery, 1, NULL );
isc_commit_transaction( status, &trans );
if ( status[0] == 1 && status[ 1 ] > 0 )
{
// Error occurred
sqlcode = isc_sqlcode( status );
char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
CString strMsg;
strMsg.Format( _T("Fail to Create Table : %d - %s"), sqlcode, CString( szMsg ) );
AppendResult( strMsg );
}
else
{
AppendResult( _T("Table Creaded.") );
}
// Insert Data
isc_start_transaction( status, &trans, 1, &db, 0, NULL );
AppendResult( _T("Insertion!!") );
for ( int i = 0; i < 5; ++i )
{
sprintf_s( szQuery, 1024,
"INSERT INTO employee ( name, birth, enter ) VALUES ( 'name%d', %d, CURRENT_TIMESTAMP )"
, i, 20 + i
);
isc_dsql_execute_immediate( status, &db, &trans, strlen(szQuery), szQuery, 1, NULL );
if ( status[0] == 1 && status[ 1 ] > 0 )
{
// Error occurred
sqlcode = isc_sqlcode( status );
char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
CString strMsg;
strMsg.Format( _T("Fail to Insert : %d - %s"), sqlcode, CString( szMsg ) );
AppendResult( strMsg );
}
else
{
AppendResult( _T("1 Row Inserted.") );
}
}
// Update Data
// Statement allocation
isc_dsql_allocate_statement( status, &db, &stmt );
AppendResult( _T("Update!!") );
sprintf_s( szQuery, 1024, "UPDATE employee SET birth = birth + 2 WHERE birth > 22");
isc_dsql_prepare( status, &trans, &stmt, 0, szQuery, 0, NULL );
isc_dsql_execute( status, &trans, &stmt, 0, NULL );
isc_commit_transaction( status, &trans );
if ( status[ 0 ] == 1 && status[ 1 ] > 0 )
{
// Error occurred
sqlcode = isc_sqlcode( status );
char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
CString strMsg;
strMsg.Format( _T("Fail to Update : %d - %s"), sqlcode, CString( szMsg ) );
AppendResult( strMsg );
}
else
{
int del_count = 0, ins_count = 0, upd_count = 0, sel_count = 0;
static char const info_count[] = { isc_info_sql_records };
char result[64];
int ret = 0;
isc_dsql_sql_info( status, &stmt, sizeof(info_count), info_count, sizeof(result), result );
if ( status[ 0 ] == 1 && status[ 1 ] > 0 )
{
// Error occurred
sqlcode = isc_sqlcode( status );
char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
CString strMsg;
strMsg.Format( _T("Fail to isc_dsql_sql_info : %d - %s"), sqlcode, CString( szMsg ) );
AppendResult( strMsg );
}
else
{
char* pCur = result;
int length;
if ( *pCur == isc_info_sql_records )
{
pCur++;
length = isc_vax_integer(pCur, 2); /* normally 29 bytes */
pCur += 2;
while(*pCur != 1)
{
switch(*pCur)
{
case isc_info_req_select_count:
pCur++;
length = isc_vax_integer(pCur, 2);
pCur += 2;
sel_count = isc_vax_integer(pCur, length);
pCur += length;
break;
case isc_info_req_insert_count:
pCur++;
length = isc_vax_integer(pCur, 2);
pCur += 2;
ins_count = isc_vax_integer(pCur, length);
pCur += length;
break;
case isc_info_req_update_count:
pCur++;
length = isc_vax_integer(pCur, 2);
pCur += 2;
upd_count = isc_vax_integer(pCur, length);
pCur += length;
break;
case isc_info_req_delete_count:
pCur++;
length = isc_vax_integer(pCur, 2);
pCur += 2;
del_count = isc_vax_integer(pCur, length);
pCur += length;
break;
default:
pCur++;
break;
}
}
CString strMsg;
strMsg.Format( _T("%d Row(s) Updated"), upd_count );
AppendResult( strMsg );
}
}
}
isc_dsql_free_statement( status, &stmt, DSQL_close );
// Drop Table
AppendResult( _T("Drop Table!!") );
sprintf_s( szQuery, 1024, "DROP TABLE employee");
isc_dsql_execute_immediate( status, &db, &trans, strlen(szQuery), szQuery, 1, NULL );
// Commit Transaction
isc_commit_transaction( status, &trans );
// Database disconnect
isc_detach_database( status, &db );
AppendResult( _T("Database detached!!") );
AppendResult( _T("Finished!!") );
멀고도험한길 님이 쓰신 글 :
: 언제 질문하신 함수를 실행하셨나요?
:
: 처리 순서는
: 1.트랜잭션 시작
: 2. PrepareStatement
: 3. isc_dsql_sql_info 함수실행(isc_info_sql_stmt_type) 을 알고난다음
: 4. isc_dsql_sql_info 함수실행( isc_info_sql_records )
: 결과에 따라 제가답변한 값 읽으시면 정상작인데요...
: 5. FreeStatement( stmt핸들 free)
: 6.트랜잭션 종료.
:
: FreeStatement를 안해주신거 아닌가요?