以下の例では、ストアード・プロシージャー、ストアード・プロシージャーへのサブスクリプション、およびストアード・プロシージャーを使用する DB2 Everyplace アプリケーションを作成します。サンプル・アプリケーションの目的は、モバイル・ユーザーが、DB2 Everyplace のリモート・ストアード・プロシージャー呼び出しを使用して、勘定残高、および普通預金と当座預金の間での振替を検査できるようになることです。 DB2 ユニバーサル・データベースでのストアード・プロシージャーの作成方法については、「DB2 ユニバーサル・データベース アプリケーション開発ガイド」を参照してください。
データ・ソースの作成
この例では、MYSAMPLE という名前の DB2 データベースを使用します。手動で MYSAMPLE データベースを作成する必要があります。MYSAMPLE データベースを作成するには、DB2 コマンド・プロンプトで以下のステートメントを入力してください。
CREATE table db2e.MYACCOUNT ( Name char(16), Saving int, Checking int) INSERT into db2e.MYACCOUNT values('Michael', 5000, 5000) INSERT into db2e.MYACCOUNT values('Frank', 5000, 5000)
データベースを作成した後で、ストアード・プロシージャーを作成し、データベースのデータを変更します。
ストアード・プロシージャーの作成
この例では、MYPROC() という名前のストアード・プロシージャーを使用します。ここでは、口座名、オプション、振替額、預金残高、当座預金残高の 5 つのパラメーターを使用します。以下のリストでは、各パラメーターの目的を示しています。
口座名: 口座を識別する入力パラメーター。 オプション: 実行する内容を判別する入力パラメーター。3 つのオプションがある。 1: 残高照会 2: 当座預金から普通預金への振替 3: 普通預金から当座預金への振替 振替額: 当座預金と普通預金の間で振り替えた合計金額の入力パラメーター。 普通預金残高: 普通預金口座の残高を戻す出力パラメーター。 当座預金残高: 当座預金口座の残高を戻す出力パラメーター。
ストアード・プロシージャーを構築するコードを以下に示します。
SQL_API_RC SQL_API_FN myProc(char * szName, int * nCmd, int * nAmount, int * nSaving, int * nChecking) { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN rc; int nRetSize; SQLCHAR str1[]="select saving, checking from db2e.myaccount where name = ?"; SQLCHAR str2[]="update db2e.myaccount set saving=saving - ?, checking=checking + ? where name=?"; SQLCHAR str3[]="update db2e.myaccount set saving=saving + ?, checking=checking - ? where name=?"; //**************************************************************** //* Prepare connection and statement //**************************************************************** rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); //checkerror rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc); //checkerror rc = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, SQL_NTS); //checkerror rc = SQLConnect(hdbc, NULL, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS); //checkerror rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt); //checkerror //**************************************************************** //* Update account //**************************************************************** if ( *nCmd == 2 || *nCmd == 3 ){ if ( *nCmd == 2 ){ //Transfer from saving to checking rc = SQLPrepare(hstmt, str2, SQL_NTS); //checkerror } if ( *nCmd == 3 ){ //Transfer from checking to saving rc = SQLPrepare(hstmt, str3, SQL_NTS); //checkerror } rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)nAmount, 0, NULL ); //checkerror rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)nAmount, 0, NULL ); //checkerror rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (SQLPOINTER)szName, 0, NULL ); //checkerror rc = SQLExecute(hstmt); //checkerror } //**************************************************************** //* Retrieve account balance //**************************************************************** rc = SQLPrepare(hstmt, str1, SQL_NTS); //checkerror rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (SQLPOINTER)szName, 0, NULL );//checkerror rc = SQLExecute(hstmt);//checkerror if ( rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO ) { while ( (rc = SQLFetch(hstmt) ) == SQL_SUCCESS ){ rc = SQLGetData( hstmt, (SQLSMALLINT)1, SQL_C_LONG, nSaving, sizeof(int) , &nRetSize ) ; //checkerror rc = SQLGetData( hstmt, (SQLSMALLINT)2, SQL_C_LONG, nChecking, sizeof(int) , &nRetSize ) ; //checkerror } } //**************************************************************** //* Clean up //**************************************************************** rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return (0); }
Windows 32 ビット版プラットフォームでは、ストアード・プロシージャーをビルドして、ダイナミック・リンク・ライブラリー (mydll.dll) に組み込んだ後で、¥SQLLIB¥function ディレクトリーにコピーします。次に、ストアード・プロシージャーを登録します。
DB2 CONNECT TO MYSAMPLE
CREATE PROCEDURE db2e.MYPROC (IN szName CHAR(16), IN nCmd INTEGER, IN nAmount INTEGER, OUT nSaving INTEGER, OUT nChecking INTEGER ) DYNAMIC RESULT SETS 1 LANGUAGE C PARAMETER STYLE GENERAL NO DBINFO FENCED MODIFIES SQL DATA PROGRAM TYPE SUB EXTERNAL NAME 'mydll!myProc'@
スクリプトを実行するために、次のコマンドを入力します。
db2 -td@ -vf regscript.scr
これで、ストアード・プロシージャー db2e.MYPROC が構成されました。次に、モバイル・デバイス管理センターを使用して、サブスクリプションを作成します。
エージェント・アダプター・サブスクリプションの作成
dbname=mysample;procname=db2e.MYPROC
dbname は、ストアード・プロシージャーが使用するデータベースです。procname は、ストアード・プロシージャーの名前です。
AgentAdapter サブスクリプションを作成した後で、ユーザー、グループ、およびサブスクリプション・セットを作成します。
リモート照会およびストアード・プロシージャー・アダプターを使用する DB2 Everyplace アプリケーションの作成
このサンプルでは、DB2 Everyplace Windows 32 ビット版コンソール・アプリケーションを使用して、リモート照会およびストアード・プロシージャー・アダプターを検査します。サンプル・アプリケーションは myclient.exe です。サンプル・アプリケーションでは、次の 3 つのパラメーターを使用します。
口座名: アクセスする口座を識別する。 オプション: 実行するアクションを識別する。オプションは以下のとおりです。 1: 残高照会 2: 普通預金から当座預金への振替 3: 当座預金から普通預金への振替 合計金額: 当座預金と普通預金の間で振り替えた合計金額。
たとえば、Michael の普通預金口座から当座預金口座に $1000 を振り替えるには、次のコマンドを入力します。
myclient.exe Michael 2 1000
次のような応答が戻されます。
Saving = 4000 Checking = 6000
サンプル・アプリケーション・コード
次のセクションでは、サンプル・アプリケーションのコードを示します。このコードは、リモート・データ・ソースに接続する SQLConnect() 関数の接続ストリングを必要とします。接続ストリングの形式は、次のとおりです。
http://IPAddr:port/db2e/servlet/com.ibm.mobileservices.adapter.agent.AgentServlet?DB=mysample
ここで、IPAddr:port はサーバーの IP アドレスおよびポート番号です。たとえば、次のとおりです。
http://192.168.0.11:8080/db2e/servlet/ com.ibm.mobileservices.adapter.agent.AgentServlet?DB=mysample
int main(int argc, char * argv[]) { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN rc; SQLCHAR strSQL[] = "CALL db2e.MYPROC(?,?,?,?,?)"; int nInd4, nInd5; int nSaving = 0, nChecking =0 ; int nCmd =0, nAmount=0; SQLCHAR strConnect[254]; //**************************************************************** //* Check input parameters //**************************************************************** if ( argc < 4 ){ printf("¥nUsage : myClient AccountName Cmd Amount"); printf("¥n cmd 1 : query balance"); printf("¥n cmd 2 : Transfer from Saving to Checking"); printf("¥n cmd 3 : Trnasfer from Checking to Saving"); return (99); } nCmd = atoi(argv[2]); nAmount = atoi(argv[3]); //**************************************************************** //* Allocate handles //**************************************************************** rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); //checkerror rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc); //checkerror if (argc == 5){ strcpy(strConnect,"http://"); strcat(strConnect,argv[4]); strcat(strConnect,"/db2e/servlet/com.ibm.mobileservices.adapter.agent.AgentServlet?DB=mysample"); }else{ strcpy(strConnect,"http://127.0.0.1:8080/db2e/servlet/com.ibm.mobileservices .adapter.agent.AgentServlet?DB=mysample"); } //**************************************************************** //* Connect to remote database //**************************************************************** rc = SQLConnect(hdbc, strConnect, SQL_NTS, "userex", SQL_NTS, "userex", SQL_NTS ); //checkerror rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt); //checkerror //**************************************************************** //* Prepare, Bind , and Execute the statement //**************************************************************** rc = SQLPrepare(hstmt,strSQL, SQL_NTS); //checkerror rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (SQLPOINTER)argv[1], 0, NULL ); //checkerror rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nCmd, sizeof(int), NULL); //checkerror rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nAmount, sizeof(int), NULL ); //checkerror rc = SQLBindParameter(hstmt, 4, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nSaving, sizeof(int), &nInd4); //checkerror rc = SQLBindParameter(hstmt, 5, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nChecking, sizeof(int), &nInd5 ); //checkerror rc = SQLExecute(hstmt); //checkerror //**************************************************************** //* Print the balance //**************************************************************** printf("¥nSaving = %d",nSaving); printf("¥nChecking = %d",nChecking); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }
サンプル・アプリケーションをコンパイルした後で、リモート照会およびストアード・プロシージャー・アダプター・アプリケーションの検査を行います。
モバイル・ワーカーのデータ同期要求は、たいていの場合、ユーザーのジョブの責任によって異なります。たとえば、看護シフト管理者は、使用中のベッドの情報、および病室での患者の状況にリアルタイムでアクセスする必要があります。交替で働く医師は、その日に診察する患者のリスト、および患者の状況についての情報にアクセスする必要があります。これらの病院の従業員は、病院のエンタープライズ・データに対するモバイル・アクセス権が必要ですが、ジョブを実行する際には異なるアプリケーションおよび異なるデータ・セットを取り扱います。
DB2 Everyplace 同期サーバーは、類似のデータ同期要求を持ったユーザー・グループに対する同期サービスの管理と提供を行うために役立つ管理ツールを提供します。モバイル・デバイス管理センターによって、ユーザー・グループにどのような情報へのアクセスを許可するか、およびその情報を各ユーザーのモバイル・デバイスにどのように複写するかを定義することができます。
本章では、モバイル・デバイス管理センターのインターフェースのナビゲート方法、およびモバイル・デバイス管理センターを使用した同期オブジェクトの操作方法について説明します。