ヘッダーをスキップ
Oracle® Database Express Edition 2日で.NET開発者ガイド
11g リリース2 (11.2)
B66468-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

3 ODP.NETによる単純な.NETアプリケーションの作成

この章の内容は次のとおりです。

新しいプロジェクトの作成

Visual Studioでは、作成するすべての開発コードがグループ化され、プロジェクトと呼ばれるコンテナに入れられます。単純なプロジェクトのほとんどは、1つのファイルのみで構成されます。この項では、新しい開発プロジェクトの作成方法を説明します。

この章で作成するアプリケーションは、後続の章で行う操作の開始点になるため、このマニュアルに示す順に操作してください。

注意: 必要に応じて、Visual C#またはVisual Basicが指定されています。

新しいプロジェクトを開始するには、次の手順を実行します。

  1. Visual Studioを起動します。

    「スタート」メニューを開き、「すべてのプログラム」から「Microsoft Visual Studio 2008」を選択します。

    connect00.gifの説明が続きます。
    connect00.gifの説明

    Microsoft Visual Studio IDE環境が表示されます。

  2. 「Start Page」の「Recent Projects」ヘッダーの下にある「Create: Project」をクリックします。

    または、「File」メニューから「New」「Project」の順に選択します。

    「New Project」ダイアログ・ボックスが表示されます。

  3. 「Project Types」で、作成するプロジェクトの種類を選択します。

    Visual C#:

    Visual C#: Windows

    Visual Basic:

    Other Languages: Visual Basic: Windows

  4. 「Templates」で「Windows Forms Application」を選択します。

  5. 「Name」フィールドに適切な名前を入力します。

    Visual C#:

    HR_Connect_CS

    Visual Basic:

    HR_Connect_VB

    略語のCSはC#プロジェクトを、VBはVisual Basicプロジェクトを示します。

  6. 「Location」にファイルを保存するディレクトリを入力します。

    このマニュアルに合わせて、このディレクトリをC:\HR_Projectsと入力します。

  7. 「Solution Name」に適切な名前(HR_Connect_CSまたはHR_Connect_VB)が表示されます。

    1つのソリューションに複数のプロジェクトを格納できます。ソリューションに含まれるプロジェクトが1つのみの場合は、両方に同じ名前を使用できます。

  8. 「Create directory for solution」を選択します。

  9. 「OK」をクリックします。

  10. connect01.gifの説明が続きます。
    connect01.gifの説明

    プロジェクトが作成されます。

    メイン・ウィンドウに、言語によって新しいタイトル「HR_Connect_CS - Microsoft Visual Studio」または「HR_Connect_CS - Microsoft Visual Studio」のいずれかが表示され、次に示すForm1が表示されます。

    様々なプロジェクトで、最初のフォームが自動的にForm1と名付けられます。これは、フォーム・コントロールの名前です。コード・ファイルに名付けられる実際の名前と混同しないでください。実際の名前は、通常Form1.csまたはForm1.vbです。

    Form1とForm1.xxは、両方とも名前を変更できます。このマニュアルでは、Form1.xxの名前を何回か変更します。

    connect2a.gifの説明が続きます。
    connect2a.gifの説明

参照の追加

この項では、データ・プロバイダであるOracle Data Provider for .NETが含まれるOracle.DataAccess.dllファイルへの参照を追加する方法を説明します。

参照を追加するには、次の手順を実行します。

  1. 「Project」メニューから「Add Reference」を選択します。

    reference01.gifの説明が続きます。
    reference01.gifの説明

    「Add Reference」ウィンドウが表示されます。

  2. 「Add Reference」ウィンドウの「.NET」タブでOracle.DataAccessを選択します。「OK」をクリックします。

    reference02.gifの説明が続きます。
    reference02.gifの説明

    「Solution Explorer」に新しい参照が表示されていることを確認します。

    reference03.gifの説明が続きます。
    reference03.gifの説明

名前空間ディレクティブの追加

モジュール内でアセンブリの名前空間を指定できるように、Oracle名前空間ディレクティブを追加できます。これを行うには、C#のusing文またはVisual BasicのImports文をコード・ファイルの先頭または先頭付近に追加します。


注意:

参照を追加すると、アプリケーション内で名前空間を使用できるようになります。名前空間ディレクティブをアプリケーション・コードに追加することで、名前空間が明確になり、スコープの追加が可能になります。

