この章の内容は次のとおりです。
Visual Studioでは、作成するすべての開発コードがグループ化され、プロジェクトと呼ばれるコンテナに入れられます。単純なプロジェクトのほとんどは、1つのファイルのみで構成されます。この項では、新しい開発プロジェクトの作成方法を説明します。
この章で作成するアプリケーションは、後続の章で行う操作の開始点になるため、このマニュアルに示す順に操作してください。
注意: 必要に応じて、Visual C#またはVisual Basicが指定されています。
新しいプロジェクトを開始するには、次の手順を実行します。
Visual Studioを起動します。
「スタート」メニューを開き、「すべてのプログラム」から「Microsoft Visual Studio 2008」を選択します。
Microsoft Visual Studio IDE環境が表示されます。
「Start Page」の「Recent Projects」ヘッダーの下にある「Create: Project」をクリックします。
または、「File」メニューから「New」、「Project」の順に選択します。
「New Project」ダイアログ・ボックスが表示されます。
「Project Types」で、作成するプロジェクトの種類を選択します。
Visual C#:
Visual C#: Windows
Visual Basic:
Other Languages: Visual Basic: Windows
「Templates」で「Windows Forms Application」を選択します。
「Name」フィールドに適切な名前を入力します。
Visual C#:
HR_Connect_CS
Visual Basic:
HR_Connect_VB
略語のCS
はC#プロジェクトを、VBはVisual Basicプロジェクトを示します。
「Location」にファイルを保存するディレクトリを入力します。
このマニュアルに合わせて、このディレクトリをC:\HR_Projects
と入力します。
「Solution Name」に適切な名前(HR_Connect_CSまたはHR_Connect_VB)が表示されます。
1つのソリューションに複数のプロジェクトを格納できます。ソリューションに含まれるプロジェクトが1つのみの場合は、両方に同じ名前を使用できます。
「Create directory for solution」を選択します。
「OK」をクリックします。
プロジェクトが作成されます。
メイン・ウィンドウに、言語によって新しいタイトル「HR_Connect_CS - Microsoft Visual Studio」または「HR_Connect_CS - Microsoft Visual Studio」のいずれかが表示され、次に示すForm1が表示されます。
様々なプロジェクトで、最初のフォームが自動的にForm1と名付けられます。これは、フォーム・コントロールの名前です。コード・ファイルに名付けられる実際の名前と混同しないでください。実際の名前は、通常Form1.cs
またはForm1.vb
です。
Form1とForm
1.xx
は、両方とも名前を変更できます。このマニュアルでは、Form
1.xx
の名前を何回か変更します。
この項では、データ・プロバイダであるOracle Data Provider for .NETが含まれるOracle.DataAccess.dll
ファイルへの参照を追加する方法を説明します。
参照を追加するには、次の手順を実行します。
「Project」メニューから「Add Reference」を選択します。
「Add Reference」ウィンドウが表示されます。
「Add Reference」ウィンドウの「.NET」タブでOracle.DataAccessを選択します。「OK」をクリックします。
「Solution Explorer」に新しい参照が表示されていることを確認します。
モジュール内でアセンブリの名前空間を指定できるように、Oracle名前空間ディレクティブを追加できます。これを行うには、C#のusing
文またはVisual BasicのImports
文をコード・ファイルの先頭または先頭付近に追加します。
注意: 参照を追加すると、アプリケーション内で名前空間を使用できるようになります。名前空間ディレクティブをアプリケーション・コードに追加することで、名前空間が明確になり、スコープの追加が可能になります。 |
Oracle名前空間ディレクティブを追加するには、次の手順を実行します。
Form1をアクティブにして、「View」メニューから「Code」を選択します。
または、[F7]キーボード・ショートカットを使用することもできます。
使用している言語に応じて、次の文を宣言のリストに追加します。
Visual C#:
他のusing
文とともに、名前空間の前に追加します。
using Oracle.DataAccess.Client; using Oracle.DataAccess.Types;
Visual Basic:
ファイルの先頭の宣言部に追加します。
Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types
「File」メニューから「Save」を選択するか、[Ctrl] + [S]キーボード・ショートカットを使用して、変更を保存します。
ユーザー・インタフェースは、デザイン・フォームにツールボックス・コントロールを追加して作成できます。このインタフェースは、ユーザーからの接続情報を受け入れます。
ツールボックス・コントロールを追加するには、次の手順を実行します。
「View」メニューから「Designer」を選択します。
Form1をまだ開いていない場合は、この操作でForm1が設計ビューに表示されます。
後で、「Code」と「Designer」を何度も切り替えます。キーボード・ショートカットはそれぞれ[F7]と、[Shift] + [F7]です。
「View」メニューから「Toolbox」を選択します。
「Toolbox」で「Common Controls」を開きます。
「Toolbox」で「Label」を選択し、Form1にドラッグします。
Form1で「label1」を右クリックします。
「Properties」ウィンドウが表示されていない場合は、メニューから「Properties」を選択します。
「Properties」ウィンドウが表示されます。
「Properties」ウィンドウでTextプロパティをlabel1からUser IDに変更します。
手順4から7を2回繰り返し、さらに2つのラベルをForm1に置きます。それらのTextプロパティをPasswordとData Sourceに変更します。
「Toolbox」で「TextBox」を選択し、Form1の「User ID」ラベルの隣にドラッグします。
「Properties」ウィンドウで、NameプロパティをuserIDに変更します。
手順9から10を2回繰り返し、さらに2つテキスト・ボックスをForm1の既存のラベルの隣に配置します。それらのNameプロパティをpasswordとdataSourceに変更します。
「Password」ラベルの隣のテキストボックスを選択します。「Properties」ウィンドウで、PasswordCharプロパティまでスクロールして、このプロパティをアスタリスク(*)に設定します。
これにより、入力中のパスワードがマスクされます。
「Toolbox」で「Button」を選択し、Form1にドラッグします。
「Properties」ウィンドウで、このボタンのTextプロパティを「button1」から「Connect」に変更し、Nameプロパティをconnectに変更します。
保存します。
ツールボックスを閉じます。
ここでは、ユーザー・インタフェースに入力された情報を使用してデータベースに接続するコードを記述します。
データベースに接続するには、接続オブジェクトを作成する必要があります。
データベースに接続するコードを記述するには、次の手順を実行します。
この手順を実行すると、ユーザーがForm1のコントロールに入力したデータに基づいて、アプリケーションからデータベースに接続できるようになります。「アプリケーションのコンパイルと実行」を参照してください。
「View」メニューから「Code」を選択します。
データベースの接続文字列をインスタンス化するために、次のコードを追加します。
Visual C#: 次のコードを使用して、Form1
クラスのpublic
Form1()
ブロックの直後にクラス変数conn
を追加します。
private OracleConnection conn = new OracleConnection();
Visual Basic: 次のコードを使用して、Form1
クラス宣言にconn
クラス変数を追加します。
Public Class Form1
Dim conn As New OracleConnection
変更を保存します。
「View」メニューをクリックして「Designer」を選択し、「Designer」ビューに変更します。
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
ID
、Password
およびData
Source
のユーザー入力を使用して接続を作成する必要があります。Open()
メソッドにより、実際の接続が作成されます。
connect_Click()
メソッドの最後に次のコードを挿入し、このボタンのEnabled
属性をfalse
に設定します。
これにより、「Connect」
ボタンは無効になります。正しく接続できた後は、このようにすることをお薦めします。
Visual C#:
connect.Enabled = false;
Visual Basic:
connect.Enabled = false
これで、Oracle Databaseに接続できるアプリケーションを記述できました。この後の項では、このアプリケーションの使用方法を説明します。
この項では、前の項で作成したアプリケーションをコンパイルして実行する方法を説明します。
アプリケーションをコンパイルして実行するには、次の手順を実行します。
「Build」メニューから「Build Solution」を選択します。
「Output」ウィンドウにエラーが表示されておらず、「View」メニューから使用できることを確認します。
標準的な出力結果は次のとおりです。
エラーがある場合は、「View」メニューから「Error List」を選択し、エラーを修正します。
「Debug」メニューから「Start Without Debugging」を選択して、アプリケーションを実行します。
Form1アプリケーションの「User ID」、「Password」および「Data Source」を入力します。
「Connect」をクリックします。
これにより、アプリケーションでtnsnames.ora
ファイルが使用されます。「NET接続の別名の構成」を参照してください。
接続がオープンされたら、「Connect」ボタンは無効になります。これで、Oracle Databaseインスタンスへの接続が正しく実装されました。
アプリケーションでは、実行時エラーを正常に処理できる必要があります。たとえば、不正なパスワードを使用してログインすると、これまで開発したアプリケーションはデータベースに接続できず、終了して未処理の例外エラー「ORA-1017:
ユーザー名/パスワードが無効です。ログオンは拒否されました。
」を表示します。
「Start Without Debugging」を再度選択して、別のパスワードでログインを試行する必要があります。
エラー処理では、プログラム実行の標準フローとは異なる状況が発生した場合に、その対処方法を決定します。Oracle Data Provider for .NETには、エラーを処理およびサポートする次の3つのクラスが含まれています。
OracleError
クラスは、Oracleにより報告される警告またはエラーを表します。
OracleErrorCollection
クラスは、Oracle Data Provider for .NETによりスローされるすべてのエラーの集合を表します。これは、OracleError
のリストを保持する単純なArrayList
です。
OracleException
クラスは、Oracle Data Provider for .NETでエラーが発生したときにスローされる例外を表します。各OracleException
オブジェクトの「Error」
プロパティには、エラーまたは警告を示す1つ以上のOracleError
オブジェクトが含まれます。
.NET言語では、エラー処理にTry-Catch-Finallyブロック構造を使用します。この構造では、Tryコードがメイン・コードとなり、アプリケーションで実現する目標になります。次の2つの項で説明するように、Catchコードで様々な種類のエラーが取得されます。最後にあるFinallyブロックは常に実行されます。
Finallyブロックには、接続をクローズして破棄するDispose
メソッドが含まれることがよくあります。FinallyブロックにDispose
メソッドを記述すると、Try-Catch-Finallyブロックが完了した後、データベース接続は常にクローズされます。アプリケーションでのデータベース・アクセスが不要になった後にデータベース接続をクローズすることは、特にデータ・セキュリティなど、多くの理由で重要です。
クローズされているデータベース接続をクローズしようとしてもエラーは発生しません。この試行は適切でないように思われます。しかし、Dispose()
をFinallyコード・ブロックに置くことで、接続が確実にクローズされるようになります。
次の項では、一般的なエラーでのTry-Catch-Finallyブロック構造の使用方法を説明します。その後の項では、Oracleエラーでの使用方法を説明します。
この項では、Try-Catch-Finallyブロックを使用して一般的なエラーを処理する方法を説明します。
一般的なエラーを処理するには、次の手順を実行します。
Try-Catch-Finally構文の実装を追加して、Form1
のconnect_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
「Build」メニューから「Rebuild Solution」を選択します。
エラーがないことを確認します。
「Debug」メニューから「Start Without Debugging」を選択します。
「アプリケーションのコンパイルと実行」の手順に従ってアプリケーションを再度実行し、間違ったパスワードを使用して接続を試行します。今度は、アプリケーションはエラーを捕捉し、ポップアップ・ウィンドウに「ORA-1017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
」と表示されます。
次に示す完成したTry-Catch-Finallyブロック・コードでは、OracleException
がない場合は、最初のCatch文のブランチがスキップされます。2番目のCatch文のブランチで、その他のすべてのException
が取得されます。
最初のCatch文にはCase
文が含まれており、これにより一般的なデータベース・エラーがトラップされ、ユーザーにわかりやすい方法で表示されます。
2番目のCase
文では、データベースにアクセスできない場合に、特定のOracleException
が取得されます。
特定のエラーを処理するには、次の手順を実行します。
データベース・インスタンスを停止します。付録A「Oracle Databaseインスタンスの起動および停止」を参照してください。
次の太字で示されている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
「アプリケーションのコンパイルと実行」の手順に従ってアプリケーションを再度コンパイルして実行します。
ORA-12560
エラーが、エラー番号なしで「The
database
is
unavailable
」としてポップアップ・ウィンドウに表示されることを確認します。
データベース・インスタンスを再起動します。付録A「Oracle Databaseインスタンスの起動および停止」を参照してください。