■ TableAdapter クエリを実行する方法 ■
TableAdapter クエリは、アプリケーションがデータベースに対して実行出来る SQL ステートメントや ストアドプロシージャで、TableAdapter で型指定されたメソッドと仕て公開される。TableAdapter ク エリは、所有るオブジェクトのメソッドと同様に、関連付けられたメソッドを呼び出す事に依り実行出 来る。
TableAdapter クエリは、データテーブルに値を設定したり(Fill クエリと FillBy クエリ)、クエリが返 すデータを読み込んだ新しいデータテーブルを返す事が出来る(GetData クエリと GetDataBy クエリ)。 TableAdapter クエリの構成ウィザードを実行すると、クエリを既存の TableAdapter に追加出来る。 ■ TableAdapter のインスタンスの作成 TableAdapter のメソッドを呼び出す前に、TableAdapter のインスタンスを作成する必要が有る。 ※ TableAdapter はデータセットデザイナを使用して作成・編集するが、TableAdapter は、実際には データセット内で入れ子に成ったクラスでは無い。TableAdapter は、TableAdapter に関連付けら れ、データセット名に基づいて指定された名前空間に有る。名前付け規則は、DataSetName + "TableAdapters" で有る。例えば、NorthwindDataSet に関連付けられた総ての TableAdapter は NorthwindDataSetTableAdapters 名前空間に有る。CustomersTableAdapter が有るとすると、其 の完全修飾名は、NorthwindDataSetTableAdapters.CustomersTableAdapter に成る。 TableAdapter のインスタンスを作成するには [データソース] ウィンドウから項目を Windows アプリケーションのフォームにドラッグすると、フォ ームにTableAdapter のインスタンスが自動的に作成される。フォームの下部の境界の下の小さな領域 に有るコンポーネントトレーのTableAdapter を調べて、インスタンスの名前を確認する。 又は TableAdapter を作成した後にプロジェクトを構築する。TableAdapter がツールボックスに表示される。 ツールボックスからTableAdapter をフォームにドラッグしてインスタンスを作成する。コンポーネン トトレーのTableAdapter を調べて、インスタンスの名前を確認する。 又は TableAdapter のインスタンスをプログラムに依り作成する。 Visual Basic
Dim CustomersTableAdapter1 As NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = New NorthwindDataSetTableAdapters.CustomersTableAdapter()
C#
NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter1;
customersTableAdapter1 = new NorthwindDataSetTableAdapters.CustomersTableAdapter();
デ
■ 既存のデータテーブルにデータを読み込む TableAdapter クエリの実行(Fill のメソッド) 既存のデータテーブルにデータを読み込むTableAdapter クエリを実行するには
TableAdapter の Fill クエリや FillBy クエリを呼び出し、データを読み込むデータテーブルを渡す。例 えば、次のコードはFill クエリを実行して Customers テーブルにデータを読み込む。 Visual Basic CustomersTableAdapter1.Fill(NorthwindDataSet1.Customers) C# customersTableAdapter1.Fill(northwindDataSet1.Customers); ■ 新しいデータテーブルを返す TableAdapter クエリの実行(GetData のメソッド) 新しいデータテーブルを返すTableAdapter クエリを実行するには
TableAdapter の GetData クエリや GetDataBy クエリを呼び出し、クエリの結果が格納され、型指定 されたデータテーブルを返す。例えば、次のコードはGetData クエリを実行して Customers テーブル を返す。
Visual Basic
Dim newCustomersTable As NorthwindDataSet.CustomersDataTable newCustomersTable = CustomersTableAdapter1.GetData( ) C# NorthwindDataSet.CustomersDataTable newCustomersTable; newCustomersTable = customersTableAdapter1.GetData( ); ■ 単一(スカラ)値を返す TableAdapter クエリの実行 ツールボックスから直接データセットデザイナにクエリをドラッグして、スタンドアロンクエリ(デー タテーブルを使用しないクエリ)を作成出来る。 単一(スカラ)値を返すTableAdapter クエリを実行するには TableAdapter のインスタンスを作成し、戻り値を保持する変数を宣言し、クエリの結果を代入する。 次の例は、QueriesTableAdapter に対する CustomerCount と謂うクエリが有ると仮定して居る。 Visual Basic
Dim scalarQueriesTableAdapter As NorthwindDataSetTableAdapters.QueriesTableAdapter scalarQueriesTableAdapter = New NorthwindDataSetTableAdapters.QueriesTableAdapter( ) Dim returnValue As Integer
returnValue = CType(scalarQueriesTableAdapter.CustomerCount( ), Integer) C#
NorthwindDataSetTableAdapters.QueriesTableAdapter scalarQueriesTableAdapter;
scalarQueriesTableAdapter = new NorthwindDataSetTableAdapters.QueriesTableAdapter( ); int returnValue;
■ TableAdapter で直接データベースにアクセスする ■ InsertCommand、UpdateCommand、及び、DeleteCommand に加えて、データベースに対して直接 実行 出来るメ ソッドで、TableAdapter が生成される。此等のメソッド(TableAdapter.Insert、 TableAdapter.Update、及び、TableAdapter.Delete)は、データベース内でデータを操作する為に直接 呼び出す事が出来る。 此 等 の 直 接 メ ソ ッ ド を 作 成 し な い 場 合 は 、[ プ ロ パ テ ィ ] ウ ィ ン ド ウ で TableAdapter の GenerateDbDirectMethods プロパティを false に設定する。メインクエリに加えて TableAdapter に追 加されたクエリは、スタンドアロンのクエリで有る。詰まり、DbDirect メソッドを生成しないクエリ で有る。 ■ データベースへのコマンドの直接送信 目的とするタスクを実行するTableAdapter DbDirect メソッドを呼び出す。 新規レコードをデータベースに直接挿入するには 各列の値をパラメータと仕て渡してTableAdapter の Insert メソッドを呼び出す。次の手順では、例と 仕てNorthwind データベースの Region テーブルを使用する。 ※ 使用出来るインスタンスが無い場合は、使用する TableAdapter をインスタンス化する。 Visual Basic
Dim regionTableAdapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter.Insert(5, "NorthWestern") C# NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( ); regionTableAdapter.Insert(5, "NorthWestern"); データベース内のレコードを直接更新するには 各列の新しい値と元の値をパラメータと仕て渡してTableAdapter の Update メソッドを呼び出す。 ※ 使用出来るインスタンスが無い場合は、使用する TableAdapter をインスタンス化する。 Visual Basic
Dim regionTableAdapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter.Update(1, "East", 1, "Eastern")
C#
NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( );
regionTableAdapter.Update(1, "East", 1, "Eastern"); データベース内のレコードを直接削除するには
各列の値をDelete メソッドのパラメータと仕て渡して TableAdapter の Delete メソッドを呼び出す。 此の例では、Northwind データベースの Region テーブルを使用する。
Visual Basic
Dim regionTableAdapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter.Delete(5, "NorthWestern") C# NorthwindDataSetTableAdapters.RegionTableAdapter regionTableAdapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( ); regionTableAdapter.Delete(5, "NorthWestern"); ■ サンプルコード Visual Basic Public Class Form1
' コントロールボックスを FALSE にプロパティーで設定
' Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
Private Ds As New SampleDataSet
Private Ta As New SampleDataSetTableAdapters.t_顧客 TableAdapter Private tb As New SampleDataSet.t_顧客 DataTable
' Private TableBind As New BindingSource
Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button4.Click ' 検索 Form2.code = Me.TextBox1.Text Trace.WriteLine(Form2.F_GetMyDataset( )) Form2.ShowDialog( )
If Form2.SelectBol = True Then Me.TextBox1.Text = Form2.code ' DB を検索して値を表示する Ta.SelectIDFillBy(Ds.t_顧客, Convert.ToInt32(Me.TextBox1.Text)) ' 抽出 Me.TextBox1.Text = Ds.t_顧客(0).ID.ToString( ) Me.TextBox2.Text = Ds.t_顧客(0).NAME.ToString( ) Ds.Dispose( ) Ta.Dispose( ) End If Form2.Dispose( ) End Sub
Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click ' 終了する必要が有る総てのメッセージポンプを通知し、
' メッセージが処理されると、総てのアプリケーションウィンドウを閉じる Application.Exit( )
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click
Try ' 保存
Ta.SelectIDFillBy(Ds.t_顧客, Convert.ToInt32(Me.TextBox1.Text)) '抽出 ' Ds.t_顧客(0).ID = Me.TextBox1.Text ' Ds.t_顧客(0).BeginEdit( ) Ds.t_顧客(0).NAME = Me.TextBox2.Text Debug.Print(Ds.t_顧客(0).NAME) ' Ds.t_顧客(0).EndEdit( ) ' Ds.t_顧客.AcceptChanges( ) ' 編集された行を取得する tb = CType(Ds.t_顧客.GetChanges(DataRowState.Modified), _ SampleDataSet.t_顧客 DataTable)
' Using tx As New Transactions.TransactionScope( ) ' セッション参加登録 ' 此の名前空間を使ったアプリケーション作成は、Windows 2000、Windows XP、 ' Windows 2003 の各プラットフォームで而巳サポートされる。 ' Windows 98 や Windows ME のプラットフォームでトランザクションを作成すると、 ' PlatformNotSupportedException がスローされる(Jet4.0 でも利用出来ない?)。 Ta.Update(tb) ' tx.Complete( ) ' End Using Catch ex As Exception
MessageBox.Show(ex.ToString, "保存", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Ds.Dispose( ) Ta.Dispose( ) End Sub End Class ' ======================================================================================= Public Class Form2
' コントロールボックスは False にする
Friend code As String Friend SelectBol As Boolean
Private Ds As New SampleDataSet
Private Ta As New SampleDataSetTableAdapters.t_顧客 TableAdapter ' Private tableKokyaku As New SampleDataSet.t_顧客 DataTable ' Private TableBind As New BindingSource
Friend Function F_GetMyDataset( ) As Boolean
' DB に接続してデータセットを取得(データが無ければ False を返す) If code = "" Then Ta.Fill(Ds.t_顧客) Else Ta.SelectIDFillBy(Ds.t_顧客, Convert.ToInt32(code)) End If ' TableBind.DataSource = Ds
' TableBind.DataMember = "t_顧客" DataGridView1.DataSource = Ds DataGridView1.DataMember = "t_顧客" End Function
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click
SelectBol = False ' 選択して居ない Me.Close( ) ' フォームを閉じる
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click If Me.TextBox1.Text = "" Then Ta.Fill(Ds.t_顧客) ' 総て持って来る Else Ta.SelectIDFillBy(Ds.t_顧客, Convert.ToInt32(Me.TextBox1.Text)) '抽出 ' Ta.FillBy(Ds.t_顧客) End If ' TableBind.DataSource = Ds ' TableBind.DataMember = "t_顧客" ' データグリッドビューに表示 DataGridView1.DataSource = Ds DataGridView1.DataMember = "t_顧客" Ds.Dispose( ) Ta.Dispose( ) ' DataGridView1.Columns(1).Visible = False End Sub
Private Sub DataGridView1_DoubleClick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick ' 選択したら
Call DgSelect( ) End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Call DgSelect( )
End Sub
Private Sub DgSelect( )
If DataGridView1.SelectedRows.Count > 0 Then Debug.Print(DataGridView1.SelectedRows(0).Cells(0).Value.ToString( )) code = DataGridView1.SelectedRows(0).Cells(0).Value.ToString( ) SelectBol = True ' 選択した Me.Close( ) ' フォームを閉じる End If End Sub End Class