|
Java Btrieve アプリケーションを作成するには、まず以下の手順に従います。
環境が、環境設定の方法で説明しているように正しくセットアップされているかどうかを確認する必要があります。
また、psql.jar が CLASSPATH 環境変数内にあるかどうかを確認します。この手順は、インストール手順で既に実行しているはずです。Pervasive Java インターフェイス クラス ライブラリ内のクラスにアクセスするには、Java ソース ファイルにパッケージをインポートする必要があります。
現在、Pervasive Java インターフェイスのクラス ライブラリは、データベースとデータベース テーブルの作成をサポートしていません。これらの作業を実行するには Pervasive Control Center を使用します。データベースのデータ辞書ファイル(DDF)およびデータ ファイルを作成したら、Java API クラスを使用してテーブルを追加してアクセスすることができます。
Pervasive Control Center とテーブルの作成の詳細については、『Pervasive PSQL User's Guide』を参照してください。
Pervasive データベースに接続するには、エンジンに直接接続します。
btrv:///dbname
を含めてください。
データベースからのテーブルの検索
ここで、「MyTable」 はデータベース テーブルの名前です。テーブル名では大文字と小文字を区別します。
また、データベースのテーブル名のリストを取得することもできます。
Table オブジェクトのプロパティにアクセスするには
Table オブジェクトがあれば、TableMetaData オブジェクトからの列とインデックスに関する情報が得られます。
いくつかの例を以下に示します。
// 列数を取得する int num_columns = tmd.getColumnCount(); // 列 0 のデータ型を取得する int data_type = tmd.getColumnDef(0).getType()); // 列 0 の列の長さを文字数で取得する int col_length = tmd.getColumnDef(0).getOffset();
Table オブジェクトの行にアクセスするには
Table の行にアクセスするには、Table オブジェクトでしか作成できない RowSet オブジェクトが必要です。
同じテーブルから複数の RowSet オブジェクトを作成できます。RowSet オブジェクトは、テーブルの行を取得したり、新しい行を挿入したり、既存の行を削除および更新する場合に使用します。すべてのテーブルの行を繰り返し取得するには、RowSet オブジェクトを作成し、PsqlEOFException が発生するまで getNext() を呼び出します。
Rowset オブジェクトのプロパティにアクセスするには
RowSet オブジェクトがあれば、RowSetMetaData から RowSet に関する情報を得ることができます。
詳細については、Pervasive PSQL Java Class Library リファレンス(Javadoc)の RowSetMetaData クラスのメソッドを参照してください。
前に示したように、getNext メソッドを繰り返し呼び出し、行セットのすべての行を取得することができます。行セットの RowSetMetaData オブジェクトの direction プロパティを変更すれば、後方へ繰り返すことができます。
このプロパティを設定した後、getNext メソッドの動作は getPrevious になります。
メモ
以下の手順に示すように、行セットのカレンシーは、いつでもリセットして、最初の行の前または最後の行の後になるようにすることができます。これは、行セット全体を繰り返さなくても、最初の行または最後の行を取得できる効率的な方法です。
行セット内の最初の行を取得するには
行セット内の最後の行を取得するには
Row オブジェクトの列データにアクセスするには
Row オブジェクトは、Buffer クラスから多数の accessor メソッドまたは mutator メソッドを継承します。これらのメソッドで、Row オブジェクトのバッファーに対して列データを設定または取得できます。
行セット内の行を制限またはフィルター処理するには
行セットの行を制限またはフィルター処理するには、RowSetMetaData の addFirstTerm、addOrTerm、および addAndTerm を使用する必要があります。たとえば、テーブルの最初の列に整数データが入っていて、その最初の列の値が 23 より大きい行をすべて取得する場合は、以下の手順に従います。
RowSetMetaData の addOrTerm および addAndTerm を使用して項目を追加することができます。これらのメソッドを使用すれば、SQL の WHERE 句と同じように、さらに複雑なフィルター処理を設定できます。
行セットから列を選択するには
RowSetMetaData のメソッド addColumns および dropColumns を使用すれば、SQL の SELECT ステートメントと同じように、取得する列のサブセットを指定できます。noColumns パラメーターを True に設定して行が作成されていない限り、デフォルトでは、行セットはすべての列データを取得します。
この場合、列は取得されません。その代わり、行セットを作成後、行の一部または全部を削除できます。
次に、対象の列のセットを行セットに追加できます。
行セットに列を追加するには、列名または列番号を使用できます。詳細については、Pervasive PSQL Java Class Library リファレンス(Javadoc)の RowSetMetaData クラスの addColumns メソッドと dropColumns メソッドの項を参照してください。
列番号で行内の列データにアクセスする場合、列番号は addColumns メソッドと dropColumns メソッドによって生成される新しい順序の影響を受けるので、注意してください。たとえば、FirstName は最初は行セットの列番号 3 であった場合、すべての列を削除した後に LastName と FirstName を追加すると、FirstName の列番号は 1 になります。
インデックスで行を取得するには
定義されたインデックスを比較演算子と共に使用すれば、行を取得できます。たとえば、インデックス Last_Name が仮想テーブルの LastName 列で作成されている場合、以下のことを実行して Smith という LastName を持つ行を検索することができます。
インデックスが重複キー値を許可する場合は、比較演算子に適合する最初の行が返されます。返された行は現在の行になるので、インデックスに基づいて、行セットの getNext メソッドで次の論理行を取得できます。
テーブルの TableMetaData オブジェクトからインデックス名のリストを取得できます。
インデックスに名前を付けなくてもよいことに注意してください。その場合、代わりにインデックス番号を使用してください。インデックス番号はゼロから始まります。
新しい行を挿入するには
行またはレコードを更新するには
次に示すように NCC(No-currency-change:カレンシー変更なし)が示されていない場合は、insertRow のように、新しく更新された行が行セットの現在の行になります。
行またはレコードを削除するには
削除する行は、現在の行、つまり、最終取得オペレーションから返された行である必要はありません。削除する行が現在の行でない場合、deleteRow メソッドはその行を現在の行にした後削除します。削除後、getNext を呼び出すと、その削除された行の後の行が返されます。
トランザクションを使用すると、一連のオペレーションを 1 つのオペレーションに結合し、これをコミットまたは中止することができます。
一連のオペレーションをトランザクションにするには
Session クラスのトランザクション メソッドを使用して、一連のオペレーションをトランザクションにすることができます。
次に、トランザクションの例を示します。
トランザクションは「排他的」にすることも「並列」にすることもできます。トランザクションの詳細については、『Pervasive PSQL Programmer's Guide』を参照してください。
setObject()および getObject()メソッドは、java io Serializable インターフェイスを実装する Java オブジェクトを格納および取得するのに使用できます。setBinaryStream()および getBinaryStream()メソッドは、Java InputStreams を使用したバイナリ データの格納および取得に使用できます。次のインターフェイスを持つ「単純な」Employee オブジェクトがあるとします。
public class Employee implements java.io.Serializable public int getID(); // Employee の ID を取得する public void setID(int ID); // Employee の ID を設定する public String getName(); // Employee の名前を取得する public void setName(String name); // Employee の名前を 設定する public String getManagerName(); //Manager の名前を取得する public void setManagerName(); //Manager の名前を設定する
また、C:¥Employees¥Java Duke¥report.txt というファイルが存在し、読み込めるとします。この場合、Employee オブジェクトのインスタンスを作成し、さまざまなメソッドを使用して設定を行い、データベースの Employee_Data 列に格納することができます。さらに、そのファイルを Manager_Report 列に格納することもできます。
//通常のセットアップ(Driver.establishSession など)および //employeeObject という名前の Employee オブジェクトの //インスタンスの作成は完了済み employeeObject.setName("Java Duke"); employeeObject.setID(123456789); employeeObject.setManagerName("Big Boss"); FileInputStream managerReport = null; try { managerReport = new FileInputStream(C:¥Employees¥Java Duke¥report.txt); } catch(IOException ioe) { // 例外処理 } // その行の列値を設定する // RowSet object (行セット)が既に // 作成されているものとする Row employeeRow = rowset.createRow(); // データベースの ID 列を設定する employeeRow.setInt("ID", employeeObject.getID()); // Employee オブジェクトを行に設定する try { employeeRow.setObject("Employee_Data", employeeObject); } catch(PsqlIOException pioe) { // 例外処理 } // マネージャーのレポートを行に設定する employeeRow.setBinaryStream("Manager_Report", managerReport); // 行を挿入する rowset.insertRow(employeeRow); // これで、データベースからこの行を取得することができる RowSetMetaData rsmd = rowset.getRowSetMetaData(); ColumnDef cdef = rsmd.getColumnDef("ID"); rsmd.addFirstTerm(cdef, Consts.BTR_EQ, "123456789"); Row rowRetrieved = rowset.getNext(); // 行の取得後、その行に getObject および getBinaryStream // メソッドを使用して目的のデータを取得することができる try { Employee employeeRetrieved = (Employee)rowRetrieved.getObject("Employee_Data"); } catch(PsqlException pe) // このメソッドは PsqlIOException および // PsqlClassNotFoundException の両方をスローする { // 例外処理 } InputStream reportRetrieved = rowRetrieved.getBinaryStream("Manager_Report"); // これらのオブジェクトはこれで再構成された // オブジェクト自体または親オブジェクトに定義されたメソッドを // 起動することができる String managerName = employeeRetrieved.getManagerName(); // 通常はファイル全体を 1 つのチャンクで処理することは // あまりないが、リソースがあれば可能 byte file[] = new byte[reportRetrieved.available()]; reportRetrieved.read(file);
詳細については、バイナリ ラージ オブジェクトのサポートを参照してください。
|