テキスト広告:Amazon Primeday

金曜日, 6月 18, 2010

[C言語・C++]OCI(Oracle Call Interface)サンプル(接続プール版)

次のテーブルを使用した接続プールのサンプルを示す。

CREATE TABLE TEST_TBL (
"NO" NUMBER(3), /* 番号 */
"DT_NUMBER" NUMBER(12,2), /* NUMBER型 */
"DT_CHAR" CHAR(10), /* CHAR型 */
"DT_VARCHAR2" VARCHAR2(32), /* VARCHAR2型 */
"DT_DATE" DATE /* DATE型 */
)

①追加のインクルードディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\include

②追加のライブラリディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\lib\MSVC

③追加の依存ファイル
oci.lib kernel32.lib msvcrt.lib



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>

typedef struct _OCI_TIMESTAMP_STRUCT
{
short year;
unsigned short month;
unsigned short day;
unsigned short hour;
unsigned short minute;
unsigned short second;
unsigned long fraction;
} OCI_TIMESTAMP_STRUCT_T;

typedef OCI_TIMESTAMP_STRUCT_T OCI_TIME;

static text *database = (text *)"データベース名";
static text *username = (text *)"ユーザー名";
static text *password = (text *)"パスワード";

static OraText *poolName;
static sb4 poolNameLen;

//static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL WHERE NO = :NO";
static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL ORDER BY NO";

static OCIEnv *envhp;
static OCIError *errhp;
OCICPool *poolhp;

OCIThreadId *thrid[MAXTHREAD];
OCIThreadHandle *thrhp[MAXTHREAD];
static int employeeNum[MAXTHREAD];

static sword checkerr( OCIError *errhp, sword status );
static void cleanup(/*_ void _*/);

sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode );
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr );
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr );
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr );
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr );
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr );
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr );
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength );
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr );
sword threadFunction( dvoid *arg );
void threadFunctionEnd( OCISvcCtx *svchp, OCIError *errhp, OCIStmt *stmthp, sword status );


int main( int argc, char* argv[] )
{
sword ret = 0;
sword no = 1;
int i = 0;

ub4 connMin = 1; // 最小接続プール数(有効値:0以上)
ub4 connMax = 5; // 最大接続プール数(有効値:1以上)
ub4 connIncr = 1; // 増分接続プール数(有効値:0以上)

OCIBind *bndhp[1]; // バインド・ハンドル
OCIDefine *defhp[6]; // 定義ハンドル

memset( bndhp, 0x00, sizeof( bndhp ) );
memset( defhp, 0x00, sizeof( defhp ) );

//ret = OCIInitialize( (ub4)(OCI_THREADED | OCI_OBJECT), (dvoid *)0,
// ( dvoid * (*)(dvoid *, size_t) )0,
// ( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
// ( void (*)(dvoid *, dvoid *) )0 );
//if ( ret != OCI_SUCCESS ) {
// checkerr( NULL, ret );
// return ret;
//}

//ret = OCIEnvInit( (OCIEnv **)&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0 );
//if ( ret != OCI_SUCCESS ) {
// checkerr( NULL, ret );
// return ret;
//}

ret = OCIEnvCreate( (OCIEnv **)&envhp, (ub4)OCI_THREADED, (dvoid *)0,
( dvoid * (*)(dvoid *, size_t) )0,
( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
( void (*)(dvoid *, dvoid *) )0, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **) &errhp, (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

// 接続プール・ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&poolhp, (ub4)OCI_HTYPE_CPOOL, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
cleanup();
return ret;
}

/* CREATE THE CONNECTION POOL */
// OCI_DEFAULT:通常。
// OCI_CPOOL_REINITIALIZE:プール属性を動的に変更する場合(connMin、connMax、connIncrの各パラメータを変更する場合)。
ret = OCIConnectionPoolCreate( envhp, errhp, poolhp,
(OraText **)&poolName, (ub4 *)&poolNameLen,
(CONST OraText *)database, (ub4)strlen( (char*)database ),
connMin, connMax, connIncr,
(CONST OraText *)username, (ub4)strlen( (char*)username ),
(CONST OraText *)password, (ub4)strlen( (char*)password ),
OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

{
OCIThreadProcessInit();

ret = OCIThreadInit( envhp, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}

for ( i = 0 ; i < MAXTHREAD ; i++ ) {
ret = OCIThreadIdInit( envhp, errhp, &thrid[i] );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}
ret = OCIThreadHndInit( envhp, errhp, &thrhp[i] );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}
}

for ( i = 0 ; i < MAXTHREAD ; i++ ) {
employeeNum[i] = i;
ret = OCIThreadCreate( envhp, errhp, threadFunction, (dvoid *)&employeeNum[i], thrid[i], thrhp[i] );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}
}

for ( i = 0 ; i < MAXTHREAD ; i++ ) {
// コールスレッド結合
checkerr( errhp, OCIThreadJoin( envhp, errhp, thrhp[i] ) );
// スレッド・ハンドルクローズ
checkerr( errhp, OCIThreadClose( envhp, errhp, thrhp[i] ) );
// スレッド・ハンドル破棄・割当て解除
checkerr( errhp, OCIThreadHndDestroy( envhp, errhp, &(thrhp[i]) ) );
// スレッドID破棄・割当て解除
checkerr( errhp, OCIThreadIdDestroy( envhp, errhp, &(thrid[i]) ) );
}

// OCIThreadコンテキスト割当てメモリー解放
checkerr( errhp, OCIThreadTerm( envhp, errhp ) );

if ( poolhp ) {
checkerr( errhp, OCIConnectionPoolDestroy( poolhp, errhp, (ub4)OCI_DEFAULT ) );
checkerr( NULL, OCIHandleFree( (dvoid *)poolhp, (ub4)OCI_HTYPE_CPOOL ) );
}
}

// 終了処理
cleanup();

return 0;
}

sword threadFunction( dvoid *arg )
{
sword ret = 0;
int out_no = 0;
OCINumber out_number;
int out_int = 0;
short out_short = 0;
long out_long = 0;
float out_float = 0;
double out_double = 0;
char out_char[10+1];
char out_varchar2[32+1];
OCIDate out_date;
OCI_TIME out_time;
long rows = 0;

int empno = *(int *)arg;
OCISvcCtx *svchp = (OCISvcCtx *)arg;
OCIStmt *stmthp = (OCIStmt *)0;

memset( out_char, 0x00, sizeof( out_char ) );
memset( out_varchar2, 0x00, sizeof( out_varchar2 ) );
memset( &out_date, 0x00, sizeof( out_date ) );
memset( &out_time, 0x00, sizeof( OCI_TIME ) );

/* ■データベース接続開始 */

// モード選択型ログイン
// OCI_DEFAULT:シングルセッション・ログイン。OCILogon()と同等。
// OCI_LOGON2_CPOOL:接続プーリングを使用する場合に設定する。
// OCI_LOGON2_SPOOL:セッション・プーリングを使用する場合に設定する。
// OCI_LOGON2_STMTCACHE:文キャッシュを使用可能にする。
// OCI_LOGON2_PROXY:プロキシ認証を使用可能にする。
ret = OCILogon2( envhp, errhp, (OCISvcCtx **)&svchp,
(CONST OraText *)username, (ub4)strlen( (char *)username ),
(CONST OraText *)password, (ub4)strlen( (char *)password ),
(CONST OraText *)poolName, (ub4)poolNameLen,
(ub4)OCI_LOGON2_CPOOL );
if ( ret != OCI_SUCCESS ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
return ret;
}

/* ■テーブル操作開始 */

// 文ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&stmthp, (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
return ret;
}

