2010/11/01

Firebird C API 로 Firebird Embedded 사용하기

Firebird Embedded 패키기에서 아래 파일을 프로젝트 폴더에 복사를 한다.



  • fbembed.dll

  • firebird.conf

  • firebird.msg

  • ib_util.dll

  • icudt30.dll

  • icuin30.dll

  • icuuc30.dll


fbembed.dll 을 fbclient.dll 로 이름을 바꾸고 일반적인 Firebird 를 사용하듯 하면 된다.






아래 코드는 테스트를 위한 코드이다.




isc_db_handle        db = NULL;        /* database handle */
isc_tr_handle trans = NULL; /* transaction handle */
ISC_STATUS_ARRAY status; /* status vector */
long sqlcode; /* SQLCODE */

char *szDBName = "e:\ est.fdb";

// 데이터베이스 생성 DDL
std::string strQuery = "CREATE DATABASE 'e:\ est.fdb' USER 'sysdba' PASSWORD 'masterkey';";

// 데이터베이스 생성 시도
isc_dsql_execute_immediate(status, &db, &trans, 0, strQuery.c_str(), 1, NULL);

if ( status[0] == 1 && status[1] > 0 )
{
sqlcode = isc_sqlcode(status);

char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
char szMsg2[512];
ISC_STATUS* pStatus = status;
isc_interprete( szMsg2, &pStatus );
TRACE( "Fail to create database : %d - %s (%s)\n", sqlcode, szMsg, szMsg2 );

if ( sqlcode == -902 )
{
TRACE( "Database exists!!\n" );
}
else
{
return;
}
}
else
{
TRACE( "Database created!!!\n" );
}

isc_detach_database( status, &db );

char *dpb_buffer = 0; // Database Parameter Buffer
short dpb_length = 0;

// Set parameter User Name and Password
/*
isc_expand_dpb( &dpb_buffer, &dpb_length
, isc_dpb_num_buffers, 80
, isc_dpb_user_name, "sysdba"
, isc_dpb_password, "masterkey"
, isc_dpb_connect_timeout, 180
);
//*/

// 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" );
strDPB.append( 1, isc_dpb_num_buffers );
strDPB.append( 1, (char)1 );
strDPB.append( 1, (char)90 );
strDPB.append( 1, isc_dpb_connect_timeout );
strDPB.append( 1, (char)4 );
strDPB.append( 1, (char)180 );
strDPB.append( 1, (char)(180 >> 8) );
strDPB.append( 1, (char)(180 >> 16) );
strDPB.append( 1, (char)(180 >> 24) );

int nParam = (int)strDPB.length();

// 데이터베이스 연결
//isc_attach_database( status, (int)strlen( szDBName ), szDBName, &db, dpb_length, dpb_buffer );
isc_attach_database( status, (int)strlen( szDBName ), szDBName, &db,
(short)strDPB.length(), strDPB.c_str() );

if ( status[0] == 1 && status[1] > 0 )
{
// Error occurred
sqlcode = isc_sqlcode( status );

char szMsg[512];
isc_sql_interprete( (short)sqlcode, szMsg, 512 );
TRACE( "Fail to connect Database : %d - %s\n", sqlcode, szMsg );
return;
}
else
{
TRACE( "Database connected!!\n" );
}

isc_start_transaction( status, &trans, 1, &db, 0, NULL );

// 테이블 생성
isc_dsql_execute_immediate( status, &db, &trans, 0,
"CREATE TABLE member ( name VARCHAR(20), age INTEGER )", 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 );
TRACE( "Fail to Create table : %d - %s\n", sqlcode, szMsg );

isc_rollback_transaction( status, &trans );

// Release parameter buffer
isc_free( dpb_buffer );

isc_detach_database( status, &db );

return;
}
else
{
TRACE( "Table created!!\n" );
}

isc_commit_transaction( status, &trans );

// Release parameter buffer
isc_free( dpb_buffer );

isc_detach_database( status, &db );
<

Original Post : http://neodreamer-dev.tistory.com/474