同期サーバー 管理ガイド


リモート照会およびストアード・プロシージャー・アダプターを使用したサンプル・アプリケーション

以下の例では、ストアード・プロシージャー、ストアード・プロシージャーへのサブスクリプション、およびストアード・プロシージャーを使用する 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 ディレクトリーにコピーします。次に、ストアード・プロシージャーを登録します。

  1. DB2 コマンド・ウィンドウをオープンします。
  2. 次のコマンドを使用して、MYSAMPLE データベースに接続します。
    DB2 CONNECT TO MYSAMPLE
    
  3. regscript.scr という名前のスクリプトを使用してストアード・プロシージャーを登録し、オプションを構成します。このスクリプトでは、次のコードを使用します。
    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 が構成されました。次に、モバイル・デバイス管理センターを使用して、サブスクリプションを作成します。

エージェント・アダプター・サブスクリプションの作成

  1. 「スタート」メニューから、モバイル・デバイス管理センターをオープンします。
  2. モバイル・デバイス管理センターの「Subscriptions (サブスクリプション)」フォルダーを選択します。
  3. モバイル・デバイス管理センターの「Subscriptions (サブスクリプション)」フォルダーを右マウス・ボタンでクリックし、「Create Custom Subscription (カスタム・サブスクリプションの作成)」を選択します。
  4. Name (名前)」フィールドで subex と入力します。
  5. Adapter (アダプター)」フィールドで「AgentAdapter」を選択します。
  6. Encryption (暗号化)」フィールドで「None (なし)」を選択します。「AgentAdapter」では暗号化はサポートされていません。
  7. Launch Customizer (カスタマイザーの立ち上げ)」ボタンをクリックします。「Source database (ソース・データベース)」ウィンドウがオープンします。
  8. User ID (ユーザー ID)」フィールドに、データベースへのアクセス権を持つ DB2 のユーザー ID を入力します。
  9. Password (パスワード)」フィールドおよび「Verify password (確認パスワード)」フィールドに、ユーザー ID のパスワードを入力します。
  10. Other (その他)」フィールドで、以下の行を入力します。
    dbname=mysample;procname=db2e.MYPROC
    

    dbname は、ストアード・プロシージャーが使用するデータベースです。procname は、ストアード・プロシージャーの名前です。

  11. OK」をクリックし、「Source database (ソース・データベース)」ウィンドウをクローズします。「OK」をクリックし、「Create Custom Subscription (カスタム・サブスクリプションの作成)」ノートブックをクローズします。

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;
}
 

サンプル・アプリケーションをコンパイルした後で、リモート照会およびストアード・プロシージャー・アダプター・アプリケーションの検査を行います。


ユーザーおよびデータの管理

