@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

オプティミスティック同時実行制御 を活かしたDB更新 (ASP.NET)

1
投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-02-04 18:50
オプティミスティック同時実行制御なんて舌を噛みそうな機能を
理解しきって使用したい訳ではないのですが・・・・

VS.NETにてデザイナ上にSqlDataAdapterを作成時の
「データアダプタ構成ウィザード」を使用すると、INSERT,UPDATE,DELETE
コマンドを自動生成してくれます。
この自動生成コマンドが、オプティミスティック同時実行制御に準じているもので
ラッキーかなと思いつつ、そのまま利用しようとしているのですが・・・・
涙が出るほど、うまくいきません。
自分でSQLをきる方が、簡単だとは思いつつ
実現まで、頑張ろうとしてます。

前置きが長くてすみません。
SqlUpdateCommand 内のパラメータ渡しがどうしてもエラーになるのです。
 どうかご教授願います

----------自動生成される SQL-----------------
Me.SqlUpdateCommand1.CommandText = "UPDATE 入金伝票_H SET 出納日 = @出納日 " & _
"WHERE (伝票区分 = @Original_伝票区分) AND (伝票番号 = @Original_伝票番号) AND (出納日 = @Original_出納日 OR @Original_出納日 IS NULL AND 出納日 IS NULL); " & _
SELECT 伝票区分, 伝票番号, 出納日 FROM 入金伝票_H WHERE (伝票区分 = @伝票区分) AND (伝票番号 = "@伝票番号)"

Me.SqlUpdateCommand1.Connection = Me.SqlConnection1
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@伝票区分", System.Data.SqlDbType.VarChar, 2, "伝票区分")) ← (1)
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@伝票番号", System.Data.SqlDbType.VarChar, 10, "伝票番号"))
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@出納日", System.Data.SqlDbType.DateTime, 8, "出納日"))
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_伝票区分", System.Data.SqlDbType.VarChar, 2, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "伝票区分", System.Data.DataRowVersion.Original, Nothing))
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_伝票番号", System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "伝票番号", System.Data.DataRowVersion.Original, Nothing))
Me.SqlUpdateCommand1.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_出納日", System.Data.SqlDbType.DateTime, 8, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "出納日", System.Data.DataRowVersion.Original, Nothing))

--------------------------------------------------------

Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.UpdateCommand
Dim txtdenban As Label = GetControl(e.Item.Cells(3), GetType(Label))
Dim txtsuitobi As TextBox = CType(e.Item.Cells(4).Controls(1), TextBox)

With SqlDataAdapter1.UpdateCommand.Parameters ← (2)
.Add("@伝票区分", "1")
.Add("@伝票番号", txtdenban.Text)
.Add("@出納日", CType(txtsuitobi.Text, Date))
End With

SqlConnection1.Open()
SqlDataAdapter1.UpdateCommand.ExecuteNonQuery() ← 実行時にエラー
SqlConnection1.Close()

DataGrid1.EditItemIndex = -1
DataGrid1.DataBind()

End Sub

------------------------------------------------------------
「変数名 '@伝票区分' は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で、重複してはいけません。」
というエラーになります。

Parameters.add ((2))  をコメントにして実行すると
「準備されたステートメント '(@伝票区分 varchar(2),@伝票番号 varchar(10),@出納日 datetime' ではパラメータ @伝票区分 が必要ですが、指定されていません。」
というエラーになります。

パラメータを渡せば、重複だと言われ、渡さないと無いと言われてるように
理解してしまうのですが、エラーの理解が間違ってますでしょうか・・・・

自動生成されている、Parameters.add  ((1))も気にしているのですが・・・

#GetControl() は、先回教えて頂いた、コントロールを検出するためのSUBです
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9048&forum=7

nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-02-04 19:17
オプティミスティックとは関係なさそうですが、エラーとなっている原因はやはり自動生成されたコードで追加されているパラメータと同じ名前のものを自分で追加しているからのような気がします。

自分で追加しようとしているところは、本当は値をセットしたいだけですよね?

(省略).Paramters("@伝票区分").Value = "1"
:
:
なのでは?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2004-02-04 19:35
引用:

noderaさんの書き込み (2004-02-04 19:17) より:

自分で追加しようとしているところは、本当は値をセットしたいだけですよね?

(省略).Paramters("@伝票区分").Value = "1"
:

なのでは?




ありがとうございます (感謝)
うまくいきました
Paramters.add を2回行うのは、おかしいとは解っていつつ
パラメータの値設定は Paramters.add だと、ばかの一つ覚えで・・・
すみません。  ありがとうございました
また一つ賢くなりました。
1

スキルアップ/キャリアアップ(JOB@IT)