QA@IT
«回答へ戻る

回答を投稿

SubmitChangesという事は LinqToSQLでしょうか。
LinqToSQLはEntity Frameworkよりも楽な部分はありますが、Entity Frameworkの方も見ておいた方が良いかと思います。

回答の前に環境ですが、Win10, VS2015の環境で書いています。
TestIDの型が数値になってますが、環境に合わせて変更してください。

まずはInsert相当の機能です。
TESTクラスを生成して、InsertOnSubmitを呼べば実現できると思います。
複数(List(Of TEST)等)の場合は、InsertAllOnSubmitを使用します。

Using db = New TestDataContext()
    Dim newRow As New TEST()
    newRow.TestID = 1
    newRow.TestName = "A"
    newRow.TestCompany = "B"

    db.TEST.InsertOnSubmit(newRow)
    db.SubmitChanges()
End Using

その他気になった点ですが、

Dim sql = (From p In db.TEST Where p.TestID = strID Select p)

From 以降の部分はLinqのクエリ式というものでSQLではありません。
慣例的には変数名は qにすることが多いですかね。(使用範囲が広い場合はもっとなんのクエリかわかる名前にします)

クエリ式とは別にメソッド式というものもあります。私はメソッド式の方が好きなのでメソッド式で書くと以下の様になります。
ラムダ式(その場で関数を作って使う)が出てきてわかりにくいかもしれませんがこの書き方も知っておいた方が良いでしょう(Webでサンプル探すときなど)。VBのラムダ式はキーワードが多いせいでちょっと見にくいかもしれませんね。

Dim sql = db.TEST.Where(Function(x) x.TestID = strID)

これを使って更新を書くと以下の様に書くことができます。

Using db = New TestDataContext()
    db.TEST.Where(Function(x) x.TestID = 1) _
            .ToList() _
            .ForEach(Sub(x)
                x.TestName = "a"
                x.TestCompany = "b"
            End Sub)
    db.SubmitChanges()
End Using

削除に関してはループで回さずともDeleteAllOnSubmitというのがあるので

Using db = New TestDataContext()
    Dim q = db.TEST.Where(Function(x) x.TestID = 2)
    db.TEST.DeleteAllOnSubmit(q)

    db.SubmitChanges()
End Using

と書くこともできます。


Entity Frameworkについて。

最初に述べたように、Entity Frameworkの方も見ておいた方が良いかと思います。
現状のコードであれば初期設定以外それほど差がないので、ソリューションに別のプロジェクトを追加して触れてみるのもいいかとおもいます。
私の環境だと以下の手順になります(VSのバージョンや導入されているEntity Frameworkのバージョンによっていくつか異なるかもしれません)。
ここで示すのはいくつかあるEntity Frameworkの導入方法の一つですが、復習がてらおまけで書いているだけなのであまり詳しくは説明しません。最後のコードが今のコードとあまり変わらないことがわかってもらえれば良いと思っています。

※ DB (SQL Server または SQL Server ファイルデータベース)が既にある前提です。

  • 新しいプロジェクト(コンソールアプリケーションで構いません)を作り、プロジェクトを右クリックして新しい項目の追加を選ぶ。
  • ADO.NET Entity DataModel を選択し、名前をTestDataに。
  • Entity DataModel ウィザードで「データベースから EF Designer」を選択
  • データ接続を選ぶ。下の接続設定の名前が、TestDataContextの様なクラス名として使われる。ここではTestDbEntitiesにした。
  • モデルに含めるデータベースオブジェクトでTESTテーブルを選択する。

このように作成したEntity Frameworkモデルの追加、更新、削除のコードが以下の様になります。
(ここでもTestIDは数値型です。これは私がそう作ってしまったからで数値にしないといけないわけではありません。)

追加、削除などのメソッドがただのリストに近い形になっています(Add,AddRange, Remove, RemoveRange など)
SubmitChangesではなくSaveChangesになっています。
これぐらいのコードだと違いはそれくらいでしょうか。

Module Module1

    Sub Main()

        Using db As New TestDbEntities()
            Dim newRow As New TEST()
            newRow.TestID = 1
            newRow.TestName = "A"
            newRow.TestCompany = "B"

            db.TEST.Add(newRow) ' 複数なら AddRange
            db.SaveChanges()
        End Using


        Using db As New TestDbEntities()
            db.TEST.Where(Function(x) x.TestID = 1) _
                .ToList() _
                .ForEach(Sub(x)
                             x.TestName = "a"
                             x.TestCompany = "b"
                         End Sub)
            db.SaveChanges()
        End Using

        Using db As New TestDbEntities()

            Dim q = db.TEST.Where(Function(x) x.TestID = 2)
            db.TEST.RemoveRange(q)
            db.SaveChanges()
        End Using
    End Sub
End Module

長くなりましたが以上ご参考までに。