// 実行するSQL文・PL/SQL文の準備
ret = OCIStmtPrepare( stmthp, errhp, (OraText *)SEL_TEST_TBL, (ub4)strlen( (char*)SEL_TEST_TBL ),
(ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
return ret;
}

/* ■WHERE句の変数定義 */

// 入力変数のバインド
//ret = OCIBindByName( stmthp, (OCIBind **)&bndhp[0], errhp,
// (OraText *)":NO", (sb4)strlen( ":NO" ), (dvoid *)&no, (sb4)sizeof( sword ),
// (ub2)SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT );
//if ( ret != OCI_SUCCESS ) {
// checkerr( errhp, ret );
// return ret;
//}

// SQL文・PL/SQL文のサーバー送信実行
ret = OCIStmtExecute( svchp, stmthp, errhp, (ub4)0, (ub4)0,
(CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
return ret;
}

/* ■出力変数の定義 */

// NUMBER(3,0)型データ取得
(void)OCI_GetDataInt( stmthp, errhp, 1, &out_no );

// NUMBER(12,2)型データ取得

// OCINumber型で取得
//(void)OCI_GetDataNumber( stmthp, errhp, 2, &out_number );

// int型で取得
(void)OCI_GetDataInt( stmthp, errhp, 2, &out_int );

// short型で取得
(void)OCI_GetDataShort( stmthp, errhp, 2, &out_short );

// long型で取得
(void)OCI_GetDataLong( stmthp, errhp, 2, &out_long );

// float型で取得
//(void)OCI_GetDataFloat( stmthp, errhp, 2, &out_float );

// double型で取得
//(void)OCI_GetDataDouble( stmthp, errhp, 2, &out_double );

// CHAR型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 3, (char*)&out_char, sizeof( out_char ) );

// VARCHAR2型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 4, (char*)&out_varchar2, sizeof( out_varchar2 ) );

// DATE型データ取得
(void)OCI_GetDataTimeStamp( stmthp, errhp, 5, &out_date );

// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
return ret;
}
else {
while ( (OCI_NO_DATA != ret) && (OCI_SUCCESS_WITH_INFO != ret) )
{
rows++;
printf( "[%03d],[%d],[%d],[%d],[%13.2f],[%13.2f],[%s],[%s],[%04d/%02d/%02d %02d:%02d:%02d]\n",
out_no, out_int, out_short, out_long, out_float, out_double, out_char, out_varchar2,
out_date.OCIDateYYYY, out_date.OCIDateMM, out_date.OCIDateDD, out_date.OCIDateTime.OCITimeHH, out_date.OCIDateTime.OCITimeMI, out_date.OCIDateTime.OCITimeSS );
// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
if ( OCI_NO_DATA != ret ) {
threadFunctionEnd( svchp, errhp, stmthp, ret );
break;
}
}
}
}

return ret;
}

/*
* スレッド処理.
*/
void threadFunctionEnd( OCISvcCtx *svchp, OCIError *errhp, OCIStmt *stmthp, sword status )
{
sword ret = 0;

checkerr( errhp, status );

if ( stmthp ) {
// 文ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT ) );
}

/* ■データベース接続終了 */

// シングルセッション・ログオフ
ret = OCILogoff( svchp, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}

}

/*
* チェックエラー処理.
*/
sword checkerr( OCIError *errhp, sword status )
{
text errbuf[512];
sb4 errcode = 0;

switch ( status )
{
case OCI_SUCCESS:
// 関数は正常に終了しました。
break;
case OCI_SUCCESS_WITH_INFO:
// 関数は正常に終了しました。OCIErrorGet()をコールすると、追加診断情報が戻されます。
// これには、警告が含まれる場合があります。
(void)printf( "Error - OCI_SUCCESS_WITH_INFO\n" );
break;
case OCI_NEED_DATA:
// アプリケーションで、ランタイム・データを提供する必要があります。
(void)printf( "Error - OCI_NEED_DATA\n" );
break;
case OCI_NO_DATA:
// 関数が終了しました。これ以上データはありません。
(void)printf( "Error - OCI_NODATA\n" );
break;
case OCI_ERROR:
// 関数が失敗しました。OCIErrorGet()をコールすると、エラーの追加情報が戻されます。
if ( errhp ) {
(void)OCIErrorGet( (dvoid *)errhp, (ub4)1, (text *)NULL, &errcode, errbuf, (ub4)sizeof( errbuf ), OCI_HTYPE_ERROR );
(void)printf( "Error - %.*s\n", 512, errbuf );
}
else {
(void)printf( "Error - OCI_ERROR\n" );
}
break;
case OCI_INVALID_HANDLE:
// 無効なハンドルがパラメータとして渡されたか、ユーザー・コールバックで無効なハンドルまたは無効なコンテキストが渡されました。
// 追加診断情報はありません。
(void)printf( "Error - OCI_INVALID_HANDLE\n" );
break;
case OCI_STILL_EXECUTING:
// サービス・コンテキストが非ブロック化モードで確立されたため、現行の操作は即時完了できませんでした。
// この操作を完了するには、これを再度コールする必要があります。OCIErrorGet()がエラー・コードとしてORA-03123を戻します。
(void)printf( "Error - OCI_STILL_EXECUTE\n" );
break;
case OCI_CONTINUE:
// このコードはコールバック関数からのみ戻されます。
// これは、コールバック関数が、OCIライブラリの標準処理再開を示唆していることを示します。
(void)printf( "Error - OCI_CONTINUE\n" );
break;
default:
break;
}
return status;
}

/*
* 終了処理.
*/
void cleanup()
{
int i = 0;

if ( errhp ) {
// エラー・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)errhp, (ub4)OCI_HTYPE_ERROR ) );
}
if ( envhp ) {
// 環境ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)envhp, (ub4)OCI_HTYPE_ENV ) );
}
// プロセスの終了と共有メモリー解放
checkerr( NULL, OCITerminate( OCI_DEFAULT ) );
return;
}

/*
* 出力変数定義処理.
*/
sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defhp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode )
{
sword ret = OCIDefineByPos( stmtp, defhp, errhp, position, valuep, value_sz, dty, indp, rlenp, rcodep, mode );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}
return ret;
}


