データベース 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 のインスタンスをプログラムに依り作成する Dim CustomersTableAdapter1 As NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = New NorthwindDataSetTableAdapters.CustomersTableAdapter() NorthwindDataSetTableAdapters.CustomersTableAdapter customerstableadapter1; customerstableadapter1 = new NorthwindDataSetTableAdapters.CustomersTableAdapter(); -1-
既存のデータテーブルにデータを読み込む TableAdapter クエリの実行 (Fill のメソッド ) 既存のデータテーブルにデータを読み込む TableAdapter クエリを実行するには TableAdapter の Fill クエリや FillBy クエリを呼び出し データを読み込むデータテーブルを渡す 例えば 次のコードは Fill クエリを実行して Customers テーブルにデータを読み込む CustomersTableAdapter1.Fill(NorthwindDataSet1.Customers) customerstableadapter1.fill(northwinddataset1.customers); 新しいデータテーブルを返す TableAdapter クエリの実行 (GetData のメソッド ) 新しいデータテーブルを返す TableAdapter クエリを実行するには TableAdapter の GetData クエリや GetDataBy クエリを呼び出し クエリの結果が格納され 型指定されたデータテーブルを返す 例えば 次のコードは GetData クエリを実行して Customers テーブルを返す Dim newcustomerstable As NorthwindDataSet.CustomersDataTable newcustomerstable = CustomersTableAdapter1.GetData( ) NorthwindDataSet.CustomersDataTable newcustomerstable; newcustomerstable = customerstableadapter1.getdata( ); 単一 ( スカラ ) 値を返す TableAdapter クエリの実行 ツールボックスから直接データセットデザイナにクエリをドラッグして スタンドアロンクエリ ( データテーブルを使用しないクエリ ) を作成出来る 単一 ( スカラ ) 値を返す TableAdapter クエリを実行するには TableAdapter のインスタンスを作成し 戻り値を保持する変数を宣言し クエリの結果を代入する 次の例は QueriesTableAdapter に対する CustomerCount と謂うクエリが有ると仮定して居る Dim scalarqueriestableadapter As NorthwindDataSetTableAdapters.QueriesTableAdapter scalarqueriestableadapter = New NorthwindDataSetTableAdapters.QueriesTableAdapter( ) Dim returnvalue As Integer returnvalue = CType(scalarQueriesTableAdapter.CustomerCount( ), Integer) NorthwindDataSetTableAdapters.QueriesTableAdapter scalarqueriestableadapter; scalarqueriestableadapter = new NorthwindDataSetTableAdapters.QueriesTableAdapter( ); int returnvalue; returnvalue = (int)scalarqueriestableadapter.customercount( ); -2-
TableAdapter で直接データベースにアクセスする InsertCommand UpdateCommand 及び DeleteCommand に加えて データベースに対して直接実行出来るメソッドで TableAdapter が生成される 此等のメソッド (TableAdapter.Insert TableAdapter.Update 及び TableAdapter.Delete) は データベース内でデータを操作する為に直接呼び出す事が出来る 此等の直接メソッドを作成しない場合は [ プロパティ ] ウィンドウで TableAdapter の GenerateDbDirectMethods プロパティを false に設定する メインクエリに加えて TableAdapter に追加されたクエリは スタンドアロンのクエリで有る 詰まり DbDirect メソッドを生成しないクエリで有る データベースへのコマンドの直接送信 目的とするタスクを実行する TableAdapter DbDirect メソッドを呼び出す 新規レコードをデータベースに直接挿入するには 各列の値をパラメータと仕て渡して TableAdapter の Insert メソッドを呼び出す 次の手順では 例と仕て Northwind データベースの Region テーブルを使用する 使用出来るインスタンスが無い場合は 使用する TableAdapter をインスタンス化する Dim regiontableadapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter.insert(5, "NorthWestern") NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( ); regiontableadapter.insert(5, "NorthWestern"); データベース内のレコードを直接更新するには 各列の新しい値と元の値をパラメータと仕て渡して TableAdapter の Update メソッドを呼び出す 使用出来るインスタンスが無い場合は 使用する TableAdapter をインスタンス化する Dim regiontableadapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter.update(1, "East", 1, "Eastern") NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( ); regiontableadapter.update(1, "East", 1, "Eastern"); データベース内のレコードを直接削除するには 各列の値を Delete メソッドのパラメータと仕て渡して TableAdapter の Delete メソッドを呼び出す 此の例では Northwind データベースの Region テーブルを使用する 使用出来るインスタンスが無い場合は 使用する TableAdapter をインスタンス化する -3-
Dim regiontableadapter As New NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter.delete(5, "NorthWestern") NorthwindDataSetTableAdapters.RegionTableAdapter regiontableadapter = new NorthwindDataSetTableAdapters.RegionTableAdapter( ); regiontableadapter.delete(5, "NorthWestern"); サンプルコード 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( ) Form2.Dispose( ) Private Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click ' 終了する必要が有る総てのメッセージポンプを通知し ' メッセージが処理されると 総てのアプリケーションウィンドウを閉じる Application.Exit( ) Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Try ' 保存 -4-
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 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)) ' TableBind.DataSource = Ds -5-
' 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( ) ' フォームを閉じる 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_ 顧客 ) ' TableBind.DataSource = Ds ' TableBind.DataMember = "t_ 顧客 " ' データグリッドビューに表示 DataGridView1.DataSource = Ds DataGridView1.DataMember = "t_ 顧客 " Ds.Dispose( ) Ta.Dispose( ) ' DataGridView1.Columns(1).Visible = False Private Sub DataGridView1_DoubleClick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick ' 選択したら Call DgSelect( ) Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Call DgSelect( ) 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 Class -6-