現在、PWS+ASP+ACCESSを使用し開発を行っていますが排他制御で悩んでいます。
ASPは、ステートレスなセッションでの制御しか出来ないため、ページを表示後のデータの変更はスタンドアロンでの更新のような形になってしまうと思います。

以下のような方法で行っている実例を見たことがありますが、少なからず問題も抱えていると思います。
・レコード毎に排他フラグを保持する ~ 処理がアベンドした場合にフラグが残る(一定時間後に解除という方法もありますが)
・レコード毎に更新時間を持ち、読込時の更新時間と更新時の更新時間とを比較し更新されていない時だけ更新をかける ~ 後に更新をかけようとした変更が無駄になる


上記の方法以外で、排他制御を実現させる良い方法はないのでしょうか。他の方法で実現しているときは、その方法を教えて頂けませんでしょうか。
※PWS→IIS、ACCESS→SQLServerに変更する可能性はあります。
(セッションオブジェクト・アプリケーションオブジェクト等を使用しての実現方法など)
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

排他制御なのですが、これは、データベースのデータ整合性をとるための排他制御と考えてよいのでしょうか?


もしそうであるなら、排他制御自身をデータベースに任せてはどうでしょうか?もちろんデータベース自身の排他制御にもいくつかの問題点はありますが・・・

たとえば、Webに表示させたデータに対して、更新を行うときに、表示用データを取り出したときに取り出したデータに対し、排他的読み取りをするのであれば、同時ユーザー数の問題で、非常にレスポンスの遅いものになってしまいます。

それでよければ、セッションオブジェクトにロックをかけたレコードセットを格納してはどうでしょうか?もちろん、ロックをかけたレコードセットの開放も忘れないようにしなければなりません。

具体的には、
Set Session("[適当な名前]")=objRecordset
とすることで、ロックをかけたレコードセットをステートフルにあつかうことができます。
    • good
    • 0

無難なのはApplication変数を利用した方法かなぁ~と


手抜きなソースですけど

On Error Resume Next
Application.Lock
Application("lock") = True
'--- データベースの更新処理など
Application.Unlock

If Err.Number <> 0 Then
'--- エラー処理(終了処理など)
End If
On Error Goto 0

こんなのじゃ駄目でしょうか?
参考までに
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

よろしくお願いいたします。

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

QASP レコードセットオブジェクト

コレクションにFieldsからAddし、展開するとエラーが発生します。(エラーは下記)
レコードが単純に取得できていないと見せかけて、Recordcountはしっかりと取れてますし、仮にコレクションAdd前に変数に置き換えると問題なくAddされています。
この現象について何か問題は考えられますか?
補足につきましては徹夜作業につき随時行います。
ソースが長すぎて、個別で送ります。
例)
 (1)'オブジェクト直接からのAddの場合
MSTCol.Add "ID", PrmRec.Fields("ID")・・・×
 (2)'変数に置き換えてからのAddの場合
S_ID = PrmRec.Fields("ID")
MSTCol.Add "ID", S_ID ・・・○

--ソース----------------------------------------
2|SQL = "SELECT ID, NAME, TEL FROM MST_PEOPLE ORDER BY ID"
3|'DB接続&レコードセット
4|Set RetRec = DBCon_RecSet(SQL)
5|'レコード置き換え処理実行
6| Set RetListObj = CreateListObj(G_RecSearch)
7|'確認としての処理(テスト段階)
8|Set Item_NO = RetListObj(1)
9|value1 = Item_NO.Item("TEL")
10|Response.Write(Value1)

エラー タイプ
ADODB.Field (0x800A0BCD)
BOF と EOF のいずれかが True になっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。

エラー行数13行目

コレクションにFieldsからAddし、展開するとエラーが発生します。(エラーは下記)
レコードが単純に取得できていないと見せかけて、Recordcountはしっかりと取れてますし、仮にコレクションAdd前に変数に置き換えると問題なくAddされています。
この現象について何か問題は考えられますか?
補足につきましては徹夜作業につき随時行います。
ソースが長すぎて、個別で送ります。
例)
 (1)'オブジェクト直接からのAddの場合
