- - PR -
[ASP.NET ADO.NET]パラメータクエリでの更新について
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-01 11:09
OS:Windows2000
Server:SQLServer7.0 初めて投稿いたします。 .NET暦2週間で、ただいま開発に向け勉強中なのですが、 更新の部分で行き詰まっています。 パラメータクエリを書籍等を参考にしながら作成し、さらに 同時実行制御を行うため、DBにtimestamp列を設けましたが、 使用法がよくわかりません。 Dim DA As SqlDataAdapter Dim sSQL As String Dim CN As SqlConnection = New SqlConnection("server=XXXXX;database=XXXXX;Trusted_Connection=no;UserID=XXXXX;password=XXXXX;") Dim DS As New DataSet CN.Open() sSQL = "SELECT * FROM MSTTBL" DA = New SqlDataAdapter(sSQL, CN) DA.Fill(DS, "MSTTBL") DS.Tables("MSTTBL").PrimaryKey = New DataColumn() {DS.Tables("MSTTBL").Columns("CODE")} CN.Close() sSQL = sSQL & " UPDATE MSTTBL" sSQL = sSQL & " SET CODE=@CODE_New, KANA=@KANA_New, NAME=@NAME_New, JYUSYO=@JYUSYO_New,TEL=@TEL_New" sSQL = sSQL & " WHERE CODE=@CODE_Org;" sSQL = sSQL & " SELECT TIMESTAMPCol FROM MSTTBL WHERE CODE = @CODE_Refresh" Dim cmd As New SqlCommand(sSQL, CN) Dim pc As SqlParameterCollection = cmd.Parameters pc.Add("@CODE_New", SqlDbType.Char, 4, "CODE") pc.Add("@KANA_New", SqlDbType.Char, 20, "KANA") pc.Add("@NAME_New", SqlDbType.Char, 30, "NAME") pc.Add("@JYUSYO_New", SqlDbType.Char, 30, "JYUSYO") pc.Add("@TEL_New", SqlDbType.Char, 15, "TEL") Dim param As SqlParameter param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE") param.SourceVersion = DataRowVersion.Original pc.Add("@CODE_Refresh", SqlDbType.Char, 4, "CODE") cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord DA.UpdateCommand = cmd 'DATATABLEの値を変更 Dim row As DataRow Dim TBL As DataTable = DS.Tables("MSTTBL") row = TBL.Rows.Find(txtCD.Text) If row Is Nothing Then Else row.BeginEdit() End If row("KANA") = txtKana.Text row("NAME") = txtName.Text row("JYUSYO") = txtJyusyo.Text row("TEL") = txtTel.Text row.EndEdit() DA.Update(TBL) 『'CODE_Org' の近くに無効な構文があります。変数 '@CODE_Org' を宣言する必要があります。変数 '@CODE_Refresh' を宣言する必要があります。』というエラーが出ます。 ・更新は、WHERE句に主キー列(CODE)とtimestap列のみで判断する(実際は列数が多いため) ・更新後、更新したデータのtimestamp列を取得し直す、 ということがしたいのですが、調べてみましたがわかりませんでした。 RowUpdateイベントを利用して更新後のデータを取得する方法というのが書籍に載って いましたが、パフォーマンスがよくないとのことでした。 初歩的な質問かと思いますが、どなたかご教授よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-12-01 11:59
とりあえず'@'が抜けてるようです: param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE") ↓ param = pc.Add("@CODE_Org", SqlDbType.Char, 4, "CODE") | ||||||||||||||||
|
投稿日時: 2005-12-01 13:15
とりあえず、セミコロン「;」があるので1SQLになってないです。 | ||||||||||||||||
|
投稿日時: 2005-12-01 13:22
いや、これは合ってるんだと思いますよ。 | ||||||||||||||||
|
投稿日時: 2005-12-01 15:18
あ!
ということなんですね。 よく読んでなかったです。ごめんなさい。 #単に更新するだけと思ってました…。 | ||||||||||||||||
|
投稿日時: 2005-12-01 17:07
ご指摘ありがとうございます。@が抜けており、@をつけてみると
エラーは出なくなりました。>lalupin4さま が、内容が更新されませんでした。 sSQL = sSQL & " WHERE CODE=@CODE_Org;" の部分を sSQL = sSQL & " WHERE CODE=@CODE_Org" sSQL = sSQL & " AND TIMESTAMPCol=@TIMESTAMPCol_Org;" とし、 param = pc.Add("CODE_Org", SqlDbType.Char, 4, "CODE") param.SourceVersion = DataRowVersion.Original の後ろに param = pc.Add("TIMESTAMPCol_Org", SqlDbType.Binary, 0, "TIMESTAMPCol") param.SourceVersion = DataRowVersion.Original としてみたのですが。。。 また、書籍を参考に記述した下記コードについて 実際どういったことが行われて(起こって)いるのか、お教えいただけませんでしょうか? pc.Add("@CODE_Refresh", SqlDbType.Char, 4, "CODE") cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord ヘルプでは少しわかりづらかったです。 よろしくお願いいたします。 | ||||||||||||||||
|
投稿日時: 2005-12-01 21:37
説明する順番が難しいな。ちょっと待っててね。
| ||||||||||||||||
|
投稿日時: 2005-12-01 22:10
まずは前提を確認しましょう。
1. DataTableは最初のSelect文の結果を保持します。 2. これら
SqlParameter.Add()第4引数を見るに、すべて DataTable内の同じ列(CODE列)を示します。 これらはいずれも新しい値が割り当てられていません。 3. よって
というのは当然の帰結です。厳密には同じ行の同じ列を同じ値で更新されていると考えられます。 |
1|2|3
次のページへ»