FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird Q&A
[3616] Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기
안명호.ASURADA [asurada] 2563 읽음    2010-12-27 16:09
답변 감사합니다.
아래 코드가 제가 테스트한 코드 입니다. 공부하면서 이것 저것 해서 좀 지저분 합니다.

중간 부 이후의 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를 안해주신거 아닌가요?

+ -

관련 글 리스트
3612 [Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 안명호.ASURADA 2338 2010/12/25
3615     Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 멀고도험한길 2194 2010/12/27
3616         Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 안명호.ASURADA 2563 2010/12/27
3617             Re:Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 멀고도험한길 2236 2010/12/27
3622                 Re:Re:Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 안명호.ASURADA 2417 2010/12/30
3618                 Re:Re:Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 안명호.ASURADA 2319 2010/12/27
3613     Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 멀고도험한길 9951 2010/12/27
3614         Re:Re:[Q] C API 를 이용하여 업데이트 질의 문 수행 후 반영된 레코드 수 알아오기 안명호.ASURADA 2341 2010/12/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.