MSTCol.Add "ID", PrmRec.Fields("ID")・・・×
 (2)'変数に置き換えてか...続きを読む

Aベストアンサー

以下のようにしてみてもダメでしょうか?

MSTCol.Add "ID", PrmRec.Fields("ID").Value

QVBAでオブジェクト変数にsetしたシートがactiveかどうかを調べるには?

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nValue as integer)
  xxxxxx ←ここでoSheetAがActiveならやりたいことがある。
  oSheetA.Cells(nRow, nCol) = cValue
End Sub

具体的には、複数のBookを開いている状態で、Activeシートが何であるかはオペレータの操作次第なので固定化できない状態で、SetValueが呼び出されたとき、oSheetAがActiveだったら、値をセットするセルが見えるようにセルをActivateかスクロールさせたいんです。

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nVa...続きを読む

Aベストアンサー

Option Explicit

Private oSheetA As Worksheet

Sub SetSheet(sName As String)
Set oSheetA = Worksheets(sName)
End Sub

Sub SetValue(nValue As Integer)
If oSheetA Is ActiveSheet Then
MsgBox ("hoge")
End If
oSheetA.Cells(1, 1) = nValue
End Sub

Sub Main()
SetSheet ("Sheet1")
SetValue (5)
End Sub

'実行できるようにソースは変更していますが,
'こんな感じでIs演算子で同じオブジェクトか比較してみるってのはどうでしょう?

QASP レコードセットしたオブジェクトを戻り値に出来ませんか?

ASPは本当にドキュメントが少なく困っています。



---Main.asp----------------------------------

Dim RetRec

'DB接続
Call DBOpen()

'SQL文
strSQL = "SELECT・・・・"

'レコードオープン実行
Set RetRec = RecOpen(strSQL)

'レコードカウント取得
RecCnt = RetRet.RecordCount
 ・
 ・
 ・
--DBCon.asp--------------------------
Public Function RecOpen(SQLPrm)

'オブジェクト宣言
Set G_RecMap = Server.CreateObject("ADODB.Recordset")

'レコードオープン
G_RecMap.Open SQLPrm, G_Conn, 3, 3, 1

'復帰値作成
RecOpen = G_RecMap

Exit Function

End Function
-----------------------------------------
エラー内容
オブジェクトでサポートされていないプロパティまたはメソッドです。: 'RecordCount'

・・・当然のことながら、復帰値をオブジェクトとして
拾っていないので、上記エラーが表示された。
-------------------------------------------


上記のようにレコードセットしたオブジェクトは返せますでしょうか?同じ要領で行うと上手く行かないのですが。。。お手数ですが、よろしくお願いします

Sessionの使用は禁止となっています。

ASPは本当にドキュメントが少なく困っています。



---Main.asp----------------------------------

Dim RetRec

'DB接続
Call DBOpen()

'SQL文
strSQL = "SELECT・・・・"

'レコードオープン実行
Set RetRec = RecOpen(strSQL)

'レコードカウント取得
RecCnt = RetRet.RecordCount
 ・
 ・
 ・
--DBCon.asp--------------------------
Public Function RecOpen(SQLPrm)

'オブジェクト宣言
Set G_RecMap = Server.CreateObject("ADODB.Recordset")

'レコードオープン
G_...続きを読む

Aベストアンサー

> ASPは本当にドキュメントが少なく困っています。
そうかなぁ…。MSサイトのMSDN Libraryに大抵の事は載ってますよ。
個人のサイトもたくさんあるし。。。

これでは如何でしょうか?(インデントのため全角スペース使用)

Public Function RecOpen(SQLPrm)

 Set G_RecMap = Server.CreateObject("ADODB.Recordset")
 G_RecMap.Open SQLPrm, G_Conn, 3, 3, 1

 Set RecOpen = G_RecMap ' ** ← ここ直しました

End Function

ところで上記関数にConnectionをCreateしている箇所がないのですが
それはいいのかな?

見当違いならごめんなさいませ。頑張ってくださいm(_ _)m

QVoidポインタで受け取った変数の型を調べる方法

あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。

Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

Aベストアンサー