SubmitChangesという事は LinqToSQLでしょうか。
LinqToSQLはEntity Frameworkよりも楽な部分はありますが、Entity Frameworkの方も見ておいた方が良いかと思います。

回答の前に環境ですが、Win10, VS2015の環境で書いています。
TestIDの型が数値になってますが、環境に合わせて変更してください。

まずはInsert相当の機能です。
TESTクラスを生成して、InsertOnSubmitを呼べば実現できると思います。
複数(`List(Of TEST)`等)の場合は、InsertAllOnSubmitを使用します。
```vb
Using db = New TestDataContext()
    Dim newRow As New TEST()
    newRow.TestID = 1
    newRow.TestName = "A"
    newRow.TestCompany = "B"

    db.TEST.InsertOnSubmit(newRow)
    db.SubmitChanges()
End Using
```

その他気になった点ですが、
```vb
Dim sql = (From p In db.TEST Where p.TestID = strID Select p)
```
From 以降の部分はLinqのクエリ式というものでSQLではありません。
慣例的には変数名は `q`にすることが多いですかね。(使用範囲が広い場合はもっとなんのクエリかわかる名前にします)

クエリ式とは別にメソッド式というものもあります。私はメソッド式の方が好きなのでメソッド式で書くと以下の様になります。
ラムダ式(その場で関数を作って使う)が出てきてわかりにくいかもしれませんがこの書き方も知っておいた方が良いでしょう(Webでサンプル探すときなど)。VBのラムダ式はキーワードが多いせいでちょっと見にくいかもしれませんね。

```vb
Dim sql = db.TEST.Where(Function(x) x.TestID = strID)
```

これを使って更新を書くと以下の様に書くことができます。
```vb
Using db = New TestDataContext()
    db.TEST.Where(Function(x) x.TestID = 1) _
            .ToList() _
            .ForEach(Sub(x)
                x.TestName = "a"
                x.TestCompany = "b"
            End Sub)
    db.SubmitChanges()
End Using
```

削除に関してはループで回さずともDeleteAllOnSubmitというのがあるので
```vb
Using db = New TestDataContext()
    Dim q = db.TEST.Where(Function(x) x.TestID = 2)
    db.TEST.DeleteAllOnSubmit(q)

    db.SubmitChanges()
End Using
```
と書くこともできます。

---

Entity Frameworkについて。

最初に述べたように、Entity Frameworkの方も見ておいた方が良いかと思います。
現状のコードであれば初期設定以外それほど差がないので、ソリューションに別のプロジェクトを追加して触れてみるのもいいかとおもいます。
私の環境だと以下の手順になります(VSのバージョンや導入されているEntity Frameworkのバージョンによっていくつか異なるかもしれません)。
ここで示すのはいくつかあるEntity Frameworkの導入方法の一つですが、復習がてらおまけで書いているだけなのであまり詳しくは説明しません。最後のコードが今のコードとあまり変わらないことがわかってもらえれば良いと思っています。

※ DB (SQL Server または SQL Server ファイルデータベース)が既にある前提です。

* 新しいプロジェクト(コンソールアプリケーションで構いません)を作り、プロジェクトを右クリックして新しい項目の追加を選ぶ。
* ADO.NET Entity DataModel を選択し、名前をTestDataに。
* Entity DataModel ウィザードで「データベースから EF Designer」を選択
* データ接続を選ぶ。下の接続設定の名前が、`TestDataContext`の様なクラス名として使われる。ここではTestDbEntitiesにした。
* モデルに含めるデータベースオブジェクトでTESTテーブルを選択する。

このように作成したEntity Frameworkモデルの追加、更新、削除のコードが以下の様になります。
(ここでもTestIDは数値型です。これは私がそう作ってしまったからで数値にしないといけないわけではありません。)

追加、削除などのメソッドがただのリストに近い形になっています(Add,AddRange, Remove, RemoveRange など)
SubmitChangesではなくSaveChangesになっています。
これぐらいのコードだと違いはそれくらいでしょうか。

```vb
Module Module1

    Sub Main()

        Using db As New TestDbEntities()
            Dim newRow As New TEST()
            newRow.TestID = 1
            newRow.TestName = "A"
            newRow.TestCompany = "B"

            db.TEST.Add(newRow) ' 複数なら AddRange
            db.SaveChanges()
        End Using


        Using db As New TestDbEntities()
            db.TEST.Where(Function(x) x.TestID = 1) _
                .ToList() _
                .ForEach(Sub(x)
                             x.TestName = "a"
                             x.TestCompany = "b"
                         End Sub)
            db.SaveChanges()
        End Using

        Using db As New TestDbEntities()

            Dim q = db.TEST.Where(Function(x) x.TestID = 2)
            db.TEST.RemoveRange(q)
            db.SaveChanges()
        End Using
    End Sub
End Module
```

長くなりましたが以上ご参考までに。