次の方法で共有


この Microsoft SQL Server JDBC Driver サンプル アプリケーションは、データベース内の大きな列値を更新する方法を示しています。

このサンプルのコード ファイルは updateLargeData.java という名前で、次の場所にあります。

<インストール ディレクトリ>\sqljdbc_<バージョン>\<言語>\help\samples\adaptive

必要条件

このサンプル アプリケーションを実行するには、SQL Server 2005 AdventureWorks サンプル データベースへのアクセス権が必要です。また、クラスパスの設定で sqljdbc4.jar ファイルを追加する必要があります。クラスパスに sqljdbc4.jar のエントリがない場合、サンプル アプリケーションで "Class not found" という一般的な例外がスローされます。クラスパスの設定方法の詳細については、「JDBC ドライバーの使用」を参照してください。

注メモ :

Microsoft SQL Server JDBC Driver Version 2.0 には、sqljdbc.jar と sqljdbc4.jar という 2 つのクラス ライブラリ ファイルが用意されており、必要な Java ランタイム環境 (JRE) 設定によって自由に使い分けることができます。このサンプルは、JDBC 4.0 API で導入された isWrapperFor メソッドと unwrap メソッドを使用して、ドライバー固有の応答バッファリング メソッドにアクセスします。このサンプルをコンパイルして実行するには、JDBC 4.0 をサポートする sqljdbc4.jar クラス ライブラリが必要となります。選択する JAR ファイルの詳細については、「JDBC ドライバーのシステム要件」を参照してください。

次の例のサンプル コードでは、SQL Server 2005 AdventureWorks データベースへの接続を行います。さらに、Statement オブジェクトを作成し、isWrapperFor メソッドを使用して、Statement オブジェクトが、指定された SQLServerStatement クラスのラッパーであるかどうかをチェックします。ドライバー固有の応答バッファリング メソッドにアクセスするために、unwrap メソッドが使用されています。

次に、SQLServerStatement クラスの setResponseBuffering メソッドを使用して、応答バッファリング モードを "adaptive" に設定します。サンプル コードを見ると、アダプティブ バッファリング モードの取得方法も確認できます。

さらに、SQL ステートメントを実行し、返されたデータを更新可能な SQLServerResultSet オブジェクトに設定しています。

最後に、結果セットに格納されているデータ行を反復処理します。空のドキュメント概要が見つかった場合、updateString メソッドと updateRow メソッドを組み合わせて使用して、データの行を更新し、再度データベースに格納します。既にデータが存在する場合は、getString メソッドを使用して、格納されているデータの一部が表示されます。

JDBC Driver Version 2.0 リリース以降では、"adaptive." がドライバーの既定の動作です。ただし、順方向専用の更新可能な結果セットの場合で、なおかつ、結果セットのデータのサイズが、アプリケーションのメモリ容量を超える場合は、SQLServerStatement クラスの setResponseBuffering メソッドを使用して、アプリケーションからアダプティブ バッファリング モードを明示的に設定する必要があります。

import java.sql.*;
import java.io.*;
import com.microsoft.sqlserver.jdbc.SQLServerStatement;

public class updateLargeData {
    
   public static void main(String[] args) {

      // Create a variable for the connection string.
      String connectionUrl = 
            "jdbc:sqlserver://localhost:1433;" +
            "databaseName=AdventureWorks;integratedSecurity=true;";

      // Declare the JDBC objects.
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;  
      Reader reader = null;
           
      try {
          // Establish the connection.
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
          con = DriverManager.getConnection(connectionUrl);
         
          stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

          // Since the summaries could be large, make sure that
          // the driver reads them incrementally from a database, 
          // even though a server cursor is used for the updatable result sets.
          
          // The recommended way to access the Microsoft SQL Server JDBC Driver 
          // specific methods is to use the JDBC 4.0 Wrapper functionality. 
          // The following code statement demonstrates how to use the 
          // Statement.isWrapperFor and Statement.unwrap methods
          // to access the driver specific response buffering methods.
          
          if (stmt.isWrapperFor(com.microsoft.sqlserver.jdbc.SQLServerStatement.class)) {
              SQLServerStatement SQLstmt = 
                 stmt.unwrap(com.microsoft.sqlserver.jdbc.SQLServerStatement.class);
              
              SQLstmt.setResponseBuffering("adaptive");
              System.out.println("Response buffering mode has been set to " +
                 SQLstmt.getResponseBuffering());
          }

          // Select all of the document summaries.
          rs = stmt.executeQuery("SELECT Title, DocumentSummary FROM Production.Document");

          // Update each document summary.
          while (rs.next()) {

               // Retrieve the original document summary.
               reader = rs.getCharacterStream("DocumentSummary");

               if (reader == null)
               {
                   // Update the document summary.
                   System.out.println("Updating " + rs.getString("Title"));
                   rs.updateString("DocumentSummary", "Work in progress");
                   rs.updateRow();
               }
               else
               {
                   // Do something with the chunk of the data that was                   
                   // read.
                   System.out.println("reading " + rs.getString("Title"));
                   reader.close();
                   reader = null;
               }
          }
      }
      // Handle any errors that may have occurred.
      catch (Exception e) {
         e.printStackTrace();
      }
      finally {
          if (reader != null) try { reader.close(); } catch(Exception e) {}
          if (rs != null) try { rs.close(); } catch(Exception e) {}
          if (stmt != null) try { stmt.close(); } catch(Exception e) {}
          if (con != null) try { con.close(); } catch(Exception e) {}
      }
   }
}

参照

その他の技術情報

大きなデータの処理