Oracle名前空間ディレクティブを追加するには、次の手順を実行します。

  1. Form1をアクティブにして、「View」メニューから「Code」を選択します。

    または、[F7]キーボード・ショートカットを使用することもできます。

    connect04.gifの説明が続きます。
    connect04.gifの説明

  2. 使用している言語に応じて、次の文を宣言のリストに追加します。

    • Visual C#:

      他のusing文とともに、名前空間の前に追加します。

      using Oracle.DataAccess.Client; 
      using Oracle.DataAccess.Types;
      
      connect05.gifの説明が続きます。
      connect05.gifの説明

    • Visual Basic:

      ファイルの先頭の宣言部に追加します。

      Imports Oracle.DataAccess.Client 
      Imports Oracle.DataAccess.Types
      
      connect06.gifの説明が続きます。
      connect06.gifの説明

  3. 「File」メニューから「Save」を選択するか、[Ctrl] + [S]キーボード・ショートカットを使用して、変更を保存します。

ユーザー・インタフェースの設計

ユーザー・インタフェースは、デザイン・フォームにツールボックス・コントロールを追加して作成できます。このインタフェースは、ユーザーからの接続情報を受け入れます。

ツールボックス・コントロールを追加するには、次の手順を実行します。

  1. 「View」メニューから「Designer」を選択します。

    Form1をまだ開いていない場合は、この操作でForm1が設計ビューに表示されます。

    後で、「Code」と「Designer」を何度も切り替えます。キーボード・ショートカットはそれぞれ[F7]と、[Shift] + [F7]です。

  2. 「View」メニューから「Toolbox」を選択します。

  3. 「Toolbox」で「Common Controls」を開きます。

    control01.gifの説明が続きます。
    control01.gifの説明

  4. 「Toolbox」で「Label」を選択し、Form1にドラッグします。

    control02.gifの説明が続きます。
    control02.gifの説明

  5. Form1で「label1」を右クリックします。

    control03.gifの説明が続きます。
    control03.gifの説明

  6. 「Properties」ウィンドウが表示されていない場合は、メニューから「Properties」を選択します。

    「Properties」ウィンドウが表示されます。

  7. 「Properties」ウィンドウでTextプロパティをlabel1からUser IDに変更します。

    control04.gifの説明が続きます。
    control04.gifの説明

  8. 手順4から7を2回繰り返し、さらに2つのラベルをForm1に置きます。それらのTextプロパティをPasswordData Sourceに変更します。

    control05.gifの説明が続きます。
    control05.gifの説明

  9. 「Toolbox」で「TextBox」を選択し、Form1の「User ID」ラベルの隣にドラッグします。

    control06.gifの説明が続きます。
    control06.gifの説明

  10. 「Properties」ウィンドウで、NameプロパティをuserIDに変更します。

    control07.gifの説明が続きます。
    control07.gifの説明

  11. 手順9から10を2回繰り返し、さらに2つテキスト・ボックスをForm1の既存のラベルの隣に配置します。それらのNameプロパティをpassworddataSourceに変更します。

    control08.gifの説明が続きます。
    control08.gifの説明

  12. 「Password」ラベルの隣のテキストボックスを選択します。「Properties」ウィンドウで、PasswordCharプロパティまでスクロールして、このプロパティをアスタリスク(*)に設定します。

    これにより、入力中のパスワードがマスクされます。

    control09.gifの説明が続きます。
    control09.gifの説明

  13. 「Toolbox」で「Button」を選択し、Form1にドラッグします。

    「Properties」ウィンドウで、このボタンのTextプロパティを「button1」から「Connect」に変更し、Nameプロパティをconnectに変更します。

    control10.gifの説明が続きます。
    control10.gifの説明

  14. 保存します。

  15. ツールボックスを閉じます。

接続コードの記述

ここでは、ユーザー・インタフェースに入力された情報を使用してデータベースに接続するコードを記述します。

データベースに接続するには、接続オブジェクトを作成する必要があります。

データベースに接続するコードを記述するには、次の手順を実行します。

