• 締切済み

楽観的排他処理のためViewStateに更新日時を保持したいのですが・・・

はじめまして。 今回の質問なのですが、ViewStateに更新日時を保持し、後で、排他処理のため、ストアドプロシージャーで排他処理をしたいと思っています。 とりあえず、Page_Load時に、「ViewState["haita"] = (DateTime)dtTemp.Rows[0]["更新日時"]」という風にdatatableから更新日時を取得します。そして、更新ボタンクリックで 「SqlParameter p11 = cmd.Parameters.Add("@haita",System.Data.SqlDbType.DateTime); p11.Value = ViewState["haita"];」 としてストアドプロシージャーの中で排他処理を行いたいのですが、どうもViewStateでデータの比較ができてないみたいです。 ちなみにストアドの中身は、 CREATE PROCEDURE AA_Table @haita datetime AS SELECT * FROM M_科目マスタ WHERE コースコード=@couse AND 科目コード=@k_kode AND 年度=@nendo AND 年次=@nenji AND 更新日時=@haita IF @@ROWCOUNT<1 BEGIN RETURN(-1) END ELSE BEGIN UPDATE M_科目マスタ SET 科目名 = @k_name, 科目名略称 = @k_ryaku, 科目責任者 = @k_Person, 単位 = @tani, 更新日時 = @up, 更新ユーザー名 = @koushinsya WHERE コースコード = @couse AND 年度 = @nendo AND 年次 = @nenji AND 科目コード = @k_kode RETURN(0) END GO です。 どうやってもRETURN(-1)が返ってきてしまいます。 どなたか、参考になる意見お願いします!

みんなの回答

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.2

ポイントですが、C#の問題というより、 SQL ServerのSQLの問題のような気がしてきました。 # 特に使用データベース製品名が記載されておりませんが、  C#の使用している名前空間とストアドのSQLを見ている限り、  SQL Serverとほぼ断定させて頂きましたが。 また、C#側でストアドの引数@haitaを渡すところは特に問題 なさそうなので、 まず、ストアドを下記のようにしてみてください。 (質問の分類がC#ではなく、SQL Serverの回答となってしまって申し訳ないのですが) CREATE PROCEDURE AA_Table @haita datetime AS declare @cnt int SELECT @cnt = count(*) FROM M_科目マスタ WHERE コースコード=@couse AND 科目コード=@k_kode AND 年度=@nendo AND 年次=@nenji AND 更新日時=@haita IF @cnt < 1 BEGIN RETURN(-1) END ELSE BEGIN UPDATE M_科目マスタ SET 科目名 = @k_name, 科目名略称 = @k_ryaku, 科目責任者 = @k_Person, 単位 = @tani, 更新日時 = @up, 更新ユーザー名 = @koushinsya WHERE コースコード = @couse AND 年度 = @nendo AND 年次 = @nenji AND 科目コード = @k_kode RETURN(0) END GO それでもダメなら、他の問題が考えられるため、別途、ご相談下さい。

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

単純に、 p11.Value = ViewState["haita"]; が、 p11.Value = Convert.ToDateTime(ViewState["haita"]); または、 p11.Value = (DateTime)ViewState["haita"]; または、 p11.Value = ViewState["haita"] as DateTime; がすべき話ではないのでしょうか? また、ViewState["haita"]の内容がNULLでないことをデバッグ 等で確認してみて下さい。 もし、NULLが入っているんであれば、 if ( ViewState["haita"] == null ) で事前チェックが必要な 気がします.....

okwebsama
質問者

補足

やはり駄目でした。 データベースに更新日時を登録する時、というのがおかしいのでしょうか? SqlParameter p9 = cmd.Parameters.Add("@up",System.Data.SqlDbType.DateTime); p9.Value = DateTime.Now;

関連するQ&A