/*
* OCINumber型データ取得処理.
*/
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( OCINumber ), SQLT_VNU, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* int型データ取得処理.
*/
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( int ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* short型データ取得処理.
*/
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( short ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* long型データ取得処理.
*/
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( long ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* float型データ取得処理.
*/
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( float ), SQLT_BFLOAT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* double型データ取得処理.
*/
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( double ), SQLT_BDOUBLE, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* char型データ取得処理.
*/
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

memset( TargetValuePtr, 0x00, BufferLength );

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)BufferLength, SQLT_STR, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* OCIDate型データ取得処理.
*/
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid *)TargetValuePtr, (sb4)sizeof( OCIDate ), SQLT_ODT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

水曜日, 6月 16, 2010

[C言語・C++]OCIで次のエラー?!「kgepop: no error frame to pop to for error 21500」

▼質問
OCIThreadからOCIConnectionPoolを使ってOCILogon2にログインすると次のエラーが出るんだ。

「kgepop: no error frame to pop to for error 21500」

どうしてこうなるか教えてくれ!!

▼回答
OCIInitialize()をコールした時のmodeを確認してくれ!!

OCIThreadを使う時のmodeは、次の様な指定の仕方にするんだ。

「(ub4)(OCI_THREADED | OCI_OBJECT)」

OCIInitialize( (ub4)(OCI_THREADED | OCI_OBJECT), (dvoid *)0,
         ( dvoid * (*)(dvoid *, size_t) )0,
         ( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
         ( void (*)(dvoid *, dvoid *) )0 );

OCIEnvCreate()をコールした時の指定の仕方。

OCIEnvCreate( (OCIEnv **)&envhp, (ub4)OCI_THREADED, (dvoid *)0,
( dvoid * (*)(dvoid *, size_t) )0,
( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
( void (*)(dvoid *, dvoid *) )0, (size_t)0, (dvoid **)0 );

■参考サイト
Re: kgepop: no error frame to pop to for error 21500
Oracle ABC Wiki: Ora 19999 Ora 24279 Jp

[C言語・C++]OCI(Oracle Call Interface)サンプル(OCILogon版)

次のテーブルを使用したシングルセッション・ログイン(OCILogon)のサンプルを示す。

CREATE TABLE TEST_TBL (
"NO" NUMBER(3), /* 番号 */
"DT_NUMBER" NUMBER(12,2), /* NUMBER型 */
"DT_CHAR" CHAR(10), /* CHAR型 */
"DT_VARCHAR2" VARCHAR2(32), /* VARCHAR2型 */
"DT_DATE" DATE /* DATE型 */
)

①追加のインクルードディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\include

②追加のライブラリディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\lib\MSVC

③追加の依存ファイル
oci.lib kernel32.lib msvcrt.lib




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>

typedef struct _OCI_TIMESTAMP_STRUCT
{
short year;
unsigned short month;
unsigned short day;
unsigned short hour;
unsigned short minute;
unsigned short second;
unsigned long fraction;
} OCI_TIMESTAMP_STRUCT_T;

typedef OCI_TIMESTAMP_STRUCT_T OCI_TIME;

static text *database = (text *)"データベース名";
static text *username = (text *)"ユーザー名";
static text *password = (text *)"パスワード";

//static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL WHERE NO = :NO";
static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL ORDER BY NO";

static OCIEnv *envhp;
static OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;

static sword checkerr( OCIError *errhp, sword status );
static void cleanup(/*_ void _*/);

sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode );
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr );
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr );
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr );
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr );
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr );
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr );
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength );
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr );


int main( int argc, char* argv[] )
{
sword ret = 0;
sword no = 1;
int out_no = 0;
OCINumber out_number;
int out_int = 0;
short out_short = 0;
long out_long = 0;
float out_float = 0;
double out_double = 0;
char out_char[10+1];
char out_varchar2[32+1];
OCIDate out_date;
OCI_TIME out_time;
long rows = 0;

OCIBind *bndhp[1]; // バインド・ハンドル
OCIDefine *defhp[6]; // 定義ハンドル

memset( bndhp, 0x00, sizeof( bndhp ) );
memset( defhp, 0x00, sizeof( defhp ) );
memset( out_char, 0x00, sizeof( out_char ) );
memset( out_varchar2, 0x00, sizeof( out_varchar2 ) );
memset( &out_date, 0x00, sizeof( out_date ) );
memset( &out_time, 0x00, sizeof( OCI_TIME ) );

ret = OCIInitialize( (ub4)OCI_DEFAULT, (dvoid *)0,
( dvoid * (*)(dvoid *, size_t) )0,
( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
( void (*)(dvoid *, dvoid *) )0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

ret = OCIEnvInit( (OCIEnv **)&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **) &errhp, (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

/* ■データベース接続開始 */

// サーバー・コンテキスト・ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&svchp, (ub4)OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
cleanup();
return ret;
}

// シングルセッション・ログイン
ret = OCILogon( envhp, errhp, (OCISvcCtx **)&svchp,
(OraText *)username, (ub4)strlen( (char *)username ),
(OraText *)password, (ub4)strlen( (char *)password ),
(OraText *)database, (ub4)strlen( (char*)database ) );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■テーブル操作開始 */

// 文ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&stmthp, (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// 実行するSQL文・PL/SQL文の準備
ret = OCIStmtPrepare( stmthp, errhp, (OraText *)SEL_TEST_TBL, (ub4)strlen( (char*)SEL_TEST_TBL ),
(ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■WHERE句の変数定義 */

// 入力変数のバインド
//ret = OCIBindByName( stmthp, (OCIBind **)&bndhp[0], errhp,
// (OraText *)":NO", (sb4)strlen( ":NO" ), (dvoid *)&no, (sb4)sizeof( sword ),
// (ub2)SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT );
//if ( ret != OCI_SUCCESS ) {
// checkerr( errhp, ret );
// cleanup();
// return ret;
//}

// SQL文・PL/SQL文のサーバー送信実行
ret = OCIStmtExecute( svchp, stmthp, errhp, (ub4)0, (ub4)0,
(CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■出力変数の定義 */

// NUMBER(3,0)型データ取得
(void)OCI_GetDataInt( stmthp, errhp, 1, &out_no );

// NUMBER(12,2)型データ取得

// OCINumber型で取得
//(void)OCI_GetDataNumber( stmthp, errhp, 2, &out_number );

// int型で取得
(void)OCI_GetDataInt( stmthp, errhp, 2, &out_int );

// short型で取得
(void)OCI_GetDataShort( stmthp, errhp, 2, &out_short );

// long型で取得
(void)OCI_GetDataLong( stmthp, errhp, 2, &out_long );

// float型で取得
//(void)OCI_GetDataFloat( stmthp, errhp, 2, &out_float );

// double型で取得
//(void)OCI_GetDataDouble( stmthp, errhp, 2, &out_double );

// CHAR型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 3, (char*)&out_char, sizeof( out_char ) );

// VARCHAR2型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 4, (char*)&out_varchar2, sizeof( out_varchar2 ) );

// DATE型データ取得
(void)OCI_GetDataTimeStamp( stmthp, errhp, 5, &out_date );

// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}
else {
while ( (OCI_NO_DATA != ret) && (OCI_SUCCESS_WITH_INFO != ret) )
{
rows++;
printf( "[%03d],[%d],[%d],[%d],[%13.2f],[%13.2f],[%s],[%s],[%04d/%02d/%02d %02d:%02d:%02d]\n",
out_no, out_int, out_short, out_long, out_float, out_double, out_char, out_varchar2,
out_date.OCIDateYYYY, out_date.OCIDateMM, out_date.OCIDateDD, out_date.OCIDateTime.OCITimeHH, out_date.OCIDateTime.OCITimeMI, out_date.OCIDateTime.OCITimeSS );
// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
if ( OCI_NO_DATA != ret ) {
checkerr( errhp, ret );
}
}
}
}

/* ■データベース接続終了 */

// シングルセッション・ログオフ
ret = OCILogoff( svchp, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
}

// 終了処理
cleanup();

return 0;
}


/*
* チェックエラー処理.
*/
sword checkerr( OCIError *errhp, sword status )
{
text errbuf[512];
sb4 errcode = 0;

switch ( status )
{
case OCI_SUCCESS:
// 関数は正常に終了しました。
break;
case OCI_SUCCESS_WITH_INFO:
// 関数は正常に終了しました。OCIErrorGet()をコールすると、追加診断情報が戻されます。
// これには、警告が含まれる場合があります。
(void)printf( "Error - OCI_SUCCESS_WITH_INFO\n" );
break;
case OCI_NEED_DATA:
// アプリケーションで、ランタイム・データを提供する必要があります。
(void)printf( "Error - OCI_NEED_DATA\n" );
break;
case OCI_NO_DATA:
// 関数が終了しました。これ以上データはありません。
(void)printf( "Error - OCI_NODATA\n" );
break;
case OCI_ERROR:
// 関数が失敗しました。OCIErrorGet()をコールすると、エラーの追加情報が戻されます。
if ( errhp ) {
(void)OCIErrorGet( (dvoid *)errhp, (ub4)1, (text *)NULL, &errcode, errbuf, (ub4)sizeof( errbuf ), OCI_HTYPE_ERROR );
(void)printf( "Error - %.*s\n", 512, errbuf );
}
else {
(void)printf( "Error - OCI_ERROR\n" );
}
break;
case OCI_INVALID_HANDLE:
// 無効なハンドルがパラメータとして渡されたか、ユーザー・コールバックで無効なハンドルまたは無効なコンテキストが渡されました。
// 追加診断情報はありません。
(void)printf( "Error - OCI_INVALID_HANDLE\n" );
break;
case OCI_STILL_EXECUTING:
// サービス・コンテキストが非ブロック化モードで確立されたため、現行の操作は即時完了できませんでした。
// この操作を完了するには、これを再度コールする必要があります。OCIErrorGet()がエラー・コードとしてORA-03123を戻します。
(void)printf( "Error - OCI_STILL_EXECUTE\n" );
break;
case OCI_CONTINUE:
// このコードはコールバック関数からのみ戻されます。
// これは、コールバック関数が、OCIライブラリの標準処理再開を示唆していることを示します。
(void)printf( "Error - OCI_CONTINUE\n" );
break;
default:
break;
}
return status;
}

/*
* 終了処理.
*/
void cleanup()
{
if ( stmthp ) {
// 文ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT ) );
}
if ( svchp ) {
// サーバー・コンテキスト・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX ) );
}
if ( errhp ) {
// エラー・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)errhp, (ub4)OCI_HTYPE_ERROR ) );
}
if ( envhp ) {
// 環境ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)envhp, (ub4)OCI_HTYPE_ENV ) );
}
// プロセスの終了と共有メモリー解放
checkerr( NULL, OCITerminate( OCI_DEFAULT ) );
return;
}

/*
* 出力変数定義処理.
*/
sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defhp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode )
{
sword ret = OCIDefineByPos( stmtp, defhp, errhp, position, valuep, value_sz, dty, indp, rlenp, rcodep, mode );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}
return ret;
}


/*
* OCINumber型データ取得処理.
*/
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( OCINumber ), SQLT_VNU, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* int型データ取得処理.
*/
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( int ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* short型データ取得処理.
*/
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( short ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* long型データ取得処理.
*/
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( long ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* float型データ取得処理.
*/
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( float ), SQLT_BFLOAT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* double型データ取得処理.
*/
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( double ), SQLT_BDOUBLE, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* char型データ取得処理.
*/
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

memset( TargetValuePtr, 0x00, BufferLength );

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)BufferLength, SQLT_STR, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* OCIDate型データ取得処理.
*/
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid *)TargetValuePtr, (sb4)sizeof( OCIDate ), SQLT_ODT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}


土曜日, 5月 15, 2010

[C言語・C++]OCI(Oracle Call Interface)サンプル

次のテーブルを使用したサンプルを示す。

CREATE TABLE TEST_TBL (
"NO" NUMBER(3), /* 番号 */
"DT_NUMBER" NUMBER(12,2), /* NUMBER型 */
"DT_CHAR" CHAR(10), /* CHAR型 */
"DT_VARCHAR2" VARCHAR2(32), /* VARCHAR2型 */
"DT_DATE" DATE /* DATE型 */
)

①追加のインクルードディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\include

②追加のライブラリディレクトリ
インストールされたoracleパス\product\10.2.0\db_1\OCI\lib\MSVC

③追加の依存ファイル
oci.lib kernel32.lib msvcrt.lib




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>

typedef struct _OCI_TIMESTAMP_STRUCT
{
short year;
unsigned short month;
unsigned short day;
unsigned short hour;
unsigned short minute;
unsigned short second;
unsigned long fraction;
} OCI_TIMESTAMP_STRUCT_T;

typedef OCI_TIMESTAMP_STRUCT_T OCI_TIME;

static text *database = (text *)"データベース名";
static text *username = (text *)"ユーザー名";
static text *password = (text *)"パスワード";

//static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL WHERE NO = :NO";
static text *SEL_TEST_TBL = (text *) "SELECT * FROM TEST_TBL ORDER BY NO";

static OCIEnv *envhp;
static OCIError *errhp;
OCISession *authp = (OCISession *)0;
OCIServer *srvhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;

static sword checkerr( OCIError *errhp, sword status );
static void cleanup(/*_ void _*/);

sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode );
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr );
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr );
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr );
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr );
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr );
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr );
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength );
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr );


int main( int argc, char* argv[] )
{
sword ret = 0;
sword no = 1;
int out_no = 0;
OCINumber out_number;
int out_int = 0;
short out_short = 0;
long out_long = 0;
float out_float = 0;
double out_double = 0;
char out_char[10+1];
char out_varchar2[32+1];
OCIDate out_date;
OCI_TIME out_time;
long rows = 0;

OCIBind *bndhp[1]; // バインド・ハンドル
OCIDefine *defhp[6]; // 定義ハンドル

memset( bndhp, 0x00, sizeof( bndhp ) );
memset( defhp, 0x00, sizeof( defhp ) );
memset( out_char, 0x00, sizeof( out_char ) );
memset( out_varchar2, 0x00, sizeof( out_varchar2 ) );
memset( &out_date, 0x00, sizeof( out_date ) );
memset( &out_time, 0x00, sizeof( OCI_TIME ) );

ret = OCIInitialize( (ub4)OCI_DEFAULT, (dvoid *)0,
( dvoid * (*)(dvoid *, size_t) )0,
( dvoid * (*)(dvoid *, dvoid *, size_t) )0,
( void (*)(dvoid *, dvoid *) )0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

ret = OCIEnvInit( (OCIEnv **)&envhp, (ub4)OCI_DEFAULT, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **) &errhp, (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
return ret;
}

/* ■データベース接続開始 */

// サーバー・ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&srvhp, (ub4)OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
cleanup();
return ret;
}

// サーバー・コンテキスト・ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&svchp, (ub4)OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
cleanup();
return ret;
}

