Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » Mobile Link クイックスタート » Mobile Link チュートリアル » チュートリアル:ダイレクトローハンドリングの使用

 

レッスン 5:Mobile Link のダイレクトローハンドリングのための Java または .NET クラスの作成

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。 レッスン 1:テキストファイルデータソースの設定を参照してください。

このレッスンでは、ダイレクトローハンドリングを使用して、クライアントデータベース内の OrderComments テーブルのローを処理します。ダイレクトローハンドリング用に次のメソッドを追加します。

  • GetUpload   このメソッドは handle_UploadData イベントに使用します。GetUpload では、アップロードされたコメントを orderComments.txt というファイルに書き込みます。

  • SetDownload   このメソッドは handle_DownloadData イベントに使用します。SetDownload では、orderResponses.txt ファイルを使用してリモートクライアントに応答をダウンロードします。

  • EndDownload   このメソッドを end_download イベントに使用します。EndDownload では、メモリリソースが解放されます。

次の手順では、処理用メソッドを含む Java または .NET のクラスを作成する方法を示します。 完全なリストについては、MobiLinkOrders コードの全リスト (Java)またはMobiLinkOrders コードの全リスト (.NET)を参照してください。

 ♦ ダイレクトローハンドリングのための Java または .NET クラスの作成
  1. Java または .NET で、MobiLinkOrders というクラスを作成します。

    Java の場合は、次のコードを入力します。

    import ianywhere.ml.script.*;
    import java.io.*;
    import java.sql.*;
        
    public class MobiLinkOrders {

    .NET の場合は、次のコードを入力します。

    using iAnywhere.MobiLink.Script;
    using System.IO;
    using System.Data;
    using System.Text;
    
    public class MobiLinkOrders {
  2. クラスレベルの DBConnectionContext インスタンスを宣言します。

    Java の場合は、次のコードを入力します。

        // Class level DBConnectionContext
        DBConnectionContext _cc;

    .NET の場合は、次のコードを入力します。

        // Class level DBConnectionContext
        private DBConnectionContext _cc = null;

    Mobile Link サーバーによって DBConnectionContext のインスタンスがクラスコンストラクターに渡されます。DBConnectionContext には、Mobile Link 統合データベースとの現在の接続に関する情報がカプセル化されます。

  3. ファイル入出力に使用するオブジェクトを宣言します。

    Java の場合は、java.io.FileWriter と java.io.BufferedReader を次のように宣言します。

        // Java objects for file i/o
        FileWriter my_writer;
        BufferedReader my_reader;

    .NET の場合は、StreamWriter と StreamReader を次のように宣言します。

        // Instances for file I/O
        private static StreamWriter my_writer = null;
        private static StreamReader my_reader = null;
  4. クラスコンストラクターを作成します。

    クラスコンストラクターが、クラスレベルの DBConnectionContext インスタンスを設定します。

    Java の場合は、次のコードを入力します。

    public MobiLinkOrders( DBConnectionContext cc )
            throws IOException, FileNotFoundException
        {
            // Declare a class-level DBConnectionContext
            _cc = cc; 

    .NET の場合は、次のコードを入力します。

        public MobiLinkOrders(DBConnectionContext cc) {
            _cc = cc;
        }
  5. GetUpload メソッドを作成します。

    GetUpload メソッドでは、OrderComments テーブルを表す UploadedTableData クラスインスタンスを取得します。OrderComments テーブルには、遠隔地の営業部員による特別なコメントが含まれます。このテーブルはレッスンの後半で作成します。

    UploadedTableData の getInserts メソッドでは、注文に対する新しいコメントの結果セットを返します。writeOrderComment メソッドでは、結果セット内の各ローをテキストファイルに書き出します。

    Java の場合は、次のコードを入力します。



    public void writeOrderComment( int _commentID, int _orderID, String _comments ) 
            throws IOException
        {
            if (my_writer == null)
                // A FileWriter for writing order comments
                my_writer = new FileWriter( "C:\\MLdirect\\orderComments.txt",true);
                  
            // Write out the order comments to remoteOrderComments.txt
            my_writer.write(_commentID + "\t" + _orderID + "\t" + _comments);
            my_writer.write( "\n" );
            my_writer.flush();
        }
        
        //  Method for the handle_UploadData synchronization event
        public void GetUpload( UploadData ut ) 
            throws SQLException, IOException
        {
            // Get an UploadedTableData for OrderComments
            UploadedTableData orderCommentsTbl = ut.getUploadedTableByName("OrderComments");
             
            // Get inserts uploaded by the MobiLink client
            ResultSet insertResultSet = orderCommentsTbl.getInserts();
             
            while ( insertResultSet.next() ) 
            {
                // Get order comments
                int _commentID = insertResultSet.getInt("comment_id");
                int _orderID = insertResultSet.getInt("order_id");
                String _specialComments = insertResultSet.getString("order_comment");              
                if (_specialComments != null) {
                    writeOrderComment(_commentID,_orderID,_specialComments);
                }
            }
            insertResultSet.close();
        }

    .NET の場合は、次のコードを入力します。



        public void WriteOrderComment(int comment_id,
            int order_id,
            string comments)
        {
            if (my_writer == null) {
                my_writer = new StreamWriter("c:\\MLdirect\\orderComments.txt");
            }
            my_writer.WriteLine("{0}\t{1}\t{2}", comment_id, order_id, comments);
            my_writer.Flush();
        }
    
        // Method for the handle_UploadData synchronization event.
        public void GetUpload(UploadData ut) {
            // Get UploadedTableData for remote table called OrderComments
            UploadedTableData order_comments_table_data =
                ut.GetUploadedTableByName("OrderComments");
    
            // Get inserts uploaded by the MobiLink client
            IDataReader new_comment_reader =
                order_comments_table_data.GetInserts();
    
            while (new_comment_reader.Read()) {
                // Columns are
                // 0 - "order_comment"
                // 1 - "comment_id"
                // 2 - "order_id"
                // You can look up these values using the DataTable returned
                // by: order_comments_table_data.GetSchemaTable() if the send 
                // column names option is turned on at the remote. 
                // In this example, you just use the known column order to
                // determine the column indexes
    
                // Only process this insert if the order_comment is not null
                if (!new_comment_reader.IsDBNull(2)) {
                    int comment_id = new_comment_reader.GetInt32(0);
                    int order_id = new_comment_reader.GetInt32(1);
                    string comments = new_comment_reader.GetString(2);
                    WriteOrderComment(comment_id, order_id, comments);
                }
            }
            // Always close the reader when you are done with it!
            new_comment_reader.Close();
        }
  6. SetDownload メソッドを作成します。

    1. OrderComments テーブルを表すクラスインスタンスを取得します。

      DBConnectionContext の getDownloadData メソッドを使用して DownloadData のインスタンスを取得します。DownloadData の getDownloadTableByName メソッドを使用して、OrderComments テーブルの DownloadTableData インスタンスを返します。

      Java の場合は、次のコードを入力します。

          public void SetDownload() 
              throws SQLException, IOException
          {
              DownloadData download_d = _cc.getDownloadData();
               
              DownloadTableData download_td = download_d.getDownloadTableByName( "OrderComments" );

      .NET の場合は、次のコードを入力します。



          private const string read_file_path =
              "c:\\MLdirect\\orderResponses.txt";
      
          // Method for the handle_DownloadData synchronization event
          public void SetDownload() {
              if ((my_reader == null) && !File.Exists(read_file_path)) {
                  System.Console.Out.Write("There is no file to read.");
                  return;
              }
              DownloadTableData comments_for_download =
                  _cc.GetDownloadData().GetDownloadTableByName("OrderComments");
      注意

      OrderComments テーブルは、レッスン 7:Mobile Link クライアントデータベースの設定でリモートデータベースに作成します。

    2. 準備文または IDbCommand を取得します。これを使用すると、ダウンロードに操作を追加、挿入、または更新できます。

      Java の場合は、DownloadTableData の getUpsertPreparedStatement メソッドを使用して java.sql.PreparedStatement のインスタンスを次のように返します。

      PreparedStatement update_ps = download_td.getUpsertPreparedStatement();

      .NET の場合は、DownloadTableData の GetUpsertCommand メソッドを次のように使用します。

              // Add upserts to the set of operation that are going to be 
              // applied at the remote database
              IDbCommand comments_upsert =
                  comments_for_download.GetUpsertCommand();
      
    3. 各ローのダウンロードデータを設定します。

      このコードは、orderResponses.txt を参照して、Mobile Link ダウンロードにデータを追加しています。

      Java の場合は、次のコードを入力します。



      try {
      	    // A BufferedReader for reading in responses
      	    if (my_reader == null)
      		my_reader = new BufferedReader(new FileReader("C:\\MLdirect\\orderResponses.txt"));
      	    
      	    // Get the next line from orderResponses
      	    String commentLine;
      	    commentLine = my_reader.readLine();
      	    
      	    // Send comment responses down to clients
      	    while (commentLine != null) {
      		// Get the next line from orderResponses.txt
      		String[] response_details = commentLine.split("\t");
      		
      		if (response_details.length != 3) {
      		    System.err.println("Error reading from orderResponses.txt");
      		    System.err.println("Error setting direct row handling download");
      		    return;
      		}
      		int comment_id = Integer.parseInt(response_details[0]);
      		int order_id = Integer.parseInt(response_details[1]);
      		String updated_comment = response_details[2];
      		
      		// Set an order comment response in the MobiLink download
      		update_ps.setInt(1, comment_id);
      		update_ps.setInt(2, order_id);
      		update_ps.setString(3, updated_comment);
      		update_ps.executeUpdate();
      		
      		// Get next line
      		commentLine = my_reader.readLine();
      	    }
      	} 

      .NET の場合は、次のコードを入力します。



              if (my_reader == null) {
                  my_reader = new StreamReader(read_file_path);
              }
              string comment_line;
              while ((comment_line = my_reader.ReadLine()) != null) {
                  // Three values are on each line separated by '\t'
                  string[] response_details = comment_line.Split('\t');
                  if (response_details.Length != 3) {
                      throw (new SynchronizationException(
                          "Error reading from orderResponses.txt"));
                  }
                  int comment_id = System.Int32.Parse(response_details[0]);
                  int order_id = System.Int32.Parse(response_details[1]);
                  string comments = response_details[2];
      
                  // Parameters of the correct number and type have 
                  // already been added so you just need to set the 
                  // values of the IDataParameter
                  ((IDataParameter)(comments_upsert.Parameters[0])).Value =
                      comment_id;
                  ((IDataParameter)(comments_upsert.Parameters[1])).Value =
                      order_id;
                  ((IDataParameter)(comments_upsert.Parameters[2])).Value =
                      comments;
                  // Add the upsert operation
                  comments_upsert.ExecuteNonQuery();
              }
          }
    4. ダウンロードに挿入操作または更新操作を追加する準備文を終了します。

      Java の場合は、次のコードを入力します。

      finally {
          update_ps.close();
         }
      }

      .NET の場合、IDbCommand を閉じる必要はありません。オブジェクトは、ダウンロードの終わりに自動的に破棄されます。

  7. EndDownload メソッドを作成します。

    このメソッドでは、end_download 接続イベントを処理し、またリソースを解放できます。

    Java の場合は、次のコードを入力します。



        public void EndDownload() 
            throws IOException
        {
            // Close i/o resources
            if (my_reader != null) {
                my_reader.close();
                my_reader = null;
            }
            if (my_writer != null) {
                my_writer.close();
                my_writer = null;
            }
        }

    .NET の場合は、次のコードを入力します。



        public void EndDownload()
        {
            if (my_writer != null) {
                my_writer.Close();
                my_writer = null;
            }
            if (my_reader != null) {
                my_reader.Close();
                my_reader = null;
            }
        }
    }
  8. コードを保存します。

    Java の場合は、コードを MobiLinkOrders.java という名前で作業ディレクトリ c:\MLdirect に保存します。

    .NET の場合は、コードを MobiLinkOrders.cs という名前で作業ディレクトリ c:\MLdirect に保存します。

  9. コードを検証する場合は、MobiLinkOrders コードの全リスト (Java)またはMobiLinkOrders コードの全リスト (.NET)を参照してください。

  10. クラスファイルをコンパイルします

    1. Java または .NET のソースファイルが含まれるディレクトリに移動します。

    2. MobiLinkOrders をコンパイルし、Java または .NET 用の Mobile Link サーバー API ライブラリを参照します。

      Java の場合、%SQLANY12%\java にある mlscript.jar を参照する必要があります。

      Java の場合は、次のコマンドを実行して、C:\Program Files\SQL Anywhere 12\ を SQL Anywhere 12 ディレクトリに置き換えます。

      javac -classpath "C:\Program Files\SQL Anywhere 12\java\mlscript.jar" MobiLinkOrders.java

      .NET の場合は、次のコマンドを実行して、C:\Program Files\SQL Anywhere 12\ を SQL Anywhere 12 ディレクトリに置き換えます。

      csc /out:MobiLinkServerCode.dll /target:library /reference:"C:\Program Files\SQL Anywhere 12\Assembly\v2\iAnywhere.MobiLink.Script.dll" MobiLinkOrders.cs
    注意

    この例では、プライマリキーの値がユニークとはかぎりません。 ユニークなプライマリキーを参照してください。

  11. レッスン 6:Mobile Link サーバーの起動に進みます。

 参照

MobiLinkOrders コードの全リスト (Java)
MobiLinkOrders コードの全リスト (.NET)