VB2005 TableAdapter


VB Tips And Sample(HOME)(VB.NET Sample インデックス)




VB2005 TableAdapterの使い方をあれこれやってみる。
本や、サイトにはこれはADO.NETではないような事が書かれている。
また、ものによってはTableAdapterを使ってやったほうが効率が良いなどと書かれている。
で、どちらを使うべきか?

管理人が??の点。 
データアダプタで定義されたデータセットで、100フィールドあるテーブルの2フィールドだけ取得 で検索する場合、残りの98フィールドのからのスキーマ?まで取得していることになるらしい。?
パフォーマンスを追及する時に結局全部書き直しになりかねない?

Access2000形式にJETで接続したところトランザクションの実装が面倒らしい。
サンプルがないだけか?
Access2000はいつまで使えるかは不明だが、Access2007では読み込めるしAccess2003では2000形式が デフォルトだったことを考えると確信はないがまだまだ使えるようだ。
因みにVista上では2000形式は使用できる。Access2007でも2000形式が作成可能である。
また、2007形式はWIN2000ではサポートされないらしい。(というのはOffice2007のOSにWIN2000が入っていないから。)
XPSP2以降とい言うことだ。
そのような事を考えるとJET4.0はまだ健在らしい。

TableAdapterの接続文字を任意の外部ファイルに持たせることができそうにない。
app名.exe.configというファイルに書かれているが、システムフォルダに放り込んではたぶんダメだろうと思う。
ユーザに勝手に書き換えられる可能性が出てくるだろう。

VB6で言うところのDataEnvironmentみたいなものだと思う。結局DataEnvironmentは使わなかった。
TableAdapterでは複雑なクエリ等は大丈夫か?に疑問点がる。
テーブル名に日本語が入っていると、自動的に日本語のソースになる。変えられるようだが変えるなら最初から書いたほうがいい?

良い点としては、ドラッグドロップで簡単なDBアプリができる。
初心者にはとっつきやすい。フィールド名(データ型付き)がプロパティー参照できるなど。



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 Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    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 Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    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 DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

    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


VB Tips And Sample(HOME)(VB.NET Sample インデックス)