★基本的に調べようがありません。
・『void』ポインタはアドレス情報のみを受け渡しますので、型のサイズまでは分かりません。
 逆に言えば、型のサイズが分からないから『汎用ポインタ』と呼べるのです。
・あるライブラリの関数とは何?→どんな関数か分かりませんので、これ以上はアドバイス無理!
 ただ、C言語の qsort などでは比較用の関数で『void』ポインタを受け取りますが、その関数内で
 渡されたデータの『型』を指定します。→ポインタの形でキャストします。
 この比較用の関数は自前で用意する関数ですので、ソートするデータの型が分かっています。
 でも、ソートするデータ型が複数ある場合は、比較用の関数を複数作って切り替えます。
・あと関数に型を表す引数があれば、それを見て判断できますが、そうでない場合は『void』ポインタで
 渡される前の『型』の調べることは不可能です。→言語仕様より。
・以上。参考に。→一応、あるライブラリの関数とは何?

QIISのセッション情報について(旧ASPとASP.NETの共有)

IISのセッション情報について(旧ASPとASP.NETの共有)

うっすらと無理というかそんなコトしたら、セッション情報がダダ漏れになりそうな気がしますが、
標題のように、旧ASPのSession("hogehoge")の値をASP.NETから参照することは
技術的に可能なのでしょうか??

ご存知の方いらっしゃいましたら、ご教示をお願いします。

Aベストアンサー

出来ません

参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=41021&forum=7

QVBAでテキストファイルの件数を調べる方法

Access2000のVBAで関数を使用して
ファイルのパス名、ファイル名を指定すれば、
テキストファイルの件数を検索し変数に返す
関数はありませんか?
   
通常テキストファイルを開き1件1件カウントを
取っていけば件数を知ることは可能ですが、
数千レコードのテキストファイルが複数個存在
する場合処理スピードが遅くなるため何か
最適な関数はありませんか?
よろしくお願い致します。

Aベストアンサー

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

参考URL:http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm,http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/l

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

...続きを読む

Qasp.netでのセッションを使用したログイン

asp.netでmssql server を利用してログイン機能を実装しました。
以下のようなコードでmssqlに保存してあるIDとパスが一致すれば
以降の画面ではセッションにID、パスが保存され
page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。
機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。
商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。
よろしくお願いいたします。

**************************************************************
ログインページ
**************************************************************
Dim staffid As Integer
Dim staffname As String
Dim adminflag As Boolean

Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'ユーザーIDの入力チェック
If txtUserID.Text = "" Then
lblErr.Text = "ユーザーIDを入力してください。"
Return
End If
'パスワードの入力チェック
If txtpassword.Text = "" Then
lblErr.Text = "パスワードを入力してください。"
Return
End If

'ユーザーとパスワードの検証
If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then
lblErr.Text = "ユーザーIDまたはパスワードが違います。"
Return
End If
'セッション変数へ値をセットする
Session("StaffID") = staffid
Session("StaffName") = staffname
Session("AdminFlag") = adminflag

End Sub

Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean
Dim ret As Boolean
Dim strSQL As String
strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _
"WHERE userID = '" & userid.Replace("'", "''") & _
"' AND password = '" & password.Replace("'", "''") & "'"

'接続文字列を取得する
Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString()

'コネクションを定義する
Using connection As New SqlConnection(cnStr)
'コマンドを定義する
Dim command As New SqlCommand(strSQL, connection)
'コネクションを開く
connection.Open()

Try
'コマンドからデータリーダーを定義する
Dim dr As SqlDataReader = command.ExecuteReader
'データリーダーから結果を読み込む
If dr.Read Then
'対象データが存在する場合
'正しいユーザーIDとパスワードが指定されたので、
'データリーダーから読み出したデータをメンバ変数にセットする
staffid = dr("staffID")
staffname = dr("staff_name")
adminflag = dr("admin_flag")
permission = dr("permission")
ret = True
Else
'対象データが存在しない場合
'不正なユーザーIDまたはパスワードが指定された
ret = False
End If
Catch ex As Exception
'例外処理(SQLエラーなど)
ret = False
End Try

'コネクションを閉じる
connection.Close()
End Using

'結果を返して終了する
Return ret
End Function


