こんにちは。現場で泥臭いトラブルを一つずつ解決し、ようやく「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ケーブルを抜いてみたり、わざとエラーを起こしてロールバックの動きを確認してみてください。
その「実験」こそが、あなたを伝説のエンジニアへと変える最短ルートです。頑張りましょう!応援していますよ。
