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

SAP Sybase SQL Anywhere 16.0 (中文) » MobiLink - 入门 » MobiLink 教程 » 教程:使用直接行处理

 

第 5 课:创建 Java 或 .NET 类以实现 MobiLink 直接行处理

在本课中,您将使用直接行处理来处理客户端数据库的 OrderComments 表中的行。

前提条件

本课假定您已完成前面的所有课程。 请参见第 1 课:建立文本文件数据源

本课假定您拥有在教程教程:使用直接行处理开头的权限部分中列出的角色和特权。

上下文和注释

为直接行处理添加以下方法:

  • GetUpload   此方法用于 handle_UploadData 事件。GetUpload 将上载的注释写入名为 orderComments.txt 的文件中。

  • SetDownload   此方法用于 handle_DownloadData 事件。SetDownload 使用 orderResponses.txt 文件来下载对远程客户端的响应。

  • EndDownload   此方法用于 end_download 事件。EndDownload 可释放内存资源。

以下过程介绍如何创建 Java 或 .NET 类,其中包括用于处理的方法。 有关完整列表,请参见完整的 MobiLinkOrders 代码列表 (Java)完整的 MobiLinkOrders 代码列表 (.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;

    MobiLink 服务器会将 DBConnectionContext 实例传递到类构造函数。DBConnectionContext 封装有关与 MobiLink 统一数据库的当前连接的信息。

  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
            using( 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(). 
                                    // In this example, you just use the known column order to
                                    // determine the column indexes; alternatively, you could use 
                                    // the column names
                                    
                                    // 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);
                                    }
                        }
                    }
        }
  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");
      注意

      您将在第 7 课:建立 MobiLink 客户端数据库中于远程数据库上创建 OrderComments 表。

    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 并将数据添加到 MobiLink 下载。

      对于 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 EndSync() 
            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 EndSync()
        {
            if (my_writer != null) {
                my_writer.Close();
                my_writer = null;
            }
            if (my_reader != null) {
                my_reader.Close();
                my_reader = null;
            }
        }
    
  8. 保存您的代码。

    对于 Java,在工作目录 c:\MLdirect 中将代码另存为 MobiLinkOrders.java

    对于 .NET,在工作目录 c:\MLdirect 中将代码另存为 MobiLinkOrders.cs

  9. 要验证该代码,请参见完整的 MobiLinkOrders 代码列表 (Java)完整的 MobiLinkOrders 代码列表 (.NET)

  10. 编译您的类文件。

    1. 浏览到包含 Java 或 .NET 源文件的目录。

    2. 编译 MobiLinkOrders 并引用面向 Java 或 .NET 的 MobiLink 服务器 API 库。

      对于 Java,需要引用位于 %SQLANY16%\java 中的 mlscript.jar

      对于 Java,运行以下命令,将 C:\Program Files\SQL Anywhere 16\ 替换为 SQL Anywhere 16 目录:

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

      对于 .NET,运行以下命令,将 C:\Program Files\SQL Anywhere 16\ 替换为 SQL Anywhere 16 目录:

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

    此示例并不保证主键值是唯一的。 请参见唯一主键

结果

已创建用于 MobiLink 直接行处理的 Java 或 .NET 类。

 另请参见

完整的 MobiLinkOrders 代码列表 (Java)
完整的 MobiLinkOrders 代码列表 (.NET)