**************************************************************
ログイン後に行くページでの設定
**************************************************************

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

'[ユーザーID]ボックスにフォーカスをセットする

If Session("StaffID") Is Nothing Then
Response.Redirect("~/top.aspx")
ElseIf Not Session("AdminFlag") = True Then
Response.Redirect("~/top_normal.aspx")

End If

End Sub

asp.netでmssql server を利用してログイン機能を実装しました。
以下のようなコードでmssqlに保存してあるIDとパスが一致すれば
以降の画面ではセッションにID、パスが保存され
page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。
機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。
商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことが...続きを読む

Aベストアンサー

(1) セッションハイジャック対策 

→ フォーム認証(FormsAuthentication)を使う

http://d.hatena.ne.jp/atsukanrock/20100728/1280305074
http://d.hatena.ne.jp/teracc/20100424

(2) SQL インジェクション対策

シングルクォートのエスケープだけでは弱いかも

→SqlParameterCollection を使う

http://msdn.microsoft.com/ja-jp/library/ms998271.aspx


(3)パスワード漏洩対策

パスワードはDB上にハッシュ化(不可逆暗号化)して持つ。

仮に生データが漏れても使用できない。

QVBAで他のプログラムが起動しているか調べる方法

VBAで
D:\test\test.exe
が起動中か調べたいのですが
どのようにすれば良いですか?

http://www.vbalab.net/vbaqa/data/access/log/tree_532.htm

このページの方法を使えば、
exe以外のファイルが使用中かは調べることができたのですが
exeファイルの場合にはうまくいきません。

良い方法があれば教えてください。

Aベストアンサー

残念ながら・・・出来ません。
一応、プロパティの中に Handle ってのがあるのですが
取得できるのは ProcessID の値です。
以前、調べていて Handle を見つけた時は、
『やったー \(^o^)/』と思いましたが
ぬか喜びでした。。。orz

なお、当方の環境は、Windows7 Pro & Office2010 です。

QASPとASP.NETとASP.NET2.0の違い

Web開発初心者です。

帳票をPDF表示するWebアプリケーションを開発することになり、
言語はASPを使用することになりました。

そこで
ASP
ASP.NET
ASP.NET2.0
の違いをご存知の方がいらっしゃいましたら教えていただけますでしょうか。
それぞれIIS以外に必要な実行環境、ツール等も教えていただけると助かります。

不明瞭な箇所がありましたら説明させていただきます。
すいませんがよろしくお願いします。

Aベストアンサー

ASP用のツールは、多分、無いですね・・・
#メモ帳でASPファイルを作成してサーバにコピーとか。

ASP.NET用の開発ツールは、Microsft社製の「VisualStudio」シリーズがあり、
ASP.NET(1.1)は、「VislaStudio 2003」で、
ASP.NET2.0は、「VislaStudio 2005」で開発できます。


「Visual Web Developer 2005 Express Edition 」は、
「Visual Studio 2005」のEditionの1つで、有料のパッケージ版(入門者つき)と無料のダウンロード版があります。
機能的には同じで、無料版だからといって、商用利用の制限等はありません。

(http://www.microsoft.com/japan/msdn/vstudio/express/faq/default.aspx)

「Express Edition を商用目的で使用することはできますか。」

また、「ASP.NET1.1用」の無料の開発ツールとして、3rdパーティ製ですが、
「Web Matrix 」と言うのがあります。

「ASP.NET Web Matrix Project 日本語版」
(http://www.microsoft.com/japan/msdn/asp.net/webmatrix/)

ASP用のツールは、多分、無いですね・・・
#メモ帳でASPファイルを作成してサーバにコピーとか。

ASP.NET用の開発ツールは、Microsft社製の「VisualStudio」シリーズがあり、
ASP.NET(1.1)は、「VislaStudio 2003」で、
ASP.NET2.0は、「VislaStudio 2005」で開発できます。


「Visual Web Developer 2005 Express Edition 」は、
「Visual Studio 2005」のEditionの1つで、有料のパッケージ版(入門者つき)と無料のダウンロード版があります。
機能的には同じで、無料版だからといって、商用利用...続きを読む


人気Q&Aランキング