ASP データベースアクセス

  目次







  db.inc ( 汎用 DB アクセス関数 )



  
<SCRIPT language=VBScript RUNAT=server>

Dim ConnectionString

' ******************************************************
' Application 変数による DB接続
' ******************************************************
Function DBConnectByEnv( DBType, Connection )

	DBConnectByEnv = _
	DBConnect( _
		DBType, _
		Connection, _
		Application("SERVER"), _
		Application("DB"), _
		Application("USER"), _
		Application("PASS") _
	)

End Function

' ******************************************************
' DB接続
' ******************************************************
Function DBConnect( _
	DBType, _
	Connection, _
	strTarget, _
	strDB, _
	strUser, _
	strPass _
)

	if IsEmpty( Connection ) then
		Set Connection = Server.CreateObject( "ADODB.Connection" )
	end if

	Select Case DBType
		Case "Excel"
			ConnectionString = _
				"Provider=Microsoft.Jet.OLEDB.4.0;" & _
				"Data Source=" & strTarget & ";" & _
				"Extended Properties=""Excel 8.0;IMEX=1;"""
		Case "MDB"
			ConnectionString = _
				"Provider=Microsoft.Jet.OLEDB.4.0;" & _
				"Data Source=" & strTarget & ";"
		Case "MySQL"
			ConnectionString = _
				"Provider=MSDASQL" & _
				";DSN=" & strTarget & _
				";DATABASE=" & strDB & _
				";UID=" & strUser & _ 
				";PWD=" & strPass & _ 
				";" 
		Case "SQLServer"
			ConnectionString = _
				"Provider=SQLOLEDB;" & _
				"Data Source=" & strTarget & ";" & _
				"Initial Catalog=" & strDB & ";" & _
				"User ID=" & strUser & ";" & _
				"Password=" & strPass & ";"
	End Select

	DBConnect = True

	on error resume next
	Connection.Open ConnectionString
	if Err.Number <> 0 then
		Response.Write "DB に接続できません "
		Response.Write Err.Description
		DBConnect = False
	end if
	on error goto 0

End Function

' ******************************************************
' DB終了処理(接続を閉じる)
' ******************************************************
Function DBClose( _
	CnRs _
)

	On Error Resume Next
	If CnRs.State >= 1 Then
		CnRs.Close
	End If
	On Error Goto 0

	DBClose = True

End Function

' ******************************************************
' DB読込み
' 【戻り値】: True(データ有り),False(データ無し)
' ******************************************************
Function DBGet( _
	Connection, _
	Record, _
	SqlQuery, _
	bUpadateFlg _
)

	if IsEmpty( Record ) then
		Set Record = Server.CreateObject( "ADODB.Recordset" )
	end if

	' 閉じていない時は閉じる
	If Record.State >= 1 Then
		Record.Close
	End If

	' 更新処理に使用する場合は、レコード単位の共有的ロック
	If bUpadateFlg Then
		Record.LockType = 3
	End If

	' レコードセット作成
	On Error Resume Next
	Record.Open SqlQuery, Connection
	If Err.Number <> 0 then
		Response.Write Err.Description
	End If
	If Record.EOF Then
		DBGet = False
	Else
		DBGet = True
	End If
	On Error Goto 0

End Function

' ******************************************************
' EOF
' 【戻り値】: True(EOF),False(データ有り)
' ******************************************************
Function DBEof( Record )

	Dim bRet

	On Error Resume Next
	bRet = Record.EOF
	If Err.Number <> 0 then
		Response.Write "DBEof でエラー : " & Err.Description
		DBEof = True
		Exit Function
	End If
	On Error Goto 0

	DBEof = bRet

End Function

</SCRIPT>
  



  トランザクションの使用

トランザクションは、複数のテーブルへの更新でシステムでの整合性を保つために使用されます

例えば、2つのテーブルへの更新で、片方がなんらかの理由で失敗した場合元へ戻す必要があります。
その為には更新の開始位置を決め( BeginTrans )、失敗した場合は RollbackTrans で元へ戻します
( ※ 更新確定は CommitTrans )

全てのプロバイダがこのメソッドを使用できるわけではありません
使用可能かどうかは以下のような関数を作成してチェックして下さい

  
function CheckTrans( CheckCn )

	Dim bTransaction

	on error resume next
	bTransaction = CheckCn.Properties("Transaction DDL").Name
	if Err.Number <> 0 then
		bTransaction = False
	else
		bTransaction = True
	end if
	on error goto 0

	CheckTrans = bTransaction

end function
  

以下は、複数の更新処理を想定した簡単な骨格です

  
' ************************************************
' 更新処理
' ************************************************
function UpdateData()

	Dim i

	Cn.BeginTrans

	For i = 1 to 5

		on error resume next
		Call Cn.Execute( SqlUpdate(i) )
		if Err.Number <> 0 then
			Cn.RollbackTrans
			UpdateData = False
			Exit Function
		end if
		on error goto 0

	Next

	Cn.CommitTrans
	UpdateData = True

end function
  



  SQLベースの更新

最初に UPDATE を実行し、更新対象が無かった場合 INSERT を実行します
夜間バッチ処理などの、他で変更される恐れの無い場合に非常に有効です

  
' ************************************************
' 更新処理
' ************************************************
function UpdateData()

	SqlUpdate = "update 更新テーブル set "
	SqlUpdate = SqlUpdate & "名称 = '名称',"
	SqlUpdate = SqlUpdate & "数値 = 100,"
	SqlUpdate = SqlUpdate & "日付 = NULL"
	SqlUpdate = SqlUpdate & " where コード = '0001'"

	Cn.Execute SqlUpdate, RecordsAffected

	if RecordsAffected = 0 then
		SqlUpdate = "insert into 更新テーブル values("
		SqlUpdate = SqlUpdate & "'0001','名称',100,NULL"
		SqlUpdate = SqlUpdate & ")"
		Cn.Execute SqlUpdate
	end if

end function
  



  オブジェクトベースの更新

他で変更されたかどうかの確認が必要な場合は、いったん読み出す必要があります
但し、一つのレコードセットで一つのテーブルしか処理できないという制限があります

  
' ************************************************
' 更新処理
' ************************************************
function UpdateData()

	Query = "select * from 更新テーブル"

	Rs.LockType = 3
	Rs.Open Query, Cn

	if Rs.EOF then
		Rs.AddNew
		Rs.Fields( "コード" ).Value = "0001"
	end if

	Rs.Fields( "名称" ).Value = "名称"
	Rs.Fields( "数値" ).Value = 100
	Rs.Fields( "日付" ).Value = Empty

	Rs.Update

end function
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