// データソースの連結(アタッチ)。サーバー・コンテキスト・ハンドルの初期化
ret = OCIServerAttach( srvhp, errhp, (text *)database, (ub4)strlen( (char*)database ), (ub4)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// サーバー・ハンドルにサーバー・コンテキスト・ハンドルの連結(アタッチ)設定
ret = OCIAttrSet( (dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)srvhp,
(ub4)0, (ub4)OCI_ATTR_SERVER, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// ユーザー・セッション・ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&authp, (ub4)OCI_HTYPE_SESSION, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( NULL, ret );
cleanup();
return ret;
}

// ユーザー名設定
ret = OCIAttrSet( (dvoid *)authp, (ub4)OCI_HTYPE_SESSION,
(dvoid *)username, (ub4)strlen( (char *)username ), (ub4)OCI_ATTR_USERNAME, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// パスワード設定
ret = OCIAttrSet( (dvoid *)authp, (ub4)OCI_HTYPE_SESSION,
(dvoid *)password, (ub4)strlen( (char *)password ), (ub4)OCI_ATTR_PASSWORD, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// ユーザー・セッション開始
ret = OCISessionBegin( svchp, errhp, authp, (ub4)OCI_CRED_RDBMS, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// サーバー・コンテキスト・ハンドルのセッション設定
ret = OCIAttrSet( (dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)authp,
(ub4)0, (ub4)OCI_ATTR_SESSION, errhp );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■テーブル操作開始 */

// 文ハンドル割当て
ret = OCIHandleAlloc( (dvoid *)envhp, (dvoid **)&stmthp, (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0 );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

// 実行するSQL文・PL/SQL文の準備
ret = OCIStmtPrepare( stmthp, errhp, (OraText *)SEL_TEST_TBL, (ub4)strlen( (char*)SEL_TEST_TBL ),
(ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■WHERE句の変数定義 */

// 入力変数のバインド
//ret = OCIBindByName( stmthp, (OCIBind **)&bndhp[0], errhp,
// (OraText *)":NO", (sb4)strlen( ":NO" ), (dvoid *)&no, (sb4)sizeof( sword ),
// (ub2)SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT );
//if ( ret != OCI_SUCCESS ) {
// checkerr( errhp, ret );
// cleanup();
// return ret;
//}

// SQL文・PL/SQL文のサーバー送信実行
ret = OCIStmtExecute( svchp, stmthp, errhp, (ub4)0, (ub4)0,
(CONST OCISnapshot *)NULL, (OCISnapshot *)NULL, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}

/* ■出力変数の定義 */

// NUMBER(3,0)型データ取得
(void)OCI_GetDataInt( stmthp, errhp, 1, &out_no );

// NUMBER(12,2)型データ取得

// OCINumber型で取得
//(void)OCI_GetDataNumber( stmthp, errhp, 2, &out_number );

// int型で取得
(void)OCI_GetDataInt( stmthp, errhp, 2, &out_int );

// short型で取得
(void)OCI_GetDataShort( stmthp, errhp, 2, &out_short );

// long型で取得
(void)OCI_GetDataLong( stmthp, errhp, 2, &out_long );

// float型で取得
//(void)OCI_GetDataFloat( stmthp, errhp, 2, &out_float );

// double型で取得
//(void)OCI_GetDataDouble( stmthp, errhp, 2, &out_double );

// CHAR型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 3, (char*)&out_char, sizeof( out_char ) );

// VARCHAR2型データ取得
(void)OCI_GetDataChar( stmthp, errhp, 4, (char*)&out_varchar2, sizeof( out_varchar2 ) );

// DATE型データ取得
(void)OCI_GetDataTimeStamp( stmthp, errhp, 5, &out_date );

// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}
else {
while ( (OCI_NO_DATA != ret) && (OCI_SUCCESS_WITH_INFO != ret) )
{
rows++;
printf( "[%03d],[%d],[%d],[%d],[%13.2f],[%13.2f],[%s],[%s],[%04d/%02d/%02d %02d:%02d:%02d]\n",
out_no, out_int, out_short, out_long, out_float, out_double, out_char, out_varchar2,
out_date.OCIDateYYYY, out_date.OCIDateMM, out_date.OCIDateDD, out_date.OCIDateTime.OCITimeHH, out_date.OCIDateTime.OCITimeMI, out_date.OCIDateTime.OCITimeSS );
// 問合せから行の読込み実行
ret = OCIStmtFetch( stmthp, errhp, (ub4)1, (ub2)OCI_FETCH_NEXT, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
if ( OCI_NO_DATA != ret ) {
checkerr( errhp, ret );
}
}
}
}

/* ■データベース接続終了 */

// 終了処理
cleanup();

return 0;
}


/*
* チェックエラー処理.
*/
sword checkerr( OCIError *errhp, sword status )
{
text errbuf[512];
sb4 errcode = 0;

switch ( status )
{
case OCI_SUCCESS:
// 関数は正常に終了しました。
break;
case OCI_SUCCESS_WITH_INFO:
// 関数は正常に終了しました。OCIErrorGet()をコールすると、追加診断情報が戻されます。
// これには、警告が含まれる場合があります。
(void)printf( "Error - OCI_SUCCESS_WITH_INFO\n" );
break;
case OCI_NEED_DATA:
// アプリケーションで、ランタイム・データを提供する必要があります。
(void)printf( "Error - OCI_NEED_DATA\n" );
break;
case OCI_NO_DATA:
// 関数が終了しました。これ以上データはありません。
(void)printf( "Error - OCI_NODATA\n" );
break;
case OCI_ERROR:
// 関数が失敗しました。OCIErrorGet()をコールすると、エラーの追加情報が戻されます。
if ( errhp ) {
(void)OCIErrorGet( (dvoid *)errhp, (ub4)1, (text *)NULL, &errcode, errbuf, (ub4)sizeof( errbuf ), OCI_HTYPE_ERROR );
(void)printf( "Error - %.*s\n", 512, errbuf );
}
else {
(void)printf( "Error - OCI_ERROR\n" );
}
break;
case OCI_INVALID_HANDLE:
// 無効なハンドルがパラメータとして渡されたか、ユーザー・コールバックで無効なハンドルまたは無効なコンテキストが渡されました。
// 追加診断情報はありません。
(void)printf( "Error - OCI_INVALID_HANDLE\n" );
break;
case OCI_STILL_EXECUTING:
// サービス・コンテキストが非ブロック化モードで確立されたため、現行の操作は即時完了できませんでした。
// この操作を完了するには、これを再度コールする必要があります。OCIErrorGet()がエラー・コードとしてORA-03123を戻します。
(void)printf( "Error - OCI_STILL_EXECUTE\n" );
break;
case OCI_CONTINUE:
// このコードはコールバック関数からのみ戻されます。
// これは、コールバック関数が、OCIライブラリの標準処理再開を示唆していることを示します。
(void)printf( "Error - OCI_CONTINUE\n" );
break;
default:
break;
}
return status;
}

/*
* 終了処理.
*/
void cleanup()
{
if ( stmthp ) {
// 文ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT ) );
}
if ( authp ) {
// セッション終了
checkerr( errhp, OCISessionEnd( svchp, errhp, authp, (ub4)OCI_DEFAULT ) );
// ユーザー・セッション・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)authp, (ub4)OCI_HTYPE_SESSION ) );
}
if ( srvhp ) {
// サーバー・ハンドルからサーバー・コンテキスト・ハンドルの連結解除(サーバー・コンテキスト・ハンドル未初期化)
checkerr( errhp, OCIServerDetach( srvhp, errhp, (ub4)OCI_DEFAULT ) );
// サーバー・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)srvhp, (ub4)OCI_HTYPE_SERVER ) );
}
if ( svchp ) {
// サーバー・コンテキスト・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX ) );
}
if ( errhp ) {
// エラー・ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)errhp, (ub4)OCI_HTYPE_ERROR ) );
}
if ( envhp ) {
// 環境ハンドル解放
checkerr( NULL, OCIHandleFree( (dvoid *)envhp, (ub4)OCI_HTYPE_ENV ) );
}
// プロセスの終了と共有メモリー解放
checkerr( NULL, OCITerminate( OCI_DEFAULT ) );
return;
}

/*
* 出力変数定義処理.
*/
sword OCI_DefineByPos( OCIStmt *stmtp, OCIDefine **defhp, OCIError *errhp,
ub4 position, dvoid *valuep, sb4 value_sz,
ub2 dty, dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode )
{
sword ret = OCIDefineByPos( stmtp, defhp, errhp, position, valuep, value_sz, dty, indp, rlenp, rcodep, mode );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
cleanup();
return ret;
}
return ret;
}


/*
* OCINumber型データ取得処理.
*/
sword OCI_GetDataNumber( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCINumber *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( OCINumber ), SQLT_VNU, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* int型データ取得処理.
*/
sword OCI_GetDataInt( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, int *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( int ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* short型データ取得処理.
*/
sword OCI_GetDataShort( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, short *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( short ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* long型データ取得処理.
*/
sword OCI_GetDataLong( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, long *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( long ), SQLT_INT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* float型データ取得処理.
*/
sword OCI_GetDataFloat( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, float *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( float ), SQLT_BFLOAT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* double型データ取得処理.
*/
sword OCI_GetDataDouble( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, double *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)sizeof( double ), SQLT_BDOUBLE, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* char型データ取得処理.
*/
sword OCI_GetDataChar( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, char *TargetValuePtr, unsigned int BufferLength )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

memset( TargetValuePtr, 0x00, BufferLength );

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid*)TargetValuePtr, (sb4)BufferLength, SQLT_STR, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}

/*
* OCIDate型データ取得処理.
*/
sword OCI_GetDataTimeStamp( OCIStmt *stmtp, OCIError *errhp, int ColumnNumber, OCIDate *TargetValuePtr )
{
sword ret = 0;
OCIDefine *defhp = NULL; // 定義ハンドル

ret = OCIDefineByPos( stmtp, (OCIDefine **)&defhp, errhp, (ub4)ColumnNumber, (dvoid *)TargetValuePtr, (sb4)sizeof( OCIDate ), SQLT_ODT, (dvoid *)0, (ub2)0, (ub2)0, (ub4)OCI_DEFAULT );
if ( ret != OCI_SUCCESS ) {
checkerr( errhp, ret );
return ret;
}

return ret;
}


日曜日, 3月 21, 2010

[JavaScript]XMLHttpRequestのstatusで「エラーを特定できません」のエラーが出る!

▼質問
XMLHttpRequestのstatusで次のJavaScriptエラーが出るんだ!

「エラーを特定できません」

どうしてかわかるかい?

プログラムはこんな感じだ。

簡単に説明すると

非同期(Async)通信でサーバにある適当なファイルを

使って動作確認をするプログラムを作成したんだ。

request変数でXMLHttpRequestオブジェクトを取得して

div要素に各情報を出力しているプログラムなんだ。

request.onreadystatechange = function() {
document.getElementById( "request_readyState" ).innerHTML = request.readyState;
document.getElementById( "request_status" ).innerHTML = request.status;
if ( (request.readyState == 4) && (request.status == 200) ) {
document.getElementById( "request_result" ).innerHTML = "正常";
}
else {
document.getElementById( "request_result" ).innerHTML = "異常";
}
}
request.open( "POST", url, true );
request.send("");

次の行でエラーになるんだ。

「document.getElementById( "request_status" ).innerHTML = request.status;」

▼回答

onreadystatechangeイベントは、XMLHttpRequestオブジェクトの

ready状態(readyState)が変化したときに発生するため、

XMLHttpRequestオブジェクトのstatusを取得する時は、

readyStateを考慮する必要があるんだ。

0 = uninitialized(初期化されてない)
1 = loading(読み込み中)
2 = loaded(読み込み完了)
3 = interactive(相互通信可能)
4 = complete(全ての処理が完了した)

すると、次の様なプログラムになるから参考にしてみてくれ!

request.onreadystatechange = function() {
document.getElementById( "request_readyState" ).innerHTML = request.readyState;
if ( request.readyState == 4 ) {
document.getElementById( "request_status" ).innerHTML = request.status;
if ( request.status == 200 ) {
document.getElementById( "request_result" ).innerHTML = "正常";
}
else {
document.getElementById( "request_result" ).innerHTML = "異常";
}
}
}
request.open( "POST", url, true );
request.send("");

■参考サイト
XMLHttpRequest
Status codes in HTTP

日曜日, 3月 14, 2010

[JavaScript]XMLHttpRequestの使用方法

▼質問
JavaScriptを使って簡単にWEBサーバの状態を監視したいんだ。

何かいい方法はないか教えてくれないか!

▼回答
それなら、XMLHttpRequestを使うとできると思うよ。

簡単な手順とサンプルを教えてあげるから参考にしてくれ!

① XMLHttpRequestオブジェクト生成(IE用とそれ以外で処理分岐)
② 非同期通信の時は、onreadystatechangeイベントの登録
③ openメソッドを使って、サーバへのリクエスト方法を指定
④ sendメソッドを使って、サーバへのリクエストする(データ送信)
⑤ readyStateプロパティを使ってサーバからデータを受信できたか調べる
⑥ statusプロパティを使って正常に取得できたか調べる
⑦ responseText・responseXMLプロパティを使って受信データを処理する

同期(Sync)通信



function send_sync() {
var now = new Date();
var url = "test.jsp?NOW_DATE=" + now;
var ret = false;
var request = null;

if ( window.XMLHttpRequest ) {
// Mozilla, Safari, etc
request = new XMLHttpRequest();
}
else if ( window.ActiveXObject ) {
// IE
try {
request = new ActiveXObject( "Msxml2.XMLHTTP" );
} catch (e) {
try {
request = new ActiveXObject( "Microsoft.XMLHTTP" );
} catch (e) {}
}
}
if ( !request ) {
alert( 'Giving up :( Cannot create an XMLHTTP instance' );
return;
}
request.open( "POST", url, false );
request.send("");
document.getElementById( "request_readyState" ).innerHTML = request.readyState;
document.getElementById( "request_status" ).innerHTML = request.status;
if ( (request.readyState == 4) && (request.status == 200) ) {
request_Headers.innerHTML = request.getAllResponseHeaders();
document.getElementById( "result_post" ).innerHTML = "正常";
}
else {
document.getElementById( "result_post" ).innerHTML = "異常";
}
}



非同期(Async)通信



function send_async() {
var now = new Date();
var url = "test.jsp?NOW_DATE=" + now;
var ret = false;
var request = null;

if ( window.XMLHttpRequest ) {
// Mozilla, Safari, etc
request = new XMLHttpRequest();
}
else if ( window.ActiveXObject ) {
// IE
try {
request = new ActiveXObject( "Msxml2.XMLHTTP" );
} catch (e) {
try {
request = new ActiveXObject( "Microsoft.XMLHTTP" );
} catch (e) {}
}
}
if ( !request ) {
alert( 'Giving up :( Cannot create an XMLHTTP instance' );
return;
}
request.onreadystatechange = function() {
document.getElementById( "request_readyState" ).innerHTML = request.readyState;
if ( request.readyState == 4 ) {
document.getElementById( "request_status" ).innerHTML = request.status;
if ( request.status == 200 ) {
request_Headers.innerHTML = request.getAllResponseHeaders();
document.getElementById( "result_post" ).innerHTML = "正常";
}
else {
document.getElementById( "result_post" ).innerHTML = "異常";
}
}
}
request.open( "POST", url, true );
request.send("");
}



出力



結果:<div id="request_result"></div>
readyState:<div id="request_readyState"></div>
status:<div id="request_status"></div>
ResponseHeaders:<div id="request_Headers"></div>




■参考サイト
IEのonreadystatechangeイベントハンドラは、1回しか反応しないんでしょうか? - Yahoo!知恵袋

木曜日, 3月 11, 2010

[Excel]相対位置にある合計範囲をコピーでリンク

▼質問
ある列のデータ範囲に相対位置で合計したい範囲が12点づつあるんだ。

その合計だけをあるセルに一列で並べたいんだ。

どうやったらできるか教えてくれ!!

▼回答
OFFSET関数とROW関数で実現できるよ!

E列に12点づつ合計したいものがあるとする。

その合計をA1からリストすると次の様になる。

A1=SUM(OFFSET($E$1,12*(ROW()-1),0*1,12,1))
A2=SUM(OFFSET($E$1,12*(ROW()-1),0*1,12,1))
A3=SUM(OFFSET($E$1,12*(ROW()-1),0*1,12,1))
:
:

A1だけコピぺして後はセルのコピーで簡単にできるよ!!

金曜日, 2月 26, 2010

[Java]JSPでサーバーOSの判定

▼質問
JSPファイルが文字化けするんだ。

Windowsで開発している環境では文字化けの対応をしたんだが

Linuxで動かすと文字化けしてしまうんだ。

そこで、JSPでサーバーOSの判定をして処理を分けたいんだ。

どうしたら、サーバーのOSを判定できるか教えてくれないか?

▼回答
次の様にやれば判定は可能だよ!

参考にしてくれ!!



if ( System.getProperty( "os.name" ).toLowerCase().indexOf("win") > -1 ) {
// Windows
}
else {
// Windows以外
}

日曜日, 2月 21, 2010

[JavaScript]ブラウザの閉じるボタン([×]ボタン)

▼質問
ブラウザの閉じるボタン([×]ボタン)を押されても

閉じない方法(キャンセルする方法)はないのかな?

▼回答
閉じない方法(キャンセルする方法)はないけど

閉じる前に自分のウィンドウを出し直す方法で

閉じないようにすることはできるよ。

サンプルを作ってみたから参考にしてくれ!!

CloseTest.htmlファイルを作成する。



<html>
<head>
<script language="javascript">
<!--
var flag = true;
-->
</script>
</head>
<body onBeforeUnload="if ( flag ) alert( 'ブラウザの[×]ボタンでは、閉じることはできません。\n[閉じる]ボタンを使用してください。' );" onUnload="if ( flag ) window.open( 'CloseTest.html' );">
<input type="button" value="閉じる" onClick="flag = false; window.close();">
</body>
</html>

火曜日, 2月 09, 2010

[VBA]IADsでの削除方法

▼質問
文字列で扱われている情報を削除したいんだ。

次ぎ様にしたんだがうまく削除されないんだ。

IADs.PutEx ADS_PROPERTY_DELETE, PropertyItem, vbNullString

どうしてかわかるかな?

▼回答
次の様にしていたらどうかな?

IADs.PutEx ADS_PROPERTY_CLEAR, PropertyItem, vbNullString

月曜日, 2月 01, 2010

[VBA]IADsで「オートメーション エラーです。エラーを特定できません」のエラーがでる

▼質問
Active Directory(Active DS Type Libray)のPutメソッドを使って

下記の関数を作ったら次のエラーが出る。



Private Sub SetIADsValue(ByVal IADs As Object,
ByVal PropertyItem As String,
ByVal PropertyValue As String)

On Error GoTo doError

IADs.Put PropertyItem, PropertyValue

Exit Sub

doError:
Debug.Print (Err.Description & "(" & Err.Number & ")")
End Sub





「オートメーション エラーです。エラーを特定できません (-2147467259)」

どうしてなんだ。

▼回答
PutメソッドのPropertyValue値の型がVariantじゃないと出るエラーなんだ。

IADs.Put PropertyItem, PropertyValue

だから、次の様にしないといけないんだ。

Private Sub SetIADsValue(ByVal IADs As Object, ByVal PropertyItem As String, ByVal PropertyValue As Variant)

木曜日, 1月 21, 2010

Active Directoryメモ

■OU:組織単位(Organizational Unit)
■Active Directoryオブジェクト:
ユーザー・オブジェクト、グループ・オブジェクト、コンピュータ・オブジェクト
■識別名(DN):
/O=Internet/DC=COM/DC=Microsoft/CN=Users/CN=James Smith
このDNは、Microsoft.comドメイン内のJames Smithユーザーオブジェクトを識別。
■O:Organization
■DC:Domain Component
■CN:Common Name
■CN=Users:Usersコンテナ
■CN=Computers:Computersコンテナ
■相対識別名(RDN):
/O=Internet/DC=COM/DC=Microsoft/CN=Users/CN=James Smith
CN=James SmithがJames SmithユーザーオブジェクトのRDN。親オブジェクトのRDNはCN=Users。
■GUID(Globally Unique Identifier):一意性が保証された 128 ビットの番号
■ユーザープリンシパル名(UPN):
ユーザー名およびユーザーオブジェクトの所属先ドメインツリーのDSN名を"略記"した名前。
microsoft.comツリー内のユーザーJames SmithのUPNは、JamesS@Microsoft.comなどとなる。
■ADSI(Active Directory Service Interfaces):
ユーザーがLDAP通信の詳細を意識せずにActive Directoryにアクセスできるようになるシンプルかつ
強力なオブジェクト指向インターフェイスを提供するAPI。


■参考サイト
Active Directory 技術概要
スクリプト一覧 : Active Directory
Active Directoryオブジェクトの識別名(DN)とは - @IT
csvdeコマンド - 管理者必見! ネットワーク・コマンド集:ITpro

木曜日, 1月 14, 2010

[JavaScript]disabledが反映しない

▼質問
ボタン操作で処理の長いものがあった時に、他のボタンなどが操作されないように

全てのコントロールをdisabledで操作不可状態にしようとしたんだけど・・・。

うまく反映しない時があるんだ。

どうしてかわかるかな?!

▼回答
setTimeout関数を使わないと駄目みたいなんだ。

そのやり方を次に示しておくから参考にしてくれ!!




function allDisabled( flag )
{

with ( document.フォーム名 ) {
for ( var i = 0 ; i < elements.length ; i++ ) {
elements[i].disabled = flag;
}
}

}

■ボタンから呼出す関数
function doMainProc()
{

document.body.style.cursor = "wait";

// disabled設定処理
allDisabled( true );

var n = setTimeout( "doSubMainProc();", 1 );

}
function doSubMainProc()
{

// 処理を記述

clearTimeout( "doSubMainProc();" );

document.body.style.cursor = "default";

// disabled設定処理
allDisabled( false );

}




■参考サイト
ボタンの非表示

水曜日, 1月 13, 2010

[JavaScript]アクセスが拒否されました

▼質問
JavaScriptで「アクセスが拒否されました。」のエラーメッセージが出る。

どうしてだ!

▼回答
イベント処理を確認してみてくれ!

二つのイベントを使って同じ関数を使っていないか調べてみてくれ!!

例えば、下記のような感じで。

onKeyPress="関数1()" onKeyUp="関数1()"

もしかすると、その関数で処理が衝突しているかもしれない!?

onLoad ページがロードされた時に発生。
onUnload ページがアンロード(他ページ移動時に発生)された時に発生。
onAbort イメージの読込みが中断された時に発生。
onError 読込みが失敗した時に発生。
onMove ウィンドウを移動した時に発生。
onResize ウィンドウがリサイズされた時に発生。
onDragDrop ファイルなどがドラッグ&ドロップされた時に発生。
onFocus フォーカスを得た時に発生。
onBlur フォーカスを失った時に発生。
onSubmit サブミットボタンが押された時に発生。
onReset リセットボタンが押された時に発生。
onClick クリックされた時に発生。
onDblClick ダブルクリックされた時に発生。
onKeyDown キーが押された時に発生。
onKeyPress キーが押されて、離れた時に発生。
onKeyUp キーが離れた時に発生。
onMouseDown マウスボタンが押された時に発生。
onMouseUp マウスボタンが離された時に発生。
onMouseOver マウスカーソルが上に来た時に発生。
onMouseOut マウスが離れた時に発生。
onMouseMove マウスが移動した時に発生。
onChange フォームの内容が変更され、フォーカスを失った時に発生。
onSelect テキストが選択された時に発生。

金曜日, 1月 01, 2010

[JavaScript]加算日付取得

▼質問
JavaScriptにVBのDateAdd関数みたいな加算日付を取得する関数はないの?

▼回答
ないよ!

同じ動作をする関数を作成したから参考にしてくれ!



function DateAdd( interval, number, date )
{
var wDate = new Date( date );
var time = 0;

try {
switch ( interval ) {
case "yyyy":
wDate = new Date( wDate.getFullYear()+number, wDate.getMonth(), wDate.getDate(), wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
break;
case "q":
wDate = new Date( wDate.getFullYear(), wDate.getMonth()+number*3, wDate.getDate(), wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
break;
case "m":
wDate = new Date( wDate.getFullYear(), wDate.getMonth()+number, wDate.getDate(), wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
var compDate = new Date( wDate.getFullYear(), wDate.getMonth()+number, 1, wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
if ( wDate.getMonth() != compDate.getMonth() ) {
wDate.setDate( 1 );
wDate.setTime( wDate.getTime() - (24*60*60*1000) );
}
break;
case "y":
case "d":
case "w":
wDate = new Date( wDate.getFullYear(), wDate.getMonth(), wDate.getDate()+number, wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
break;
case "ww":
wDate = new Date( wDate.getFullYear(), wDate.getMonth(), wDate.getDate()+number*7, wDate.getHours(), wDate.getMinutes(), wDate.getSeconds() );
break;
case "h":
wDate = new Date( wDate.getFullYear(), wDate.getMonth(), wDate.getDate(), wDate.getHours()+number, wDate.getMinutes(), wDate.getSeconds() );
break;
case "n":
wDate = new Date( wDate.getFullYear(), wDate.getMonth(), wDate.getDate(), wDate.getHours(), wDate.getMinutes()+number, wDate.getSeconds() );
break;
case "s":
wDate = new Date( wDate.getFullYear(), wDate.getMonth(), wDate.getDate(), wDate.getHours(), wDate.getMinutes(), wDate.getSeconds()+number );
break;
default:
}
} catch ( e ) {
return date;
}

wDate.setTime( wDate.getTime() + time );

return wDate;
}



■参考サイト
JavaScript による日付・時刻・時間の計算・演算のまとめ - hoge256ブログ
DateAdd 関数
javascriptで日付を加算して表示させるサンプル - 教えて!goo
DateAdd 関数 | VBScript関数リファレンス

金曜日, 12月 18, 2009

[JavaScript]引数が無効です。

▼質問
「div.style.left」「div.style.top」で次のエラーが出る。

「引数が無効です。」

どうしてか教えて!

▼回答
div.style.left = left + "px";
div.style.top = top + "px";

leftとtopの値に数値じゃなくてNaNになっていると出るエラーみたい。

NaNのチェックが要るのね。

と言うことで、JavaScriptでは

isNaN( 文字列または数値 )関数でチェックする必要があるのね。

火曜日, 12月 15, 2009

[JavaScript]selectタグでのelements.type名

▼質問
elementsのtype名でselectタグをselectでチェックしようとしたんだけど

うまくいかなかったんだ。どうしてか教えてくれ!

▼回答
selectタグのtype名は、「select-one」か「select-multiple」なんだ。

他と違うから、気をつけてくれ!




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

<script Language="javascript">
<!--

function testType()
{

with ( document.testForm ) {
for ( var i = 0 ; i < elements.length ; i++ ) {
alert( elements[i].type );
}
}

}

-->
</script>
<title></title>
</head>
<body>
<form name="testForm" method="post">

<input type="button" id="testButton" name="testButton" value="Type名称" onClick="testType();">

<input type="checkbox" id="testCheckbox" name="testCheckbox" value="testCheckbox">
<input type="file" id="testFile" name="testFile" value="testFile">
<input type="hidden" id="testHidden" name="testHidden" value="testHidden">
<input type="password" id="testPassword" name="testPassword" value="testPassword">
<input type="radio" id="testRadio" name="testRadio" value="testRadio">
<input type="reset" id="testReset" name="testReset" value="testReset">
<select id="testSelectOne" name="testSelectOne"><option value="テスト1">テスト1</option><option value="テスト2">テスト2</option><option value="テスト3">テスト3</option></select>
<select id="testSelectMultiple" name="testSelectMultiple" Multiple><option value="テスト1">テスト1</option><option value="テスト2">テスト2</option><option value="テスト3">テスト3</option></select>
<input type="submit" id="testSubmit" name="testSubmit" value="testSubmit">
<input type="text" id="testText" name="testText" value="testText">
<textarea id="testTextarea" name="testTextarea" rows="5" cols="10">テスト</textarea>

</form>

</body>
</html>


土曜日, 12月 12, 2009

[HTML]bodyタグの○○margin(余白)

▼質問
body要素にあるマージン(余白)のデフォルト値っていくつなの?

▼回答
IE(Internet Explorer)とNN(Netscape Navigator)では違うマージンとなっている。
IE:上下10px、左右15px
NN:上下左右8px

■参考サイト
ページの余白を指定する