【実務・中級編】VB.NETからSQL Serverを操作する:ADO.NET(SqlCommand/SqlDataReader)の基本と安全な接続管理 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

VB.NETでSQL Serverを制する:ADO.NETの「正しい」流儀と堅牢な設計

業務自動化ツールを開発する際、データベース(SQL Server)との対話は避けて通れない関門だ。しかし、多くの現場で見かけるのは「動けばいい」という場当たり的な実装であり、それが数ヶ月後の大規模な改修や、重大なセキュリティホールを招いている。

私はこれまで数多のレガシーコードを再構築してきたが、共通しているのは「コネクションの管理」と「パラメータ化」の軽視だ。今日は、VB.NETからSQL Serverを操作する際の「プロダクション品質」の作法を伝授する。

—

1. なぜ「接続」を使い回してはいけないのか

初心者が陥りやすい最大の罠は、コネクションをクラスのメンバ変数で保持し、アプリ終了まで閉じない実装だ。これはメモリリークの温床であり、コネクションプールの枯渇を招く。

ADO.NETの鉄則は「接続を開き、最短時間で使い、即座に解放する」ことだ。これを完璧に保証するのが `Using` ステートフである。例外が発生しても確実にリソースを解放するこの構文を避ける理由は存在しない。

2. 堅牢なデータ取得:SqlCommandとSqlDataReader

以下は、SQLインジェクションを物理的に封じ、且つメモリ負荷を最小限に抑えるための標準的なパターンだ。

Imports System.Data.SqlClient

Public Class DatabaseManager
‘ 接続文字列はハードコードせず、App.config等から取得すること
Private ReadOnly _connectionString As String = “Server=myServerAddress;Database=myDataBase;Integrated Security=True;”

”’

”’ パラメータ化クエリを用いた安全なデータ取得
”’

Public Sub FetchCustomerData(customerName As String)
‘ Usingブロックでコネクションとコマンドをスコープ管理する
Using conn As New SqlConnection(_connectionString)
Dim sql As String = “SELECT Id, Name, Email FROM Customers WHERE Name = @Name”

Using cmd As New SqlCommand(sql, conn)
‘ SQLインジェクションを防ぐためのパラメータ指定
‘ 型を明示することで、DBエンジン側の実行計画キャッシュ効率も向上する
cmd.Parameters.Add(“@Name”, SqlDbType.NVarChar, 100).Value = customerName

Try
conn.Open()

‘ SqlDataReaderは前方専用・読み取り専用の高速なイテレータ
Using reader As SqlDataReader = cmd.ExecuteReader()
While reader.Read()
‘ カラム名でアクセスするよりもインデックスアクセスの方が高速だが、
‘ メンテナンス性を考え、読み込み時に列番号を取得しておくのが定石
Dim id As Integer = reader.GetInt32(reader.GetOrdinal(“Id”))
Dim name As String = reader.GetString(reader.GetOrdinal(“Name”))

Console.WriteLine($”ID: {id}, Name: {name}”)
End While
End Using

Catch ex As SqlException
‘ ここでログを吐く。生のエラーを画面に表示してはならない
Throw New Exception(“DBアクセスエラーが発生しました。”, ex)
End Try
End Using
End Using
End Sub
End Class

—

3. なぜ「パラメータ化」は譲れない条件なのか

`”SELECT FROM Users WHERE Name = ‘” & input & “‘”` のような文字列結合を、私は「コードの自爆スイッチ」と呼んでいる。

パラメータ化を行うことは、単なるセキュリティ対策ではない。
1. 実行計画の再利用: SQL Serverはクエリ文字列をハッシュ化してキャッシュする。パラメータ化すれば、値が変わっても同じ実行計画が使われ、DBの負荷が激減する。
2. 型安全: 入力値の型を明示することで、予期せぬ型変換によるパフォーマンス低下やエラーを防げる。

4. アーキテクトからのアドバイス:保守性を高めるために

このコードを実際に現場へ投入する際は、以下の視点を持つこと。

  • 接続文字列の外部化: `App.config` や `Web.config` を使用せよ。環境が変わるたびにリコンパイルを強いるツールは、もはや負債だ。
  • 例外処理の粒度: 上記例では `SqlException` を捕捉しているが、実際の業務アプリでは「接続失敗」と「クエリ実行エラー」を切り分け、リトライ処理を入れるべきか検討が必要だ。
  • Disposeの意識: `Using` 構文は内部的に `Dispose()` を呼ぶ。ファイル操作やDB操作など、アンマネージドリソースに触れる際は常に「使い終わったらすぐ捨てる」という執念を持つこと。

—

結びに:コードはあなたの「背中」を映す

VB.NETは、適切に扱えば極めて強力な業務自動化の武器となる。しかし、書き手のいい加減さは、そのままバグという形でシステムに刻まれる。

今回提示した `Using` ブロックと `SqlParameter` の徹底。これだけで、あなたの書くツールは「趣味のスクリプト」から「堅牢なプロダクションコード」へと進化する。次にコードを書くとき、目の前のクエリが「安全か、効率的か」を自問自答してほしい。

それが、プロのエンジニアとしての最低限の品格だ。

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