この手順を実行すると、ユーザーがForm1のコントロールに入力したデータに基づいて、アプリケーションからデータベースに接続できるようになります。「アプリケーションのコンパイルと実行」を参照してください。

  1. 「View」メニューから「Code」を選択します。

  2. データベースの接続文字列をインスタンス化するために、次のコードを追加します。

    Visual C#: 次のコードを使用して、Form1クラスのpublic Form1()ブロックの直後にクラス変数connを追加します。

    private OracleConnection conn = new OracleConnection();
    
    connect1.gifの説明が続きます。
    connect1.gifの説明

    Visual Basic: 次のコードを使用して、Form1クラス宣言にconnクラス変数を追加します。

    Public Class Form1
       Dim conn As New OracleConnection
    
    connect2.gifの説明が続きます。
    connect2.gifの説明

  3. 変更を保存します。

  4. 「View」メニューをクリックして「Designer」を選択し、「Designer」ビューに変更します。

  5. Form1の「Connect」ボタンをダブルクリックし、connect_Click()メソッドのコード・ウィンドウを開きます。

    次に示すコードをconnect_Click()メソッドに挿入します。

    Visual C#:

    conn.ConnectionString = "User Id=" + userID.Text +
       ";Password=" + password.Text + 
       ";Data Source=" + dataSource.Text + ";";
    conn.Open();
               
    

    Visual Basic:

    conn.ConnectionString = "User Id=" + userID.Text & _
      ";Password=" + password.Text & _
      ";Data Source=" + dataSource.Text
    conn.Open()
    

    注意: 接続を開く前に、まずUser IDPasswordおよびData Sourceのユーザー入力を使用して接続を作成する必要があります。Open()メソッドにより、実際の接続が作成されます。

  6. connect_Click()メソッドの最後に次のコードを挿入し、このボタンのEnabled属性をfalseに設定します。

    これにより、「Connect」ボタンは無効になります。正しく接続できた後は、このようにすることをお薦めします。

    Visual C#:

    connect.Enabled = false;
    
    connect_obj1.gifの説明が続きます。
    connect_obj1.gifの説明

    Visual Basic:

    connect.Enabled = false
    
    connect_obj2.gifの説明が続きます。
    connect_obj2.gifの説明

これで、Oracle Databaseに接続できるアプリケーションを記述できました。この後の項では、このアプリケーションの使用方法を説明します。

アプリケーションのコンパイルと実行

この項では、前の項で作成したアプリケーションをコンパイルして実行する方法を説明します。

アプリケーションをコンパイルして実行するには、次の手順を実行します。

  1. 「Build」メニューから「Build Solution」を選択します。

    build1.gifの説明が続きます。
    build1.gifの説明

  2. 「Output」ウィンドウにエラーが表示されておらず、「View」メニューから使用できることを確認します。

    標準的な出力結果は次のとおりです。

    build2.gifの説明が続きます。
    build2.gifの説明

  3. エラーがある場合は、「View」メニューから「Error List」を選択し、エラーを修正します。

  4. 「Debug」メニューから「Start Without Debugging」を選択して、アプリケーションを実行します。

    build3.gifの説明が続きます。
    build3.gifの説明

  5. Form1アプリケーションの「User ID」、「Password」および「Data Source」を入力します。

    「Connect」をクリックします。

    これにより、アプリケーションでtnsnames.oraファイルが使用されます。「NET接続の別名の構成」を参照してください。

    接続がオープンされたら、「Connect」ボタンは無効になります。これで、Oracle Databaseインスタンスへの接続が正しく実装されました。

    build4.gifの説明が続きます。
    build4.gifの説明

エラー処理

アプリケーションでは、実行時エラーを正常に処理できる必要があります。たとえば、不正なパスワードを使用してログインすると、これまで開発したアプリケーションはデータベースに接続できず、終了して未処理の例外エラー「ORA-1017: ユーザー名/パスワードが無効です。ログオンは拒否されました。」を表示します。

error1.gifの説明が続きます。
error1.gifの説明

「Start Without Debugging」を再度選択して、別のパスワードでログインを試行する必要があります。

エラー処理では、プログラム実行の標準フローとは異なる状況が発生した場合に、その対処方法を決定します。Oracle Data Provider for .NETには、エラーを処理およびサポートする次の3つのクラスが含まれています。

Try-Catch-Finallyブロック構造の使用

.NET言語では、エラー処理にTry-Catch-Finallyブロック構造を使用します。この構造では、Tryコードがメイン・コードとなり、アプリケーションで実現する目標になります。次の2つの項で説明するように、Catchコードで様々な種類のエラーが取得されます。最後にあるFinallyブロックは常に実行されます。

Finallyブロックには、接続をクローズして破棄するDisposeメソッドが含まれることがよくあります。FinallyブロックにDisposeメソッドを記述すると、Try-Catch-Finallyブロックが完了した後、データベース接続は常にクローズされます。アプリケーションでのデータベース・アクセスが不要になった後にデータベース接続をクローズすることは、特にデータ・セキュリティなど、多くの理由で重要です。

