【入門編】SQL ServerとWindows Formsのシームレス連携:SqlCommandBuilderを用いた高速バルクインサートとエラー時ロールバック – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは。現場で泥臭いトラブルを一つずつ解決し、ようやく「VB.NETでシステムを組む」ということが何たるかが見えてきた皆さん、ようこそ。

マクロやスクリプトの記録から一歩踏み出し、本格的な業務アプリケーションを構築しようとしているあなたへ。今日は、多くの開発者が避けて通りがちな、しかし「これさえ押さえれば一人前」と言えるSQL ServerとWindows Formsの鉄壁の連携術についてお話しします。

単にデータを保存するだけなら誰でもできます。しかし、「ネットワークが切れたらどうする?」「1,000件のデータを一瞬で、かつ矛盾なく登録するには?」という問いに応えられるのが、本物のエンジニアです。

—

1. なぜ「SqlCommandBuilder」と「トランザクション」なのか?

Windows Formsの `DataGridView` に表示された大量のデータをデータベースへ保存する際、一つずつ `INSERT` 文を発行していては、ネットワークの往復回数が多すぎてアプリはフリーズしたように重くなります。

ここで登場するのが、`SqlDataAdapter` と `SqlCommandBuilder` のコンビです。これを使うと、メモリ上のデータを一括でデータベースに同期できます。そして、その同期作業を「オール・オア・ナッシング(すべて成功か、すべて無効か)」にするのがトランザクションです。

2. 実装の設計図:安全なバルク登録

まずは、現場でそのまま使える「高速かつ安全なバルク登録」のコードパターンを見ていきましょう。

Imports System.Data.SqlClient

Public Sub SaveDataToDatabase(dt As DataTable)
‘ 接続文字列(環境に合わせて変更してください)
Dim connString As String = “Server=myServerAddress;Database=myDataBase;Integrated Security=True;”

Using conn As New SqlConnection(connString)
conn.Open()

‘ トランザクション開始:これがデータの砦です
Using trans As SqlTransaction = conn.BeginTransaction()
Try
Dim adapter As New SqlDataAdapter(“SELECT FROM MyTable”, conn)
adapter.SelectCommand.Transaction = trans

‘ SqlCommandBuilderが自動的にINSERT/UPDATE/DELETEを生成
Dim builder As New SqlCommandBuilder(adapter)

‘ データの同期(一括更新)
adapter.Update(dt)

‘ 全て成功したらコミット
trans.Commit()
MessageBox.Show(“登録完了!”)

Catch ex As Exception
‘ 失敗したら即ロールバック。データ汚染を防ぎます
trans.Rollback()
MessageBox.Show(“登録失敗。データは元に戻りました。エラー: ” & ex.Message)
End Try
End Using
End Using
End Sub

このコードの「本質」

  • `Using` ステートメントの徹底: データベースとの接続(`SqlConnection`)は非常に重い資源です。`Using` を使うことで、処理が終われば即座にメモリを解放します。これを忘れると「接続プール」が枯渇し、アプリが起動しなくなります。
  • トランザクションの役割: もし100件中99件入って最後でエラーになったら?トランザクションがなければ、中途半端なデータが残ります。`Rollback()` は、その99件を「なかったこと」にしてくれる魔法です。

—

3. ネットワーク切断に備える「リトライロジック」

現場のPCは、時に無情にもLANケーブルが抜けます。そんな時、ただエラーを出すのは初心者です。「数秒待ってからもう一度試す」というリトライ処理を組み込みましょう。

Public Function SaveWithRetry(dt As DataTable, maxRetries As Integer) As Boolean
Dim retryCount As Integer = 0

While retryCount < maxRetries Try SaveDataToDatabase(dt) ' さっきの処理を呼ぶ Return True Catch ex As SqlException retryCount += 1 ' 数秒待機して再試行 System.Threading.Thread.Sleep(2000) End Try End While Return False End Function ---

4. 初学者が陥りやすい「罠」

これから皆さんが必ずぶつかる壁が2つあります。

1. UIスレッドのフリーズ:
データ量が数万件を超えると、`adapter.Update()` を実行している間、画面が真っ白になり動かなくなります。これは「重い処理は裏側でやれ」というOSからのサインです。`Async / Await` を使って非同期処理を学びましょう。
2. 主キーの競合:
`SqlCommandBuilder` はテーブルに主キー(Primary Key)がないと動作しません。データベース設計が甘いと、ここですべてが崩壊します。VB.NETのコード以前に、DBの設計が全ての基本であることを忘れないでください。

—

最後に:先輩からのメッセージ

「コードを書いて動かす」のは通過点に過ぎません。皆さんに目指してほしいのは、「何が起きてもシステムを壊さない、ユーザーに不安を与えない堅牢なコード」を書くエンジニアです。

今回紹介したトランザクションとリトライロジックは、どんな大規模システムでも共通する「生命線」です。まずは手元の小さなプロジェクトで、あえてLANケーブルを抜いてみたり、わざとエラーを起こしてロールバックの動きを確認してみてください。

その「実験」こそが、あなたを伝説のエンジニアへと変える最短ルートです。頑張りましょう!応援していますよ。

タイトルとURLをコピーしました