Oracle Database 2日で.NET開発者ガイド 11g リリース1(11.1) E05695-02 |
|
この章の内容は次のとおりです。
データベース内のデータを表示、編集、挿入または削除するには、SQLコマンド、ストアド・プロシージャまたは表名を指定して、OracleCommand
オブジェクトにリクエストをカプセル化する必要があります。OracleCommand
オブジェクトは、リクエストを作成してデータベースに送信し、結果を戻します。
xx
から、Form1
.xx
のコピーを2つ作成します。コピーを作成する方法については、付録B「フォームのコピー」を参照してください。コピーにForm2.cs
またはForm2.vb
、およびForm3.cs
またはForm3.vb
と名前を付けます。最初のコピーは、この章の前半で使用します。2つ目のコピーは、この章の後半で使用します。
Form2.cs
またはForm2.vb
を開きます。コード・ファイルの名前は変更しましたが、プロジェクト内の実際のフォーム・コントロールの名前は変更していないため、デザイナのフォームはまだForm1となっていることに注意してください。
try
文の本体に追加します。新しいコードは太字で示しています。
Visual C#:
try { conn.Open(); connect.Enabled = false; // SQL Statement string sql = "select department_name from departments" + " where department_id = 10"; }
Visual Basic:
Try conn.Open() connect.Enabled = False Dim sql As String = "select department_name from departments" & _ "where department_id = 10"
sql
変数を使用してOracleCommand
オブジェクトを作成し、テキスト・コマンドが実行されるようにCommandType
プロパティを設定します。Visual C#:
try { conn.Open(); connect.Enabled = false; // SQL Statement string sql = "select department_name from departments" + " where department_id = 10"; OracleCommand cmd = new OracleCommand(sql, conn); cmd.CommandType = CommandType.Text; }
Visual Basic:
Try conn.Open() connect.Enabled = False Dim sql As String = "select department_name from departments" & _ "where department_id = 10" Dim cmd As New OracleCommand(sql, conn) cmd.CommandType = CommandType.Text
この項では、データベースからデータを取得する方法を説明します。
OracleCommand
オブジェクトのExecuteReader()
メソッドによりOracleDataReader
オブジェクトが戻されます。これにアクセスすることでフォームに結果を表示できます。このアプリケーションでは、ListBoxを使用して結果を表示します。
connect_Click()
メソッドのTryブロックの最後に追加して、OracleDataReader
オブジェクトを作成します。これにより、問合せ結果を読み取ることができます。
Visual C#:
OracleDataReader dr = cmd.ExecuteReader(); dr.Read();
Visual Basic:
Dim dr As OracleDataReader = cmd.ExecuteReader() dr.Read()
Department
に変更します。
departments
に変更します。「Connect」ボタンをダブルクリックしてconnect_click()
メソッドを編集し、次に示すコードをTry
ブロックの最後に追加します。
Visual C#:
departments.Items.Add(dr.GetString(0));
Visual Basic:
departments.Items.Add(dr.GetString(0))
GetString
などの型指定されたアクセッサは、ネイティブの.NETデータ型およびネイティブのOracleデータ型を戻します。結果セットのどの列を戻すかは、アクセッサに渡されたゼロベースの序数で指定します。
接続すると、「Department
」リスト・ボックスにAdministration
と表示されます。これはHRスキーマに含まれる部門番号10
の正しい名前で、SELECT
文でリクエストしたものです。
バインド変数はSQL文内のプレースホルダです。データベースではSQL文を受信すると、その文がすでに実行されたことがありメモリーに格納されているかどうかが確認されます。その文がメモリーに存在する場合、Oracle Databaseではその文を再利用でき、文の解析と最適化のタスクがスキップされます。バインド変数を使用すると、異なる入力値でも文の再利用が可能です。また、バインド変数を使用すると、データベースの問合せパフォーマンスが向上するだけでなく、入力に含まれるリテラル引用符の特別な処理が不要になり、SQLインジェクション攻撃から保護することができます。
次のコードは、バインド変数を使用せずに、文のWHERE
句に値10
を指定する標準的なSELECT
文です。
SELECT department_name FROM departments WHERE department_id = 10
次のコードは、数値をバインド変数:department_id
で置き換えたものです。バインド変数識別子は、常に1つのコロン(:
)で始まります。
SELECT department_name FROM departments WHERE department_id = :department_id
バインド変数はUPDATE
、INSERT
およびDELETE
文でも使用でき、ストアド・プロシージャでも使用できます。次のコードは、UPDATE
文でバインド変数を使用する方法を示しています。
UPDATE departments SET department_name = :department_name WHERE departname_id = : department_id
詳細は、「データの挿入、削除および更新」を参照してください。
.NETコードで各バインド変数を表すには、OracleParameter
クラスを使用できます。OracleParameterCollection
クラスには、各文のOracleCommand
オブジェクトと関連付けられたOracleParameter
オブジェクトが含まれています。OracleCommand
クラスは、SQL文をデータベースに渡し、結果をアプリケーションに戻します。
変数は、OracleCommand
プロパティBindByName
の設定(デフォルトはfalse
)によって、位置または名前でバインドできます。
Add()
メソッドを使用して、SQL文またはストアド・プロシージャで記述されるのと同じ順序でパラメータをOracleParameterCollection
に追加する必要があります。
任意の順序でパラメータをコレクションに追加できます。ただし、パラメータ・オブジェクトのParameterName
プロパティを、ストアド・プロシージャで宣言されているバインド変数識別子と同じ名前に設定する必要があります。
バインド・モード(位置指定または名前指定)の他に、.NET開発者はDirection
、OracleDbType
、Size
およびValue
の各プロパティを、各パラメータ・オブジェクトに設定します。
Direction
バインド変数は、出力、入力または入出力パラメータとして使用できます。Direction
プロパティは、各パラメータの向きを示します。Direction
プロパティのデフォルト値はInput
です。
OracleDbType
プロパティは、パラメータがnumber
、date
、VARCHAR2
などのいずれであるかを示します。
Size
は、VARCHAR2
などの可変長データ型のパラメータで保持できる最大データ・サイズを示します。
Value
には、文の実行前(入力パラメータ)、実行後(出力パラメータ)または実行前後の両方(入出力パラメータ)のパラメータ値が保持されます。
departmentID
に変更します。connect_Click()
メソッドのTryブロックに追加して、バインド変数が使用されるようにSELECT
文を変更します。変更されたコードまたは新しいコードは太字で示しています。
Visual C#:
string sql = "select department_name from departments where department_id = " + ":department_id"; OracleCommand cmd = new OracleCommand(sql, conn); cmd.CommandType = CommandType.Text; OracleParameter p_department_id = new OracleParameter(); p_department_id.OracleDbType = OracleDbType.Decimal; p_department_id.Value = departmentID.Text; cmd.Parameters.Add(p_department_id); OracleDataReader dr = cmd.ExecuteReader(); dr.Read(); departments.Items.Add(dr.GetString(0));
Visual Basic:
Dim sql As String = "select department_name from departments where" & _ "department_id= ":department_id" Dim cmd As OracleCommand = New OracleCommand(sql, conn) cmd.CommandType = CommandType.Text Dim p_department_id as OracleParameter = new OracleParameter() p_department_id.OracleDbType = OracleDbType.Decimal p_department_id.Value = departmentID.Text cmd.Parameters.Add(p_department_id) Dim dr As OracleDataReader = cmd.ExecuteReader() dr.Read() departments.Items.Add(dr.GetString(0))
このコードでは、パラメータ・オブジェクトはOracleDbType
プロパティを設定しますが、Direction
プロパティにはデフォルト値Input
を使用するため、設定は不要です。オブジェクトは入力パラメータであり、データ・プロバイダは値からサイズを判断できるため、Size
プロパティを設定する必要はありません。
部門IDに対応する部門名がアプリケーションから戻されます。
データベースから複数の値を取得することが必要になる場合はよくあります。複数の列および複数の行の値を取得するには、DataReader
オブジェクトを使用できます。次の例で、複数の列や複数の行に対する問合せについて考えてみます。
SELECT department_id, department_name, manager_id, location_id FROM departments WHERE department_id < 100
DataReader
オブジェクトから複数の行を処理するには、ループ構造が必要です。また、複数の行を表示できるコントロールが役立ちます。OracleDataReader
オブジェクトは前進専用で読取り専用のカーソルであるため、Windows FormsのDataGrid
コントロールなどの、更新可能なコントロールまたは後方にスクロールできるコントロールにはバインドできません。ただし、OracleDataReader
オブジェクトはListBox
コントロールと互換性があります。
connect_Click()
メソッドのTry
ブロックで、複数の行の結果セットが戻され、部門名を表示するreadメソッドを囲むwhileループを追加するようにSQL問合せを変更します。Visual C#:
try { ... string sql = "select department_name from departments where department_id" + "< :department_id"; ... while (dr.Read()) { departments.Items.Add(dr.GetString(0)); } }
Visual Basic:
Try ... Dim sql As String = "select department_name from departments " & _ "where department_id < :department_id" ... While (dr.Read()) departments.Items.Add(dr.GetString(0)) End While
問合せに対応する部門名が、アプリケーションから戻されます。
DataSet
クラスでは、メモリーに常駐するデータベース・データのコピーが提供されます。これは、リレーショナル・データまたはXMLデータを格納する1つ以上の表で構成されます。OracleDataReader
オブジェクトとは異なり、DataSet
は更新可能で後方にスクロールできます。
Form3.vb
または.cs
という名前を付けます。Form1.
xx
がSolution Explorerに表示されない場合は、「Project」メニューから「Show All Files」を選択します。
departments
に変更します。
conn
宣言の直後に、クラス変数への変数宣言を追加します。Visual C#:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private OracleConnection conn = new OracleConnection(); private OracleCommand cmd; private OracleDataAdapter da; private OracleCommandBuilder cb; private DataSet ds; ...
Visual Basic:
Public Class Form1 Dim conn As New OracleConnection Private cmd As OracleCommand Private da As OracleDataAdapter Private cb As OracleCommandBuilder Private ds As DataSet
connect_Click()
メソッドのTry
ブロックに、次のコードを追加します。
Visual C#:
conn.Open(); connect.Enabled = false; string sql = "select * from departments where department_id < 60"; cmd = new OracleCommand(sql, conn); cmd.CommandType = CommandType.Text; da = new OracleDataAdapter(cmd); cb = new OracleCommandBuilder(da); ds = new DataSet(); da.Fill(ds); departments.DataSource = ds.Tables[0];
Visual Basic:
conn.Open() connect.Enabled = False Dim sql As String = "select * from departments where department_id < 60" cmd = New OracleCommand(sql, conn) cmd.CommandType = CommandType.Text da = New OracleDataAdapter(cmd) cb = New OracleCommandBuilder(da) ds = New DataSet() da.Fill(ds) departments.DataSource = ds.Tables(0)
データベースに正しく接続されると、データ・グリッドに問合せ結果が移入されます。
この時点で、DataSet
にはデータベース・データのクライアント・コピーが保持されています。この項では、クライアント・データの変更をデータベースに保存できるようにするボタンを追加します。その後の項では、データの更新、挿入および削除のテスト方法を説明します。
DataSetからデータベースにデータを保存できるようにするには、次の手順を実行します。
save
に変更します。TextプロパティをSave
に変更します。
save_Click
を入力します。
save_Click()
メソッドの本体に追加します。Visual C#:
da.Update(ds.Tables[0]);
Visual Basic:
da.Update(ds.Tables(0))
「Error List」にエラーが表示される場合があります。これらのエラーは、次の手順でコードを追加する表示されなくなります。
Form()
メソッドまたはForm1_Load
メソッドに、次のコードを追加します。Visual C#:
public Form1() { InitializeComponent(); save.Enabled = false; }
Visual Basic:
Private Sub Form1_Load(ByVal sender As System.Object, & _ ByVal e As System.EventArgs) Handles MyBase.Load save.Enabled = false
connect_Click()
メソッドのTry
ブロックに、「Save」ボタンを有効にするコードを追加します。Visual C#:
conn.Open(); ... departments.DataSource = ds.Tables[0]; save.Enabled = true;
Visual Basic:
conn.Open() ... departments.DataSource = ds.Tables(0) save.Enabled = True
conn.Dispose()
コールをconnect_Click()
メソッドのFinally
ブロックから削除します。注意: この例で前に使用したコードでは、接続を破棄またはクローズするためにこのメソッドが必要でした。しかし、コードを変更したため、問合せ結果が戻された後も接続をオープン状態のままにし、エンド・ユーザーによるデータ変更がデータベースに伝播されるようにする必要があります。一般的なオーバーライド・コールであるcomponents.Dispose()
は、すでにForm1の定義に含まれています。
データベースに正しく接続されると、データ・グリッドに問合せ結果が移入されます。
この項では、新しいアプリケーションを使用してデータベースのデータを直接操作する方法を説明します。
DEPARTMENT_ID
が番号順に表示され、新しい部門がDEPARTMENTS
表の先頭にあることを確認します。
Community Volunteers
に変更して、「Save」ボタンをクリックします。
DEPARTMENTS
表に含まれていないことを確認します。
|
![]() Copyright © 2009 Oracle Corporation. All Rights Reserved. |
|