- - PR -
[ADO.NET]データベースのレコードロックの仕方
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-05-28 16:06
DBのあるテーブルを行ロックしたいのですが、下記のようにFOR UPDATEを指定するとエラーになってしまいます。
何か良い方法はありますでしょうか?? ---------------------- Dim OleDbConnection = New System.Data.OleDb.OleDbConnection() OleDbConnection.ConnectionString = "Provider=MSDAORA.1;Password=XXX;User ID=YYY;Data Source=ZZZ" Dim OleDbCommand = New System.Data.OleDb.OleDbCommand() OleDbCommand.CommandText = "SELECT * FROM TABLE_A WHERE ID = 'AAA' FOR UPDATE" OleDbConnection.Open() Dim reader As OleDb.OleDbDataReader reader = OleDbCommand.ExecuteReader() While reader .Read()←エラー発生。SELECT文のFOR UPDATEを外せば通りますが。。。 ・・・ End While OleDbConnection.Close() |
|
投稿日時: 2003-05-28 16:56
質問の意味を間違って解釈してたら、すみません。
OleDbDataReaderはデータ ソースからデータ行の前方向ストリームを読み取るため、 使用中は、関連付けられた OleDbConnection は、 OleDbDataReader によって使用されるためビジー状態です。 Close メソッドを呼び出すまでこの状態が続きます。 ロック後、更新処理を行うと思いますが、記述どおりロックを行えたとしても、 OleDbCommandによる更新処理が行えません。 ロックを行いたいだけなら、OleDbCommand.ExecuteNonQuery()のみで良いと思います。 データを取得したい場合は、OleDbDataAdapterを介し、DataSet(DataTable )に格納しみては。 サンプルにはトランザクションが記述されていませんが、 OleDbTransaction によるトランザクションを行った方がいいと思います。 |
|
投稿日時: 2003-05-29 17:42
“FOR UPDATE”はOracleの構文だから汎用のADO.Netでは通らないんだと思います。
|
|
投稿日時: 2003-05-29 18:03
回答ありがとうございました!
トランザクションのオブジェクトを追加したらエラーでなくなりました。 データの更新はデータセットから取らないと確かに駄目でした。 --------------------------------- Dim OleDbConnection = New System.Data.OleDb.OleDbConnection() OleDbConnection.ConnectionString = "Provider=MSDAORA.1;Password=XXX;User ID=YYY;Data Source=ZZZ" Dim OleDbCommand = New System.Data.OleDb.OleDbCommand() OleDbCommand.CommandText = "SELECT * FROM TABLE_A WHERE ID = 'AAA' FOR UPDATE" Dim tran As System.Data.OleDb.OleDbTransaction←追加 tran = OleDbConnection.BeginTransaction(IsolationLevel.ReadCommitted)←追加 OleDbCommand.Transaction = tran←追加 OleDbConnection.Open() Dim reader As OleDb.OleDbDataReader reader = OleDbCommand.ExecuteReader() While reader .Read()←FOR UPDATEでレコードロック。 ・・・ End While OleDbConnection.Close() ←レコードロック解除 |
1