SQL、コネクションの手法
  (C) 2001 A c t o r .N e t Soft Ware



 以下に公開するソースなどの著作は 篠田直樹 に復帰します。
原則として無許可で使用する事が出来ますが、ここに書かれている内容を
直リンクや引用などであたかも第三者が作成した様に見せたり如何なる事情でも金銭が発生する行為を禁止します。




DBコネクションの手法には大きく分けて二つの手法がある。
ADO(ODBC)とDAO(Jet)だが、この内で.NETベースのコネクションは概念的にADOを意識している。
つまりネットワークDBを扱う事を前提として設計されているのだ。

今まで日本でのVB開発は過ちを犯してきた、DAO(JET)を主軸としてネットワークの必要なシステムを構築
する様なものがあったが、Microsoftは元々、そういった使用方法は想定していない。
Microsoftの言い分ではDAOは元々、Accessでローカル接続する様な時にしか使わない設計になっている。
そもそも、ACCESS自体がネットワークを加味したDBツールとして使用する事が想定されていない。
だからMicrosoftとしては元々、Accessはあくまでも家庭で扱う小規模範囲内で住所録などに使うといった考え方しかない。
故にDB接続は繋ぎっぱなしで使うし排他の概念も必要ないと考えるべきだ。
つまり、DAOそのものは過去の技術遺産でしかないと考えた方がよい、そしてADO自体も同じである。

ここからは筆者の勉強不足になるが、ADO.NET自体、ADOを進化したものと見ている。
実際、.Net FrameWork上ではADO.NETが乗っている。
Microsoftとしては誤解の招く元となるDAO自体を切り離し、シンプルに再構築しようと考えている事が伺える。
その一つとして、SQLを発行する毎にDBコネクションを接続・解除する必要がでてきている様だ。
比較的、中堅の開発ならよくある話だとは思うが、この意図はユーザライセンス的な部分と資源有効化の話に繋がる。
DBに接続するには同時接続数というものが存在する、これはORACLE、SQL SERVERでも同じ話で接続数に応じて
使用ライセンス料を支払う必要がある。
当然、開発する側としてはコストを下げたいので可能な限り接続数を有効に使いたい。
必然的にDBコネクションは必要な時にしか繋げないという形になる。
DAOの場合、こういったネットワークの概念がそもそも想定されていない為、逆に接続・切断をしても
パフォーマンスを落とすだけで意味の無い結果となる。

ではJETエンジンは本当に消えたのか?
実は結果的にJETも使える、そもそもJETエンジン自体が消えるとAccess DB に接続するだけの為に
大げさなODBC設定を行う必要が出てくる。
但し、概念的にはADOを意識した作り方になってしまう様だ。
例えば、JETに接続する宣言をグローバルで取る事でSELECT文の発行はできる。
Select,Insert,Update,Delete文は別途、新しい接続インスタンスを生成してから
実行すればできなくはないが、再表示を行う時に更新や削除などを行った最新の情報が表示されない。
.NETではDB接続のオブジェクトを全てグリーバルで取る様な書き方はしない。
ここが今までのDAOとの大きな違いになりそうだ。

以下にサンプルを挙げる。

Public grOleConn As OleDb.OleDbConnection

Sub Main()
'コネクションセッティング
grOleConn = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
"F:\Documents and Settings\Administrator\デスクトップ\XXXXXXXXXXXX.mdb")
grOleConn.Open()

Dim f As New Form1
f.ShowDialog()
End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'SQL実行
Dim pstrSql As String
pstrSql = "SELECT COUNT(*) AS TT FROM DAT_CALENDER"

Dim pobjConn As OleDb.OleDbConnection = grOleConn
Dim objCmd As New OleDb.OleDbCommand
Dim objDR As OleDb.OleDbDataReader
objCmd = pobjConn.CreateCommand()


'データ取得
Try
objCmd.CommandText = pstrSql
objDR = objCmd.ExecuteReader
While objDR.Read()
MsgBox(CStr(objDR("TT")))
End While

objDR.Close()

Catch ee As Exception
Dim aa As String = ee.Message
'DBエラー
Finally
objCmd.Dispose()
objCmd = Nothing
End Try
End Sub



※Update,Insert,Delete文を発行するロジックでは必ず実行直前でコネクション定義を行う必要がある。
コネクション定義をした後、何もせずに終了すると二重トランザクションでエラーを起こす原因となる。
(DisposeやNothingで解放したりRollbackを行っても不可。)

Private Sub Btn_OK_Click()
'DB接続
Dim Ole_Conn As OleDb.OleDbConnection = grOle_Conn
Dim Ole_Cmd As OleDb.OleDbCommand = Ole_Conn.CreateCommand
Dim Ole_Trans As OleDb.OleDbTransaction = Ole_Conn.BeginTransaction
Ole_Cmd.Connection = Ole_Conn
Ole_Cmd.Transaction = Ole_Trans

Try
grStr_ChekTrace = prFrmName & " Btn_OK_Click"

Dim Str_SQL As String

Str_SQL = String.Empty
Str_SQL &= " UPDATE "
Str_SQL &= " DAT_USER SET "
Str_SQL &= " [FILE_PASS] = " & "'XXXXXXXXX'"
Str_SQL &= " WHERE "
Str_SQL &= " [USER_NAME] = " & "'XXXXXXX'"

Ole_Cmd .CommandText = Str_SQL
Ole_Cmd .ExecuteNonQuery()
Ole_Trans.Commit()

Catch ex As Exception
Ole_Trans.Rollback()
Finally
Ole_Cmd.Dispose()
Ole_Cmd = Nothing
End Try
End Sub





Copyright (C) 2001 A c t o r .N e t Soft Ware All Right Reserved