1つのトランザクションを扱うC APIの場合の記述例について、以下に示します。
/*以下のように用意されていることを仮定しています */ /* personData :追加したい従業員の情報 */ /* query :検索式 */ /* returnQuery:リターン式 */ /* updateData :更新データ */ /* pResultId :レコードIDを保持する構造体配列 */ /* pUpdateId :更新用レコードIDを設定する構造体配列 */ /* コネクションハンドルの割当て */ ret = ShunAllocHandle(NULL, &ConH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* ホスト名・ポート番号・Shunsaku Fileを指定してコネクションを確立 */ ret = ShunConnect(ConH, "DirSvr1", 23101, "FileA"); if(ret != SHUN_SUCCESS) { error("ShunConnect ", ConH); return; } /* 追加用のデータ操作ハンドル割当て */ ret = ShunAllocHandle(ConH, &insertStmtH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* 自動コミットを無効に切替え */ ret = ShunSetConnectAttr(ConH, SHUN_ATTR_AUTOCOMMIT, SHUN_FALSE); if(ret != SHUN_SUCCESS) { error("ShunSetConnectAttr ", ConH); return; } /* データ追加 */ ret = ShunInsert(insertStmtH, 1, personData); if(ret != SHUN_SUCCESS) { error("ShunInsert ", insertStmtH); return; } /*追加用のデータ操作ハンドルの解放 */ ret = ShunFreeHandle(insertStmtH); if(ret != SHUN_SUCCESS) { error("ShunFreeHandle ", insertStmtH); return; } /* Shunsaku FileをFileDに切替え */ ret = ShunSetShunsakuFile(ConH, "FileD"); if(ret != SHUN_SUCCESS) { error("ShunSetShunsakuFile", ConH); return; } /* 検索用のデータ操作ハンドル割当て */ ret = ShunAllocHandle(ConH, &searchStmtH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* 検索を実行 */ ret = ShunSearch(searchStmtH, 1, NULL, 0, 30, query, returnQuery, NULL, &Hit_Cnt, &Return_Cnt, &Returnable_Cnt, &Rec_Id_Out, &Data, &First_Pos, &Last_Pos); if(ret != SHUN_SUCCESS) { error("ShunSearch ", searchStmtH); return; } /* レコードIDを保持 */ for(i=0; i< Return_Cnt; i++) { pResultId[i] = Rec_Id_Out[i]; } /* 検索用のデータ操作ハンドルの解放 */ ret = ShunFreeHandle(searchStmtH); if(ret != SHUN_SUCCESS) { error("ShunFreeHandle ", searchStmtH); return; } /* 更新用のデータ操作ハンドル割当て */ ret = ShunAllocHandle(ConH, &updateStmtH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* 0番目のデータを更新対象とする */ pUpdateId[0] = pResultId[0]; /* データを更新 */ ret = ShunUpdateRecId(updateStmtH, 1, pUpdateId,updateData); if(ret != SHUN_SUCCESS) { error("ShunUpdateRecId", updateStmtH); return; } /* 更新用のデータ操作ハンドルの解放 */ ret = ShunFreeHandle(updateStmtH); if(ret != SHUN_SUCCESS) { error("ShunFreeHandle ", updateStmtH); return; } /* トランザクション終了 */ ret = ShunCommit(ConH); if(ret != SHUN_SUCCESS) { error("ShunCommit ", ConH); return; } /* コネクションの切断*/ ret = ShunDisconnect(ConH); if(ret != SHUN_SUCCESS) { error("ShunDisconnect", ConH); return; } /* コネクションハンドルの解放 */ ret = ShunFreeHandle(ConH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* エラー発生時の処理 */ void error(char* func, SHUNHANDLE handle) { printf( "%s:abnormal end\n", func ); ShunGetErrorMessage(handle, &Err_Level, &Err_Msg); printf("エラーレベル = %d\n", Err_Level); printf("エラーメッセージ = %s\n", Err_Msg); if(ConH != NULL) { ret = ShunRollback(ConH); } ret = ShunFreeHandle(ConH); return; } |