クローズされているデータベース接続をクローズしようとしてもエラーは発生しません。この試行は適切でないように思われます。しかし、Dispose()をFinallyコード・ブロックに置くことで、接続が確実にクローズされるようになります。

次の項では、一般的なエラーでのTry-Catch-Finallyブロック構造の使用方法を説明します。その後の項では、Oracleエラーでの使用方法を説明します。

一般的なエラーの処理

この項では、Try-Catch-Finallyブロックを使用して一般的なエラーを処理する方法を説明します。

一般的なエラーを処理するには、次の手順を実行します。

  1. Try-Catch-Finally構文の実装を追加して、Form1connect_Click()メソッドのコードを変更します。

    新しいコードは太字で示しています。

    Visual C#:

    private void connect_Click(object sender, EventArgs e)
    {
      conn.ConnectionString = "Data Source=ORCL;User Id="
         + userID.Text + ";Password=" + password.Text + ";";
      try
      {
        conn.Open();
        connect.Enabled = false;
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message.ToString());
      }
      finally
      {
        conn.Dispose();
      }
    }
    

    または、次のようにusingキーワードを使用して、有効でなくなった接続を破棄するC#構文を使用することもできます。

    using (OracleConnection conn = new OracleConnection())
    {
      conn.Open();
      // application code
      ...
    }
    

    Visual Basic:

    Try
      conn.Open()
      connect.Enabled = false
    
    Catch ex As Exception
      MessageBox.Show(ex.Message.ToString())
    
    Finally
      conn.Dispose()
    End Try
    
  2. 「Build」メニューから「Rebuild Solution」を選択します。

    エラーがないことを確認します。

  3. 「Debug」メニューから「Start Without Debugging」を選択します。

  4. 「アプリケーションのコンパイルと実行」の手順に従ってアプリケーションを再度実行し、間違ったパスワードを使用して接続を試行します。今度は、アプリケーションはエラーを捕捉し、ポップアップ・ウィンドウに「ORA-1017: ユーザー名/パスワードが無効です。ログオンは拒否されました。」と表示されます。

    error2.gifの説明が続きます。
    error2.gifの説明

一般的なOracleエラーの処理

次に示す完成したTry-Catch-Finallyブロック・コードでは、OracleExceptionがない場合は、最初のCatch文のブランチがスキップされます。2番目のCatch文のブランチで、その他のすべてのExceptionが取得されます。

最初のCatch文にはCase文が含まれており、これにより一般的なデータベース・エラーがトラップされ、ユーザーにわかりやすい方法で表示されます。

2番目のCase文では、データベースにアクセスできない場合に、特定のOracleExceptionが取得されます。

特定のエラーを処理するには、次の手順を実行します。

  1. データベース・インスタンスを停止します。付録A「Oracle Databaseインスタンスの起動および停止」を参照してください。

  2. 次の太字で示されているCatch OracleExceptionブロックを、connect_Click()メソッドに以前に追加したCatch Exceptionブロックの前に追加します。

    Visual C#:

    try
      {
        conn.Open();
        connect.Enabled = false;
      }
    catch (OracleException ex)
    {
      switch (ex.Number)
      {
        case 1:
          MessageBox.Show("Error attempting to insert duplicate data.");
          break;
        case 12560:
          MessageBox.Show("The database is unavailable.");
          break;
        default:
          MessageBox.Show("Database error: " + ex.Message.ToString());
          break;
      }
    }
     catch (Exception ex)
       {
         MessageBox.Show(ex.Message.ToString());
       }
    finally
      {
        conn.Dispose();
      }
    }
    

    Visual Basic:

    Try
      conn.Open()
      connect.Enabled = false
    
    Catch ex As OracleException ' catches only Oracle errors
      Select Case ex.Number
        Case 1
          MessageBox.Show("Error attempting to insert duplicate data.")
        Case 12560
          MessageBox.Show("The database is unavailable.")
        Case Else
          MessageBox.Show("Database error: " + ex.Message.ToString())
      End Select
    
    
    Catch ex As Exception
      MessageBox.Show(ex.Message.ToString())
    
    Finally
      conn.Dispose()
    End Try
    
  3. 「アプリケーションのコンパイルと実行」の手順に従ってアプリケーションを再度コンパイルして実行します。

    ORA-12560エラーが、エラー番号なしで「The database is unavailable」としてポップアップ・ウィンドウに表示されることを確認します。

    error04.gifの説明が続きます。
    error04.gifの説明

  4. データベース・インスタンスを再起動します。付録A「Oracle Databaseインスタンスの起動および停止」を参照してください。