部分目次

  • モバイル・デバイス管理センターおよび同期オブジェクト
  • モバイル・デバイス管理センターの取り扱い
  • モバイル・デバイス管理センターの開始
  • モバイル・デバイス管理センターのインターフェース
  • 同期オブジェクトの操作
  • 同期オブジェクトの説明
  • 同期オブジェクトが保管される場所
  • 同期オブジェクトの作成
  • オブジェクト・ツリーからのオブジェクトの作成
  • 別のオブジェクトで作業している場合の新規オブジェクトの作成
  • コンテンツ・ペインにおけるオブジェクトの表示
  • 表示される情報
  • 表示の最新表示
  • コンテンツ・ペインのフィルター操作
  • コンテンツ・ペインのソート
  • 同期オブジェクトの編集
  • オブジェクトの削除
  • ユーザーおよびデータの管理
  • 管理プロセス
  • モバイル・ユーザーの特性の評価
  • データ同期グループの作成
  • グループの指定
  • データおよびファイルへのアクセスのためのグループの使用可能化
  • グループに使用可能なデータのフィルター操作
  • グループへのユーザーの割り当て
  • 同期サーバーへのモバイル・ユーザーの定義
  • モバイル・デバイス管理センターでのユーザーの作成
  • ユーザーの指定
  • グループへのユーザーの割り当て
  • ユーザー・パスワードの設定
  • ユーザーが使用可能なデータに対するフィルター操作
  • ユーザー・デバイスの登録
  • 別のソースからのユーザー定義のインポート
  • データおよびファイル複写のセットアップ
  • JDBC サブスクリプションの作成
  • JDBC サブスクリプションの識別
  • 暗号化レベルの指定
  • ソース・データベース・ドライバーおよび URL の指定
  • ミラー・データベース・ドライバーおよび URL の指定
  • サブスクリプションのソース表、ターゲット表、および特権の指定
  • サブスクリプションにおけるデータのフィルター操作
  • 同期要求のバッチ処理
  • JDBC サブスクリプションへのサブスクリプション・セットの割り当て
  • DataPropagator サブスクリプションの作成
  • サブスクリプションの指定
  • 暗号化レベルの指定
  • ソースのターゲットへのマッピング
  • ミラー・データベースの指定
  • レプリケーション・ソースの追加
  • サブスクリプションにおけるデータのフィルター操作
  • 同期要求のバッチ処理
  • サブスクリプションのユーザー ID およびパスワードの指定
  • サブスクリプションを使用するサブスクリプション・セットの指定
  • アップロード・サブスクリプションの作成
  • アップロード・サブスクリプションの指定
  • 暗号化レベルの指定
  • ソース・データベース・ドライバーおよび URL の指定
  • ソース表およびターゲット表の指定
  • アップロード・サブスクリプションへのサブスクリプション・セットの割り当て
  • ファイル・サブスクリプションの作成
  • サブスクリプションの指定
  • 暗号化レベルの指定
  • ソース・ファイル名の指定
  • サブスクリプションを使用するサブスクリプション・セットの指定
  • 変更されたファイルを参照するサブスクリプションにフラグを立てる
  • カスタム・サブスクリプションの作成
  • カスタム・サブスクリプションの識別
  • 暗号化レベルの指定
  • カスタマイザーの立ち上げ
  • カスタム・サブスクリプションへのサブスクリプション・セットの割り当て
  • カスタム・アダプターの作成
  • カスタム・アダプターの識別
  • カスタマイザー・クラス名およびシグニチャーの指定
  • 通信属性の指定
  • ファイル属性の指定
  • オンデマンドの複写
  • データおよびファイルへのアクセスのためのグループの使用可能化
  • サブスクリプション・セットの識別
  • サブスクリプション・セットがアクセスする情報の指定
  • サブスクリプション・セットをグループで使用可能にする
  • 同期の使用可能化および使用不能化
  • ユーザーまたはグループが同期について使用可能になっている場合
  • 同期の使用可能化
  • 同期の使用不能化
  • 同期に関する問題の取り扱い
  • 同期およびエラー・メッセージの受信の順序の理解
  • 問題を診断するエラー・ログの表示
  • エラー・ログおよびトレース・ファイルの管理
  • エラー・ログ・エントリーの自動パージ
  • トレース・レベルの定義
  • 独自のエラー処理論理の作成
  • クライアントでのログの表示
  • ユーザー ID のリセット

  • モバイル・デバイス管理センターおよび同期オブジェクト

    モバイル・ワーカーのデータ同期要求は、たいていの場合、ユーザーのジョブの責任によって異なります。たとえば、看護シフト管理者は、使用中のベッドの情報、および病室での患者の状況にリアルタイムでアクセスする必要があります。交替で働く医師は、その日に診察する患者のリスト、および患者の状況についての情報にアクセスする必要があります。これらの病院の従業員は、病院のエンタープライズ・データに対するモバイル・アクセス権が必要ですが、ジョブを実行する際には異なるアプリケーションおよび異なるデータ・セットを取り扱います。

    DB2 Everyplace 同期サーバーは、類似のデータ同期要求を持ったユーザー・グループに対する同期サービスの管理と提供を行うために役立つ管理ツールを提供します。モバイル・デバイス管理センターによって、ユーザー・グループにどのような情報へのアクセスを許可するか、およびその情報を各ユーザーのモバイル・デバイスにどのように複写するかを定義することができます。

    本章では、モバイル・デバイス管理センターのインターフェースのナビゲート方法、およびモバイル・デバイス管理センターを使用した同期オブジェクトの操作方法について説明します。


    [ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]